调高或调低vm.dirty_ratio和vm.dirty_background_ratio不能自动平衡,关键在于使后台刷盘节奏匹配写入节奏;需先通过/proc/meminfo、pidstat、iostat等验证是否为脏页瓶颈,再按存储类型(ssd/nvme、hdd、混合)设合理基础值,并配合dirty_writeback_centisecs、dirty_expire_centisecs、swappiness协同优化,最后验证效果。

直接调高或调低 vm.dirty_ratio 和 vm.dirty_background_ratio 并不能自动“平衡”,关键在于让后台刷盘节奏跟得上你的写入节奏,避免脏页在内存中堆积到触发阻塞。
先确认是不是这两个参数在拖慢你
别凭感觉调参,先看证据:
- 运行
grep -i dirty /proc/meminfo,算出Dirty:占MemAvailable:的百分比。如果长期接近或超过vm.dirty_ratio值,就是它在卡你 - 用
pidstat -d 1或ps aux | grep " D "查看是否有大量进程处于 D(不可中断睡眠)状态,同时iostat -x 1显示await持续高于 5ms、%util接近 100%,基本锁定是脏页刷盘瓶颈 - 检查
cat /proc/vmstat | grep pgpgout:如果pgpgout(每秒写出页数)长时间为 0 或剧烈波动,说明后台刷盘没跟上,或者压根没启动
按存储类型选基础值
默认值(通常 dirty_background_ratio=10,dirty_ratio=20)是为桌面环境设计的,服务器场景必须重设:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
SSD 或 NVMe:延迟低、IOPS 高,适合早刷、勤刷。推荐
vm.dirty_background_ratio=5,vm.dirty_ratio=10 -
HDD:随机写性能差,宁可让应用稍等,也不让内核攒一堆再硬刷。推荐
vm.dirty_background_ratio=3,vm.dirty_ratio=10 -
混合负载(如 K8s 节点):折中起步,设为
vm.dirty_background_ratio=10,vm.dirty_ratio=15,后续再根据实际 I/O 表现微调
注意:dirty_background_ratio 必须严格小于 dirty_ratio,否则内核会静默忽略并恢复默认值。
配合其他参数一起调才真正生效
只改这两个就像只踩油门不调档位——容易熄火或爆缸:
-
vm.dirty_writeback_centisecs=100(即 1 秒唤醒一次后台刷盘线程):加快脏页消化频率,避免积压。HDD 场景可放宽到 300(3 秒),避免过度抢占 I/O -
vm.dirty_expire_centisecs=1500(即 15 秒):强制老化脏页尽快落地,防止某次写入后脏页“赖”在内存里太久。对数据库类服务可进一步缩到 1000(10 秒) -
vm.swappiness=1:强烈建议同步设置,抑制 swap,避免脏页和 swap page 抢同一块内存资源,尤其在内存压力大时能显著减少抖动
临时改完要验证,永久改完要落地
执行命令只是临时生效:
- 临时修改:
sysctl -w vm.dirty_background_ratio=5&&sysctl -w vm.dirty_ratio=10 - 确认已加载:
sysctl vm.dirty_background_ratio vm.dirty_ratio,输出应与你设置一致 - 永久生效:把两行写入
/etc/sysctl.conf,再执行sysctl -p - 改完不是结束,而是开始观察:持续盯 5–10 分钟的
pidstat -d 1和iostat -x 1,看 D 状态是否消失、await是否回落、pgpgout是否稳定输出










