Linux怎么查看系统内存的脏数据量
要排查Linux系统的脏页问题,最精准、开销最小的手段莫过于直接读取/proc/meminfo文件中的Dirty:和Writeback:两行——单位是kB,简单明了。Dirty代表已经修改但尚未写回磁盘的字节数,Writeback则代表正在被内核刷入磁盘的数据量。相比之下,vmstat -sm虽然也
/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(块出)列一起看,才看得清全貌。


































