Perf使用 杂记
1.文档
1.man+perf -h
遇到新工具当然最好的方式是读文档,但是网络上找半天也没有找到很好的perf手册,最后发现在GPT的指引下,最好的手册害得是linux man手册。
上手最快最全面的方式:help+man
首先perf -h查看各条子命令基本功能。

在使用子命令时 man perf-record、man perf-script查看各条子命令的详细功能。

踩坑案例:
折腾半天
perf record记录的L3 miss,perf script查看对应的结果,发现里面有一些地址,和程序malloc时的地址进行匹配发现都没有访问程序malloc的位置,最后发现其中的地址是ip而不是访问的内存地址。几番查找资料无果,最后发现perf record中使用-d参数才会显示addr
2.event
查看各个事件的详细描述,在intel 官方的事件库中查找对应的事件功能
https://perfmon-events.intel.com/index.html?pltfrm=skylake_server.html
offcore和uncore的区别:
uncore 指的是 CPU die 上不属于 core pipeline 的所有模块:
包括:
LLC(L3 cache / CBo)
IMC(内存控制器)
UPI/QPI(socket 间互联)
CHA(cache/home agent)
offcore:不是一个硬件单元,而是core PMU 中的一种“请求分类过滤机制,统计从 core 发出的 memory request。
3.文章与优化案例
2.踩坑杂记
perf事件冲突: 可能某些事件单独使用可以使用,但是放在一起有事件就检测不到
perf事件源:
事件探索: 带宽
首先?我们说内存带宽,是访存瞬间读取的数据量,那么这个带宽包含LLC吗?怎么算出来的?和什么有关系?
在PCM中,带宽计算的方式是IMC中发送读写指令CAS的次数,所以这个带宽其实和LLC miss是没有关系的。
采集方式如下:
uncore IMC CAS events
1 | sudo $PERF stat -I 500 -x, --per-socket -e uncore_imc/cas_count_read/,uncore_imc/cas_count_write/ -a -o "${output_file}" & |
次数*64Byte则获得对应的带宽
带宽的影响因素:
![[Pasted image 20260409154037.png]]
主要原因:
1.读是单纯的读,但是写的话可能会有缓存一致性控制、发送RFO读请求、写回(受到buffer)限制。
2.内存访问控制是单向的,读写混合的内存往往需要内存切换。导致内存带宽更难打满。