/proc/meminfo文件中的Dirty:和Writeback:两行——单位是kB,一目了然。Dirty表示已修改但尚未写回磁盘的字节数,Writeback则表示内核正在刷入磁盘的数据量。相比之下,vmstat -sm虽然也能查看,但其dirty列是页数,需要乘以4096换算,且刷新间隔较长,对瞬态高峰不够敏感。很多人误以为执行sync就能让Dirty归零,实际上sync仅仅触发刷盘请求,并不阻塞等待完成,真正应该关注的是Writeback是否降为零。此外,当Dirty比例超过vm.dirty_ratio时,内核会主动阻塞新写入——这不是错误,而是系统施加的背压机制。

怎么看当前 Dirty 字节数和 Writeback 状态
最直接的方式是查看 /proc/meminfo 中的 Dirty: 和 Writeback: 行,单位均为 kB。这是最准确且对系统资源影响最小的做法。需要特别注意的是,虽然字段名对大小写不敏感,但固定为 Dirty: 和 Writeback:,执行 cat /proc/meminfo | grep -i dirty 即可获取结果。
Dirty::表示已修改但尚未开始写回磁盘的页面总字节数。Writeback::表示内核正在提交IO、正往磁盘写入的数据量。- 不要只扫一眼——脏页可能在查看的瞬间被刷走,当
Writeback:非零时,Dirty:下降是正常现象。
vmstat -sm 能不能替代 /proc/meminfo
可以查看,但精度和语义存在差异。需要提醒的是:vmstat -sm 的 dirty 列显示的是“待刷页数”(page 数),而非字节数;而 /proc/meminfo 直接给出真实字节数,更加直观可靠。
vmstat -sm输出的dirty列是 page count(默认 4KB/page),需要乘以 4096 才能换算成字节,容易导致误判。vmstat默认刷新间隔较长(例如 1 秒),对瞬态高峰不够敏感;而/proc/meminfo提供即时快照。- 在监控脚本中,建议使用
grep -oP 'Dirty:\s*\K\d+'直接提取数值,避免解析整行时出错。
为什么 sync 后 Dirty 不归零
sync 仅触发刷盘请求,不会阻塞等待完成。内核会根据 vm.dirty_ratio、vm.dirty_background_ratio 以及设备吞吐能力分批调度 IO,尤其是在 SSD 写放大或 HDD 随机写场景下,Writeback: 可能持续几十秒甚至几分钟。因此,看到 sync 后 Dirty: 几乎不变时不必慌张,这属于正常现象,并不代表失败。
- 判断是否刷完,应轮询
Writeback:是否降到 0,而不是紧盯Dirty:。 - 在高负载下强行等待
Dirty:归零可能卡住业务,更稳妥的做法是使用ionice -c 3 sync降低刷盘优先级。
Dirty 比例超阈值会怎样
当 Dirty: 字节数 ≥ MemTotal × vm.dirty_ratio / 100 时,内核会阻塞新写入(write() 系统调用被卡住),直到脏页回落到 vm.dirty_background_ratio 以下。请注意,这不是系统出错的信号,而是背压机制——系统在主动踩刹车。
- 查询阈值:运行
sysctl vm.dirty_ratio vm.dirty_background_ratio。 - 计算临界值:例如
MemTotal: 131755760 kB,vm.dirty_ratio = 20时,临界点 ≈ 26.3 GB。 - 如果
Dirty:长期维持在临界值 80% 以上,说明后台刷盘跟不上写入节奏,需要检查IO负载或调整参数。 - 在 SSD 上盲目调高
vm.dirty_ratio可能导致突发写入时卡顿加剧,并非越大胆越好。
实际观察脏页行为时,关键不在于“有没有”,而在于“涨得快不快、落得慢不慢、卡不卡写”。/proc/meminfo 中的那两行数字,需要结合 vmstat 1 的 bi(块入)和 bo(块出)列一起查看,才能看清全貌。
