直接查看 /proc/meminfo 中的 Dirty:(待写回脏页,单位 kB)和 Writeback:(正在写回的字节数)可实时掌握脏页状态;Writeback 降为 0 才表示本轮刷盘基本完成,而非仅看 Dirty 是否减少。

怎么看当前 Dirty 页大小和 Writeback 进度
直接看 /proc/meminfo 最快,但要注意字段含义和单位:
-
Dirty:是待写回磁盘的脏页总字节数,单位是kB(不是 MB),比如Dirty: 124560 kB≈ 122 MB -
Writeback:是当前正在提交 IO 写回的脏页字节数,它下降到 0 才代表这次刷盘动作基本完成 - 别只盯
Dirty:—— 它可能因新写入而边刷边涨;真正反映“是否还在扛压”的是Writeback:是否持续非零
实时观察命令:
watch -n 1 "cat /proc/meminfo | grep -E '^(Dirty|Writeback):'"
为什么 sync 后 Dirty 不归零,是不是没生效
不是没生效,是 sync 只发请求、不等结果。内核按策略分批提交 IO,尤其在慢盘或高负载下,Writeback: 可能持续几十秒甚至几分钟。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 常见误判:执行
sync后立刻cat /proc/meminfo,发现Dirty:几乎没变 → 其实是刷写还没开始或刚起步 - 监控脚本若用 “
sync && sleep 1 && check Dirty” 判断是否清完 → 结果必然不可靠 - 更稳妥的做法是轮询
Writeback:是否降为 0,或搭配ionice -c 3 sync降低刷盘优先级,避免干扰业务 IO
怎么算 Dirty 阈值是否快被击穿
阈值不是按 MemTotal 算的,而是基于 MemAvailable(可用内存 + 可回收缓存),公式是:Dirty 阈值(KB) = MemAvailable × vm.dirty_ratio / 100
- 查当前值:
sysctl vm.dirty_ratio或cat /proc/sys/vm/dirty_ratio - 查可用内存:
cat /proc/meminfo | grep MemAvailable - 例如
MemAvailable: 24602012 kB、vm.dirty_ratio = 60→ 阈值 ≈ 14.1 GB - 当
Dirty:持续接近这个值,写入进程就会被阻塞(进入pdflush等待路径),表现为应用卡顿、延迟飙升
drop_caches 能不能清脏页
不能。echo 3 > /proc/sys/vm/drop_caches 只清理 PageCache、dentries 和 inodes,对脏页完全无效。
- 执行后
Dirty:不变,甚至可能因缓存释放导致后续写入更快变脏 - 真要清脏页只有两种方式:等内核自动刷(依赖
vm.dirty_expire_centisecs,默认 3000 = 30 秒)、或触发同步写(sync+ 等Writeback:归零) - SSD 上盲目调高
vm.dirty_ratio并不更稳——写放大、延迟毛刺、突然卡顿的风险反而上升
脏页问题的核心从来不是“怎么清”,而是“怎么让写入节奏和回写能力匹配”。盯着 Writeback: 和 vmstat -s 里的 pgpgout/pswpout,比反复 sync 有用得多。

















