linux - 如何更改 perf_event_open 最大采样率

标签 linux perf

我正在使用 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_nmi_handler

现在,一旦它计算出处理中断的时间,它就会调用另一个函数(在该函数中它将中断处理时间作为参数传递),它会尝试检查和比较当前的 perf_event_max_sample_rate处理中断所需的时间。如果它发现中断花费了足够长的时间并且同时生成的样本非常频繁,那么 CPU 显然无法跟上,因为中断工作开始排队,您会观察到一些CPU 节流。如果您查看下面的函数,总会尝试减少样本

阅读下面的函数来理解:-

perf_event_sample_took

当然,正如 Zulan 所建议的,您可以尝试将其设置为 0,但是您会从 perf 获得相同的最大样本数并进一步损害 CPU,不可能增加最大样本数除非你想出其他方法(比如尽可能调整缓冲区)。

关于linux - 如何更改 perf_event_open 最大采样率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48457273/

相关文章:

c# - 哪个平台可以将 C# 应用程序移植到 Linux?

c - 在系统启动时在 Yocto MiniDisplay 上打印

java - 通过 Runtime.exec() 执行时命令失败,但在 Raspberry Pi (Linux) 上手动执行时命令有效

linux - 如何使用公钥加密openssl中的大文件

linux - Raspberry PI Node EventEmitter 内存泄漏

linux - 在 linux 中定期读取性能计数器

linux - 了解 Perf 工具输出

linux - 使用 Babeltrace 构建 Perf(用于 Perf 到 CTF 的转换)失败,未定义对 bt_ctf_validate_identifier 的引用

profiling - perf.data 文件没有样本

linux - perf 工具能否提供在 VM 中调用的系统调用列表?