腾讯云 CVM 上 Ubuntu 22.04 八 G 内存,监控里 si 和 so 每秒三万多,free 的 available 还剩两 G,kswapd0 常驻百分之三十 CPU,Java 接口 P99 从八十毫秒涨到六百毫秒,重启服务只能缓十分钟。
一开始怀疑是「某个 cgroup 的 memory.high 设得比 max 低太多,回收比全局启动得更频繁」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。透明大页开着,khugepaged 把零散页合并又拆分,换进换出的量被放大好几倍。也可能是有进程用 mmap 反复读写一个八 G 的日志文件,页缓存被挤到 swap 里来回搬。
另外,NUMA 上两个节点一边内存满一边空,跨节点的页被优先挑出来回收。
上来先看换入换出到底有多频繁
vmstat 1 5 | tail -3
再往下按进程统计各自用了多少 swap
for p in /proc/[0-9]*; do awk '/VmSwap/ {if ($2>10240) print $2, FILENAME}' $p/status 2>/dev/null; done | sort -rn | head
然后关掉透明大页再观察一轮
echo never > /sys/kernel/mm/transparent_hugepage/enabled
末了看哪个 cgroup 在频繁回收
systemd-cgtop -m -b -n 1 | head -10
别只看报错消失,验证要多做一步。vmstat 里 si 和 so 回到个位数,kswapd0 的 CPU 占用降到百分之五以下,接口 P99 回到一百毫秒以内并且维持半天不反弹。
容易忽略的是,透明大页关掉只是临时手段,重启就恢复,要写进 tuned 配置或者 unit 的 ExecStartPre;swap 抖动多半是内存规划的问题,加内存比调参数直接得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。
