如何让perf显示缓存缺失百分比?含原始计数器与内核配置问题
针对Intel Xeon E5-1650 v4(Broadwell)上perf缓存事件问题的解决方案
问题1:让perf基于加载数自动计算缺失百分比
可以通过两种方式实现:
- 手动计算+awk脚本批量处理:先运行你已经在用的指定原始事件的perf命令,比如:
接着用awk提取输出中的数值并计算百分比,示例脚本如下(把括号内的内容替换成你实际用的事件代码/描述):perf stat -e [你的L1加载事件],[你的L1缺失事件],[你的LLC加载事件],[你的LLC缺失事件] ./your_programperf stat -e rXXX,rYYY,rZZZ,rWWW ./your_program 2>&1 | awk ' /rXXX/ {l1_load=$1} /rYYY/ {l1_miss=$1; printf("L1-icache miss rate: %.2f%%\n", (l1_miss/l1_load)*100)} /rZZZ/ {llc_load=$1} /rWWW/ {llc_miss=$1; printf("LLC miss rate: %.2f%%\n", (llc_miss/llc_load)*100)} ' - 自定义事件别名简化输入:在
~/.perfconfig里添加别名,避免每次输入长串原始代码:
之后用别名运行perf,再配合上述awk脚本计算百分比即可。[events] l1_icache_loads = [你的L1加载事件代码] l1_icache_misses = [你的L1缺失事件代码] llc_loads = [你的LLC加载事件代码] llc_load_misses = [你的LLC缺失事件代码]
问题2:编译/配置perf使其自动支持Broadwell缓存事件并显示百分比
Broadwell的缓存事件在新版perf中是原生支持的,出现<not supported>大概率是系统自带的perf版本过旧,或者内核perf事件子系统配置不全,解决步骤如下:
- 检查版本匹配度:
运行perf --version和uname -r,如果perf版本远低于内核版本(比如内核是5.x但perf是3.x),直接更新perf即可。 - 编译对应版本的perf工具(无需编译整个内核):
- 下载与当前内核版本一致的内核源码包
- 进入源码目录的
tools/perf文件夹 - 安装编译依赖(比如Debian系的
libelf-dev、libdw-dev,RHEL系的elfutils-libelf-devel、elfutils-devel) - 运行
make编译,完成后会生成perf二进制文件 - 替换系统中的旧perf:
sudo cp perf /usr/bin/perf
- 验证内核配置(仅当自行编译内核时需要):
确保内核编译时开启了以下选项:CONFIG_PERF_EVENTS=y:启用perf事件子系统CONFIG_X86_PERF_EVENTS=y:支持x86架构的perf事件CONFIG_PERF_EVENTS_INTEL=y:启用Intel处理器的perf事件支持
- 测试自动支持:
编译完成后直接运行标准事件名的perf命令,此时perf会自动识别事件并显示缺失百分比:perf stat -e L1-icache-loads,L1-icache-load-misses,LLC-loads,LLC-load-misses ./your_program
内容的提问来源于stack exchange,提问作者TemplateRex
相关产品推荐
相关产品推荐

