我正在使用 perf_event_open 获取样本。我试着让每个人都说到点子上。但是 perf_event_open 不够快。我尝试使用以下命令更改采样率:
echo 10000000 > /proc/sys/kernel/perf_event_max_sample_rate
但是看起来我设置的值太大了。运行我的代码后,perf_event_max_sample_rate 变回较低的值,例如 12500。当我尝试更改更大的值时,例如 20000000、50000000 等,采样速度不会随着我更改的值而增加。有什么方法可以更快地改变 perf_event_open 采样速度吗?
最佳答案
确实不可能将 perf_event_max_sample_rate
增加到超过某个值。
我尝试将其增加到 100,000
以上,例如 200,000
或更多。每次我这样做时,最大采样率总是下降到146,500 次采样/秒 或更低。如果我没记错的话,这是我可以达到的最大值(即 146,500 个样本/秒)。这当然取决于您使用的机器类型和 CPU 频率等。我正在研究 Intel Xeon v-5 Broadwell CPU。
Zulan 提出了一个很好的观点。为了让你的理解更清楚,perf样本收集是基于中断的。每次采样计数器溢出时,perf
都会引发 NM(不可屏蔽)中断。该中断同时会计算实际处理整个中断过程所花费的时间。您可以在下面的内核代码中看到这一点:-
现在,一旦它计算出处理中断的时间,它就会调用另一个函数(在该函数中它将中断处理时间作为参数传递),它会尝试检查和比较当前的 perf_event_max_sample_rate
处理中断所需的时间。如果它发现中断花费了足够长的时间并且同时生成的样本非常频繁,那么 CPU 显然无法跟上,因为中断工作开始排队,您会观察到一些CPU 节流
。如果您查看下面的函数,总会尝试减少样本
阅读下面的函数来理解:-
当然,正如 Zulan 所建议的,您可以尝试将其设置为 0,但是您会从 perf
获得相同的最大样本数并进一步损害 CPU,不可能增加最大样本数除非你想出其他方法(比如尽可能调整缓冲区)。
关于linux - 如何更改 perf_event_open 最大采样率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48457273/