直接查看 /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: 可能持续几十秒甚至几分钟。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 常见误判:执行
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 有用得多。










