系统内存频繁换页会引发明显抖动,需通过调低vm.swappiness、收紧脏页参数、限制进程内存三方面切断触发链,而非简单加内存。

系统内存频繁换页(即持续发生 pgmajfault、si/so 非零、swap used 上升)会引发明显抖动:响应延迟跳变、应用超时集中、%si 异常升高。这不是单纯“加内存”能解决的问题,关键在于切断换页触发链——既要缓解物理内存压力,也要抑制内核过早或过度启用 swap。
看准信号:先确认是不是真在换页抖动
别只盯着 free -h 的 used。真正需要关注的是:
-
available是否持续低于总内存的 5%~10%(例如 8G 内存下 vmstat 1中si(swap in)和so(swap out)是否每秒 > 0 且波动频繁cat /proc/vmstat | grep "pgmajfault"是否稳定在每秒几十甚至上百次swapon -s或free -h显示Swap的used持续增长,而非长期为 0
堵住源头:降低 swap 触发倾向
Linux 默认 vm.swappiness=60,意味着只要 free + cache 不足 40%,就可能开始换页。对多数服务型服务器,这个值偏高:
- 临时调整:
sudo sysctl vm.swappiness=10 - 永久生效:在
/etc/sysctl.conf中添加vm.swappiness=10,再运行sysctl -p - 极端情况(如数据库、缓存服务)可设为
1或0(设为 0 时仅在 OOM 前才换页)
收紧脏页:防止回写阻塞引发连锁换页
大量脏页堆积会触发强制同步,拖慢 I/O,间接加剧内存紧张。调整以下参数可让内核更主动、更平滑地刷盘:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
vm.dirty_background_ratio=5:脏页达总内存 5% 就启动后台回写(默认 10) -
vm.dirty_ratio=10:脏页达 10% 才阻塞新写入(默认 20),避免突发写入卡死 -
vm.dirty_expire_centisecs=2000:脏页最多存 20 秒(默认 30 秒),加快释放
这些值适合中小规模业务;若为高吞吐日志或视频写入场景,可适当调高 dirty_ratio,但需搭配 SSD 和足够带宽。
管住进程:限制内存无序扩张
换页抖动往往由某个进程内存泄漏或配置失当引发。排查后应立即干预:
- 用
top按M排序,查%MEM和RES异常高的进程 - 对 Java 应用,检查
jstat -gcutil <pid></pid>,确认老年代是否持续增长且 GC 失效 - 用
cgroups v2限制关键服务内存上限:sudo mkdir /sys/fs/cgroup/limit-webecho "2G" > /sys/fs/cgroup/limit-web/memory.maxsudo cgexec -g memory:limit-web ./start-web.sh
不复杂但容易忽略










