Perf使用 杂记

1.文档

1.man+perf -h

遇到新工具当然最好的方式是读文档,但是网络上找半天也没有找到很好的perf手册,最后发现在GPT的指引下,最好的手册害得是linux man手册。

上手最快最全面的方式:help+man

首先perf -h查看各条子命令基本功能。

image-20250726185036124

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

image-20250726185058470

踩坑案例:

折腾半天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.文章与优化案例

https://www.brendangregg.com/

https://weedge.github.io/perf-book-cn/zh/chapters/3-CPU-Microarchitecture/3-8_Modern_CPU_design_cn.html

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.内存访问控制是单向的,读写混合的内存往往需要内存切换。导致内存带宽更难打满。


本站由 Zane Jiang 使用 Stellar 1.33.1 主题创建,一款很棒的 Hexo 主题!

总访问 次 || 本页访问
总访客 人 || 本页访客