Linux中sar不直接提供“磁盘写缓存命中率”,但可通过组合-b、-r、-d参数的pgpgout/s、kbcached、wr_sec/s等指标,结合脏页回写行为与I/O效率变化间接评估写缓存利用效率。

Linux 中 sar 本身不直接提供“磁盘写缓存命中率”这一指标,因为它不是内核暴露的原始计数器,也没有标准字段如 write_cache_hit%。但你可以通过组合 sar 的内存与 I/O 数据,结合内核缓存机制逻辑,间接推断写缓存的利用效率。关键在于理解:Linux 的页缓存(page cache)会暂存待写数据(writeback),配合 dirty_* 参数和 pdflush/writeback 行为,而“写缓存命中”实际体现为——本该落盘的写请求,被延迟合并并高效刷出,从而减少实际物理写次数、降低 %util 和 await。
以下是实用、可操作的分析路径:
查看与写缓存强相关的 sar 指标
运行以下命令获取历史数据(需确保 sysstat 已启用且有历史记录):
sar -b -r -d 10 6 # 每10秒采样6次,同时看I/O、内存、磁盘
重点关注三类字段:
-
-b输出中的pgpgin/s、pgpgout/s、pgmajfault/s-
pgpgout/s:每秒从内存写出到块设备的千字节数(含脏页回写) -
pgpgin/s:每秒从块设备读入内存的千字节数
→ 若pgpgout/s显著高于应用层写量(如dd或iostat -x的wr_sec/s),说明页缓存正在批量刷脏页,是缓存有效工作的信号。
-
-
-r输出中的kbmemfree、kbbuffers、kbcached、kbcommit-
kbcached:页缓存大小(不含 buffers) -
kbcommit:承诺内存总量(含 dirty 内存预估) - 关注
kbcached是否稳定在高位,且kbcommit未持续逼近kbmemused→ 表明系统有足够缓存空间容纳待写数据,减少强制同步写。
-
-
-d输出中的tps、wr_sec/s、await、%util-
wr_sec/s:设备每秒真实写入扇区数(经缓存后落地的量) -
await:I/O 请求平均等待时间(毫秒) -
%util:设备忙时占比
→ 若wr_sec/s较低但pgpgout/s很高,说明写被缓存合并;若await和%util偏低,表明缓存降低了随机小写压力。
-
判断写缓存是否高效工作的典型特征
- 同一负载下,相比禁用缓存(如
echo 3 > /proc/sys/vm/drop_caches后压测),-d中的tps和%util明显更低,而-b中pgpgout/s更平稳 → 缓存合并效果好 -
vmstat 1中观察si(swap in)接近 0,so(swap out)也低,但bi(blocks in)高、bo(blocks out)呈脉冲式高峰 → 典型 writeback 行为 -
/proc/sys/vm/dirty_ratio和dirty_background_ratio设置合理(如 20 和 10),且cat /proc/sys/vm/dirty_pages_ratio长期低于 background 值 → 脏页控制得当,无突发刷盘
补充验证:结合 /proc/vmstat 和 /sys/kernel/debug/btrfs(如适用)
对 ext4/xfs 等通用文件系统,可查:
grep -E "pgpgout|pgpgin|pgmajfault|pgpgout" /proc/vmstat # 对比两次采样差值,计算单位时间写回量
对 Btrfs,还可看:
cat /sys/fs/btrfs/*/stats # 查看压缩写、cache hit 等(仅限 Btrfs)
但注意:这不是 sar 范畴,属文件系统层扩展。
不复杂但容易忽略


















