关于perf record与perf stat样本计数差异及采样异常的技术咨询
perf record -c 事件计数误差的核心原因
结合你在树莓派5B上的测试数据,perf record估算值与perf stat真值的偏差主要来自以下几个方面:
1. 内核采样上限强制限制采样频率
你观察到-c 10和-c 100的样本数均被限制在100万,这是因为内核通过perf_event_max_sample_rate参数限制了每秒最大采样次数,同时perf_event_mlock_kb会限制采样缓存的大小,避免高频采样导致系统过载。
当你设置的采样周期过小(比如-c 10),理论采样频率会远超过内核限制,此时perf会自动增大实际采样周期,强制将总样本数控制在阈值内。以你的数据为例,真值是92亿次L1D加载,若样本数被限在100万,实际采样周期约为9205171526 / 1000000 ≈ 9205,远大于你设置的10或100,用设置值乘以样本数自然会得到远低于真值的估算结果。
2. 采样中断的延迟与计数丢失
perf record的采样原理是PMU事件计数达到指定周期时触发中断,但中断响应存在延迟:
- 中断触发后,CPU需要先完成当前指令流的原子操作,这段时间内的PMU事件不会被计入采样间隔;
- 在ARM Cortex-A76(树莓派5B的CPU)上,中断优先级调度特性可能进一步放大延迟,导致采样点之间的实际事件数大于设置的
-c值,最终估算值会低于真值。
3. 采样开销导致的执行路径变化
perf record的采样中断会带来额外的系统开销,当采样频率极高(比如-c 10)时,中断处理的时间占比会显著增加,甚至改变程序的实际执行路径——比如循环的执行时间被拉长,PMU事件计数的分布也会变化。而perf stat是纯硬件计数,无采样开销,这也是两者数值差异的重要原因。
4. ARM平台PMU的硬件特性限制
树莓派5B的Cortex-A76 PMU存在以下特性:
- 部分事件计数存在微小的硬件误差,虽然单事件追踪时影响不大,但累积后会产生显著偏差;
- 采样触发的中断会临时占用PMU资源,导致短时间内的事件计数丢失。
你的测试数据对应分析
| 参数设置 | 估算值 | 样本数 | 偏差原因 |
|---|---|---|---|
-c 10 | 14,859,150 | 100万 | 触发采样上限,实际周期被放大 |
-c 100 | 153,300,100 | 100万 | 同上 |
-c 10000 | 6,608,030,000 | 66万 | 未触发上限,但存在中断延迟和硬件计数偏差 |
验证与调整方法
- 查看当前采样限制:
sysctl kernel.perf_event_max_sample_rate,默认值通常为100000(每秒10万次采样),若你的程序运行10秒左右,总样本数就会被限制在100万; - 临时提高采样限制:
sysctl -w kernel.perf_event_max_sample_rate=1000000,再测试-c 10,观察样本数是否增加、估算值是否更接近真值; - 调整采样缓存大小:
sysctl -w kernel.perf_event_mlock_kb=8192(根据内存情况调整),避免缓存溢出导致的样本数限制。
你使用的矩阵列读取代码:
for (j = 0; j < N; ++j) { for (i = 0; i < M; ++i) { sum += matrix[i][j]; } }
内容的提问来源于stack exchange,提问作者ysay dong
相关产品推荐
相关产品推荐

