欢迎光临
我们一直在努力

vm.dirty_ratio / dirty_background_ratio 写脏页过多导致写入卡顿的调优

RackNerd Leaderboard Banner RackNerd Leaderboard Banner

vm.dirty_ratio和vm.dirty_background_ratio引发写入卡顿是因为脏页占比超阈值时,前者导致write()阻塞,后者触发后台刷盘;当磁盘吞吐不足,脏页持续堆积至vm.dirty_ratio,所有写操作被内核阻塞等待刷盘。

vm.dirty_ratiovm.dirty_background_ratio 会引发写入卡顿

Linux 内核用这两个参数控制脏页(dirty page)的刷盘节奏:vm.dirty_background_ratio 是后台回写启动阈值(比如设为 10,表示脏页占内存 10% 时内核线程 bdflush 开始异步刷盘),vm.dirty_ratio 是阻塞式写入上限(比如 30,表示脏页达 30% 时所有新 write() 调用会被阻塞,直到脏页回落)。卡顿往往发生在后者被频繁触达——应用拼命写文件,但磁盘吞吐跟不上,脏页越堆越多,最终所有写操作在内核层排队等待刷盘。

如何判断是不是这两个参数导致的卡顿

别猜,直接看实时状态:

  • 运行 cat /proc/vmstat | grep -E "pgpgout|pgpgin|pgmajfault",如果 pgpgout(页写出量)长时间停滞或剧烈抖动,配合写入延迟升高,就是脏页机制在干预
  • 检查当前脏页占比:grep -i dirty /proc/meminfo,重点关注 Dirty:MemAvailable:,算出实际百分比是否贴近 vm.dirty_ratio
  • 观察写入进程状态:ps aux --sort=-%cpu | headpidstat -d 1,若大量进程处于 D(uninterruptible sleep)状态,且 I/O wt 高,基本可锁定

vm.dirty_background_ratiovm.dirty_ratio 的安全调优范围

默认值(通常是 10 和 20)适合通用桌面,但对高吞吐写入场景(如数据库、日志服务、容器镜像构建)过于保守。调优不是盲目拉高,而要匹配你的磁盘能力:

下载即用!可以免费使用的AI图像处理工具,致力于为用户提供最先进的AI图像处理技术,让图像编辑变得简单高效。

  • SSD 场景:可设为 vm.dirty_background_ratio=5vm.dirty_ratio=15——SSD 延迟低,早一点触发后台刷,避免单次堆积太多
  • HDD 场景:建议 vm.dirty_background_ratio=3vm.dirty_ratio=10——机械盘顺序写尚可,随机刷脏页极易拖慢,宁可让应用稍等,也别让内核攒一堆再硬扛
  • 注意:两个值必须满足 vm.dirty_background_ratio ,否则内核会静默忽略并恢复默认
  • 临时生效:sysctl -w vm.dirty_background_ratio=5;永久写入 /etc/sysctl.conf 后需 sysctl -p

比改参数更关键的协同配置

单独调这两个值治标不治本。真正稳定的写入表现依赖三者协同:

  • vm.dirty_expire_centisecs(默认 3000,即 30 秒):脏页产生后最多“躺平”多久就必须被刷。写入突发强时,建议压到 1500(15 秒),防止旧脏页滞留太久挤占新写空间
  • vm.dirty_writeback_centisecs(默认 500,即 5 秒):后台刷盘线程的唤醒间隔。HDD 上可放宽到 1000 减少唤醒开销;SSD 上保持默认或缩到 300 加快响应
  • 务必确认 vm.swappiness 不是 0——设为 0 会导致内核在内存压力下完全不回收 file cache,反而加剧脏页堆积。推荐值为 110

这些参数之间有隐含依赖:调高 dirty_ratio 却不缩短 dirty_expire_centisecs,等于允许脏页“又多又老”,卡顿可能更顽固。

RackNerd Leaderboard Banner
未经允许不得转载:国外主机测评 » vm.dirty_ratio / dirty_background_ratio 写脏页过多导致写入卡顿的调优