一台 16G 的 CentOS 7.9 跑日志分析,free -m 里 buff/cache 占了 14G,可用内存只剩 800M,监控平台连续告警内存使用率 90%,业务本身没有明显变慢。

真正麻烦的地方在于,几个原因的现象几乎一样。Linux 会把空闲内存拿来做页缓存,这部分随时可以回收;free 的 used 列没算 cache,监控脚本按 used 算就会误报;大量顺序读把缓存堆起来,缓存命中率高说明是好事;确实有进程在持续读文件,同时 available 也在下降。

先看 available 而不是 used

free -m && grep -E 'MemAvailable|Cached' /proc/meminfo

再往下确认缓存是不是可回收的

grep -E 'Active\(file\)|Inactive\(file\)' /proc/meminfo

接着按需释放缓存做一次对比

sync && echo 3 > /proc/sys/vm/drop_caches

末了看释放后多久又涨回来

vmstat 1 10 && sar -r 1 5

那几天正好在做别的变更,先把时间线对齐才敢动手。

恢复的判定其实很直接。MemAvailable 保持在 2G 以上,监控改成按 available 计算后不再误报,业务读写延迟没有变化。

提醒一点。线上别把 drop_caches 写进定时任务,缓存被清掉后热点数据要重新从磁盘读,性能会明显下降。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189