dirty_ratio是内核强制回写的硬性水位线,达限时阻塞写操作以防oom,并非缓存优化参数;仅在大块顺序写且观察到刷盘阻塞时才考虑微调,默认值20已足够健壮。

Dirty\_Ratio 是什么,它真能“优化写缓存”吗?
dirty_ratio 并不是缓存优化开关,而是内核强制回写(writeback)的硬性水位线。当脏页(被修改但未写入磁盘的内存页)占系统总内存比例达到该值时,所有新产生的写操作会被阻塞,直到部分脏页被刷到磁盘。它本质是**防 OOM 的安全阀**,不是性能调优参数。
盲目调高 dirty_ratio 容易导致进程卡死(尤其是同步写场景),调低又可能引发过于频繁的小量刷盘,增加 I/O 开销。真正影响写吞吐和延迟的是 dirty_background_ratio 和 dirty_expire_centisecs 的组合。
哪些场景下调整 dirty_ratio 才有意义?
仅在以下明确可复现的问题中考虑微调:
- 应用持续大块顺序写(如日志归档、数据库 bulk load),且观察到
echo 1 > /proc/sys/vm/drop_caches后性能突降——说明脏页积压触发了阻塞式刷盘 -
vmstat 1中长期出现bi(块设备输入)值剧烈脉冲,同时wa(I/O wait)占比高,且pgpgin/pgpgout显示脏页回收不平滑 - 确认磁盘本身无瓶颈(
iostat -x 1中%util未持续 100%,await稳定)
否则,默认值(通常 20,即 20%)已足够健壮。不要为“理论吞吐提升”去动它。
怎么安全地查看和修改 dirty_ratio?
修改前必须确认当前值和生效范围:
查看当前值:
cat /proc/sys/vm/dirty_ratio
临时修改(重启失效):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
echo 25 > /proc/sys/vm/dirty_ratio
永久修改(写入 /etc/sysctl.conf):
vm.dirty_ratio = 25
注意:
- 值必须是整数,单位是百分比(不是字节或页数)
- 不能高于
dirty_background_ratio + 5,否则内核会静默忽略(见mm/vmscan.c中的 check_dirty_memory()) - 若使用 cgroups v2,
memory.pressure和io.weight对脏页行为的影响远大于全局dirty_ratio
比 dirty_ratio 更关键的三个参数
真正决定写缓存行为节奏的是这三个:
dirty_background_ratio:后台异步刷盘启动阈值(默认 10)。建议设为 dirty_ratio - 5,保证后台有缓冲空间。
dirty_expire_centisecs:脏页“过期时间”,单位厘秒(默认 3000 = 30 秒)。对延迟敏感服务(如实时交易)可降至 1000–1500;对吞吐优先场景(如备份)可放宽至 6000。
dirty_writeback_centisecs:内核线程 flush 的唤醒间隔(默认 500 = 5 秒)。值越小,刷盘越频繁但粒度越小;增大可减少唤醒开销,但单次刷盘量可能上升。
这些参数需协同调整,单独改 dirty_ratio 几乎不会带来可测收益。实际调优时,先用 perf record -e 'sched:sched_stat_sleep' -g 抓写阻塞栈,再决定动哪条线。










