前段时间客户上了一个监控,然后经常性的提示内存预警free -m total used free shared buff/cache availableMem: 32000 30000 200 50 9800 15000Swap: 8192 0 8192
很多人看到free 只有200M了,然后想着完了,主机内存已经耗尽,于是开始重启服务、清理缓存,甚至怀疑服务器配置太低,准备扩容了。然后内存扩上去之后,运行一段时间又这样了。
但实际上,大多数情况下:你的内存很健康。
Linux 为什么总是把内存用满?
Linux 内核有一个重要设计理念:
空闲内存就是浪费。
内存的读写速度远远快于磁盘。
对于 Linux 来说,如果有大量内存闲置,不如拿来缓存磁盘中的数据。
这就是:
Page Cache(页缓存)
当程序读取文件时:
Linux 会把文件内容放入内存缓存。
下一次再访问这个文件,数据可能直接从内存读取。速度提升可能达到:
因此:Linux 会主动把空闲内存变成缓存。
这正是你看到free 很少的根本原因。实际上这些内存随时可以回收。
Linux 的内存到底分哪几类?
我们可以简单理解为:
类型 | 说明 |
|---|
Used | 真正被应用程序占用 |
Free | 完全未使用 |
Buffers | 块设备缓冲 |
Cached | 文件系统缓存 |
Available | 应用可立即使用的内存 |
很多人只关注free 这个值,我们还碰到有人部署了监控,然后内存经常告警,一致以为内存不足。
实际上更应该关注Available,当前系统还能给应用程序提供多少内存而不触发 Swap。
如何判断服务器是否真的缺内存?
正常情况,我们通过
显示:
free 很少available 很多swap 基本不变
这种情况:
完全正常。
危险情况
出现以下现象:
1 Available 接近 0
说明真正可用内存已经很少。
2 Swap 持续增加
发现:
不断增长。
说明系统正在频繁换页。
甚至触发了OOM killer
查看
如果出现:
Out of memoryKilled process xxx
说明系统已经严重缺内存。
Linux 开始强制杀进程。
那么我们应该怎么监控linux 的内存呢 ?
不通linux 可能方案不通,centos 7.4 可以通过
cat /proc/meminfo MemTotal: 8174996 kBMemFree: 2290864 kBMemAvailable: 4276412 kB
这里给出两个命令,计算内存使用率的。
# 直接输出内存使用率百分比awk '/MemAvailable/ {avail=$2} /MemTotal/ {total=$2} END {printf "%.1f%%\n", (total-avail)/total*100}' /proc/meminfo# 带 swap 使用率一起输出awk '/MemAvailable/ {ma=$2} /MemTotal/ {mt=$2} /SwapFree/ {sf=$2} /SwapTotal/ {st=$2} END {printf "Mem: %.1f%% | Swap: %.1f%%\n", (mt-ma)/mt*100, (st-sf)/st*100}' /proc/meminfo