linux无现成缓存命中率实时图表命令,需用perf采集page-faults与major-faults差值计算,并结合slabtop和/proc/meminfo分析dentry/inode缓存健康度,再用watch+awk实现简易趋势观察。

Linux没有现成的缓存命中率实时图表命令
Linux内核本身不提供直接输出「缓存命中率」百分比的接口,/proc/slabinfo、/proc/meminfo 或 vmstat 都只给原始计数(如 pgpgin/pgpgout、pgmajfault),命中率得靠你自己算。所谓“动态走势”,本质是周期性采集 + 差值计算 + 可视化,不是开个命令就出折线图。
用 perf 抓 page cache 命中/未命中事件最准
perf 能直接跟踪内核级缓存行为,比从 /proc 猜更可靠。关键事件是:page-faults(总缺页)、major-faults(必须读磁盘的缺页)——两者差值 ≈ page cache 命中次数。
-
perf stat -e 'page-faults,major-faults' -I 1000 -- sleep 10:每秒采样一次,持续 10 秒,输出表格形式的原始计数 - 命中率粗算公式:
(page-faults - major-faults) / page-faults * 100(注意分母为 0 时跳过) - 别用
perf record长期跑——它写磁盘开销大,会干扰你要测的缓存行为
用 slabtop 和 /proc/meminfo 辅助判断 dentry/inode 缓存健康度
page cache 是块设备层,但文件系统层还有 dentry 和 inode 缓存,它们影响路径查找和元数据访问效率。它们不计入 page cache 统计,但实际业务中常是瓶颈。
-
slabtop -o | grep -E '^(dentry|inode)':看活跃对象数与总分配数比值,比值长期 >90% 表示缓存压力大 -
grep -E '^(SReclaimable|Cached|Buffers)' /proc/meminfo:SReclaimable是 slab 可回收部分(含 dentry/inode),Cached是 page cache 主体 - 如果
Cached很高但SReclaimable持续偏低,说明文件访问局部性差,dentry 缓存反复失效
简单绘图:用 watch + awk 实时打印命中率趋势
不需要装 gnuplot 或 Prometheus,几行 shell 就能滚动观察变化:
watch -n 1 'echo $(date +%H:%M:%S) $(awk \'
NR==1{pf1=$2; mf1=$3}
NR==2{pf2=$2; mf2=$3; hit=int((pf2-pf1-(mf2-mf1))/(pf2-pf1)*100); print hit"%"}\' <p>说明:这里用 <code>pgpgin</code> 和 <code>pgpgout</code> 差值近似 I/O 请求量,再结合 <code>pgmajfault</code> 推算——虽然不如 <code>perf</code> 精确,但无额外依赖,适合快速排查。</p><p>真正麻烦的是时间对齐和事件归因:同一秒内多个子系统(page cache、dentry、buffer cache、swap)都在争内存,命中率数字跳变时,光看一个指标容易误判。得配合 <code>pidstat -r</code> 看谁在疯狂 alloc,再查 <code>/proc/PID/status</code> 的 <code>MMUPageSize</code> 和 <code>MMUHugePageSize</code> 才能定位是不是大页没配好导致的假性未命中。</p>











