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