Linux无内置实时缓存命中率走势图命令,但可用cachestat(page cache)或perf(CPU缓存)配合gnuplot/vtplot实现:cachestat 1 | awk '{print NR,$5}' | gnuplot -e "set terminal dumb; plot '-' with lines"。

Linux 没有内置的「实时走势图」命令直接画出缓存命中率曲线,但你可以用 perf 或 cachestat 配合轻量级轮询 + 终端绘图工具(如 gnuplot 或 vtplot)实现近似效果。关键不是“有没有现成图表命令”,而是怎么把离散采样点串成趋势——这需要你自己控制采样节奏和数据格式。
用 cachestat 实时输出缓存全局命中率(推荐起点)
cachestat 是最接近“动态视图”需求的工具:它每秒输出一行统计,包含读/写 hit/miss 次数,可直接 pipe 给绘图或滚动查看。
- 必须先安装
bcc-tools(Ubuntu/Debian):sudo apt install bcc-tools;CentOS 需启用 elrepo + kernel-devel - 运行:
cachestat 1 0(每 1 秒刷新,无限次)——输出类似:2345 123 678 45 98.2%,最后一列就是整体缓存命中率 - 注意:
cachestat统计的是 page cache(文件系统缓存),不是 CPU L1/L2/L3 缓存;它不区分 CPU 核心,只反映内核 VFS 层缓存效率 - 容易踩的坑:
cachestat依赖 eBPF,若内核 bpf 功能会报错Failed to load program: Permission denied
用 perf stat 轮询采集 CPU 缓存事件(针对 LLC/L1 等硬件级)
如果你关心的是 CPU 最后一级缓存(LLC)或 L1 数据缓存的实际命中率,perf stat 是唯一可靠来源,但它默认不支持“连续流式输出”,需手动轮询。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 基础命令:
perf stat -e LLC-loads,LLC-load-misses -C 7 -I 1000 -- sleep 1(每秒采样一次 CPU7 的 LLC 加载事件) -
-I 1000表示间隔 1000ms 输出一次统计,但注意:每次采样实际耗时 >1s(含启动开销),高频采样(如 - 输出是文本块,需提取数字:
perf stat -e LLC-loads,LLC-load-misses -C 7 -I 1000 -- sleep 5 2>&1 | grep -E '^[0-9]+[[:space:]]+[0-9]+' | awk '{print $1,$2,($2/$1)*100}'可算出每轮命中率 - 别用
-a全局采样:不同核心缓存行为差异大,混在一起会掩盖热点问题;固定-C N才有意义
把数字变成走势图:终端里快速可视化
不需要 GUI,用 gnuplot 或 vtplot 就能在终端里看到线条走势——重点是让数据按时间戳对齐。
- 最简方案(滚动文本):
cachestat 1 | awk '{print NR, $5}' | gnuplot -e "set terminal dumb; plot '-' with lines"(每行显示序号和命中率,实时画线) - 更稳的做法:先写日志再绘图:
while true; do echo "$(date +%s),$(cachestat 1 1 | tail -1 | awk '{print $5}')" >> cache.log; sleep 1; done,然后用gnuplot读取 CSV -
vtplot更轻量(无依赖):pip install vtplot,然后cachestat 1 | awk '{print $5}' | vtplot -m 100(维持最近 100 个点的滚动图) - 警告:所有绘图工具都依赖标准输入流式输入;如果某次采样超时或返回空行,
awk提取会失败,导致图表断点——加2>/dev/null过滤错误输出很必要
为什么 top/htop/vmstat 不能看缓存命中率
这些工具显示的是内存总量、swap 使用、CPU 时间片占比,它们根本不接触缓存计数器硬件寄存器,也没有内核 tracepoint 支持。你看到的 buff/cache 字段只是内存占用大小,不是访问频次,无法推导命中率。
-
free -h的buff/cache是静态容量,不是动态命中指标 -
vmstat -s | grep cache输出的是历史累计值(如123456789 pages cached),没有时间维度,没法算率 -
sar -r的kbcached同样是快照值,且单位是 KB,不是事件次数 - 真正能算“率”的,必须是两个同维度计数器的比值(如
LLC-load-misses / LLC-loads),只有perf和cachestat提供原始分子分母
最终要记住:缓存命中率本身是个瞬时比率,不是状态值;任何“走势图”都是对离散采样的拟合。采样间隔太短(5s)会漏掉尖峰——根据你的 workload 特性选 1~2 秒最稳妥。另外,LLC 命中率通常比 L1 低 10~20%,别拿 L1 的 95% 去对标 LLC 的 70% 说“缓存坏了”。

















