看到可用内存不多,有人手工清了缓存,结果接下来半小时数据库查询全面变慢,磁盘读明显上升。
把日志和配置对完,能解释这个现象的基本就这几处。页缓存被清空后热点数据要重新从磁盘读。另一种情况是缓存本来就该占满空闲内存,这不是浪费。
不容易想到的是,清缓存并没有解决真正的内存不足。
动手时先看真实的可用内存
free -h
接着确认缓存回收是否正常
grep -E 'Cached|MemAvailable' /proc/meminfo
定位真正吃内存的进程
ps -eo pid,rss,comm --sort=-rss | head
等前面都确认过,再按需限制服务内存
systemctl set-property app.service MemoryMax=2G
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
改完先别撤,确认这几项。业务延迟回到正常水平,可用内存维持稳定,不再需要人工清缓存。
补一句。清缓存只是把问题挪到下一分钟,命中率下降带来的抖动比省下的内存代价大得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。