同一程序同一采样频率下不同perf事件的样本量差异原因咨询
为什么不同perf事件的样本量差异这么大?
这是个非常典型的perf使用误解,我来给你理清楚背后的逻辑:
首先你得明白:perf record里的-F(采样频率)参数,针对硬件事件的时候,并不是固定时间间隔采样——它的逻辑是「每发生N次目标事件,就触发一次采样」,而N是perf根据你指定的期望频率动态计算出来的。
举个具体例子对应你的场景:
- 你的工作负载跑65ms,统计cycles时拿到1000个样本,说明perf估算要达到「每秒约15384次采样」(1000 / 0.065 ≈ 15k),于是它会计算出「每多少个cycle触发一次采样」(比如如果你的CPU是3GHz,那每秒3e9个cycle,3e9 / 15k ≈ 195000个cycle采一次)。因为cycle是CPU最基础的事件,每秒几十亿次发生,所以这个N值能被频繁触发,最终样本量接近你期望的数量。
- 而统计cache misses时,perf同样想达到每秒15k次采样的目标,于是它会估算你的工作负载每秒大概有多少次cache miss,然后算出对应的N值(比如假设估算每秒有22.5M次cache miss,那22.5M /15k =1500,也就是每1500次cache miss采一次)。但实际运行中,你的工作负载的cache miss总次数只有150*1500=225万次,远少于cycle的总数,所以触发采样的次数自然就只有150次了。
简单来说:
- cycle这类事件的发生频率极高,几乎和CPU时钟同步,所以只要你指定了采样频率,样本量会非常接近预期
- cache miss这类事件属于“不常发生”的硬件事件,它的总发生次数本身就远低于cycle,所以即使期望采样频率相同,实际能触发的采样次数也会少很多
如果想要真正的固定时间间隔采样(不管事件类型,样本量一致),你可以指定cpu-clock事件,比如:
perf record -F 15000 -e cpu-clock ./your_workload
这个事件是基于时间的,每到指定时间间隔就采样,这时不管你换什么其他时间类事件,样本量都会差不多。
内容的提问来源于stack exchange,提问作者user3527764
相关产品推荐
相关产品推荐

