先把当时的情况摆出来。进程列表里 kswapd0 长期占着接近一个核,业务响应变慢,可用内存所剩无几,交换分区也在缓慢使用。
排查方向其实有限,先把可能性排一排。物理内存长期不足,内核不停回收页缓存。少数情况下是单个服务的内存使用没有上限。
还有一种情况,透明大页配置不当加重了回收压力。
上来先确认回收压力
vmstat 1 5
然后找占用内存最多的进程
ps -eo pid,rss,comm --sort=-rss | head
限制服务内存上限
systemctl set-property app.service MemoryMax=3G
评估是否需要扩容
free -h && grep MemAvailable /proc/meminfo
这次没动代码,只在配置和运行环境上找原因。
隔了一天再看,现象没变,说明不是偶发。
怎么算真的好了,看的是同一批现象。内核回收线程占用降到个位数,可用内存回到三成以上,业务延迟恢复。
提醒一点。这个线程高就是内存不够的明确信号,调参数只能拖延;该扩内存或者砍服务的时候别犹豫。这类问题最好一次改到位,反复小改反而容易把原因搅混。