看到可用内存不多,有人手工清了缓存,结果接下来半小时数据库查询全面变慢,磁盘读明显上升。

把日志和配置对完,能解释这个现象的基本就这几处。页缓存被清空后热点数据要重新从磁盘读。另一种情况是缓存本来就该占满空闲内存,这不是浪费。

不容易想到的是,清缓存并没有解决真正的内存不足。

动手时先看真实的可用内存

free -h

接着确认缓存回收是否正常

grep -E 'Cached|MemAvailable' /proc/meminfo

定位真正吃内存的进程

ps -eo pid,rss,comm --sort=-rss | head

等前面都确认过,再按需限制服务内存

systemctl set-property app.service MemoryMax=2G

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

改完先别撤,确认这几项。业务延迟回到正常水平,可用内存维持稳定,不再需要人工清缓存。

补一句。清缓存只是把问题挪到下一分钟,命中率下降带来的抖动比省下的内存代价大得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189