I
Member
swap 一会儿用一会儿空,比一直占着 swap 更难查。一直占着多半是内存真的不够,抖动则往往是某个进程周期性冲高,或者水位和限额配得不合理。
我的排查顺序是:第一,看是谁在冲。用 sar 和 /proc/meminfo 对齐时间点,看 swap 抖动时刻是不是和某个定时任务、备份或日志切割重合。第二,看水位。vm.swappiness 设得高,内核会提前把不活跃页换出,业务低峰时看着没事,高峰一来就抖。第三,看 cgroup。容器或 systemd 单元的 memory.max 设得比宿主机水位还紧,进程在限额边缘反复触发回收,swap 曲线就会锯齿状。
处理上分三档:定时任务导致的,错峰或加内存上限;水位导致的,把 swappiness 往低调,并确认是不是有进程长期占着不活跃内存;限额导致的,先放宽限额看曲线是否平滑,再决定是加内存还是拆服务。直接关 swap 是最省事但最掩耳盗铃的做法,抖动背后的内存压力还在。
大家遇到 swap 抖动时,第一步一般是先看进程,还是先看内核参数?
我的排查顺序是:第一,看是谁在冲。用 sar 和 /proc/meminfo 对齐时间点,看 swap 抖动时刻是不是和某个定时任务、备份或日志切割重合。第二,看水位。vm.swappiness 设得高,内核会提前把不活跃页换出,业务低峰时看着没事,高峰一来就抖。第三,看 cgroup。容器或 systemd 单元的 memory.max 设得比宿主机水位还紧,进程在限额边缘反复触发回收,swap 曲线就会锯齿状。
处理上分三档:定时任务导致的,错峰或加内存上限;水位导致的,把 swappiness 往低调,并确认是不是有进程长期占着不活跃内存;限额导致的,先放宽限额看曲线是否平滑,再决定是加内存还是拆服务。直接关 swap 是最省事但最掩耳盗铃的做法,抖动背后的内存压力还在。
大家遇到 swap 抖动时,第一步一般是先看进程,还是先看内核参数?