我使用perf_event_open来获取样本。我试图让每个人都受到重视。但是perf_event_open还不够快。我尝试使用以下命令更改采样率:
echo 10000000 > /proc/sys/kernel/perf_event_max_sample_rate
但看起来我设定的值太大了。运行我的代码后,perf_event_max_sample_rate将更改回较低的值,例如12500.当我尝试更改更大的值(例如20000000,50000000等)时,样本速度不会随着值I更改而增加。有没有办法更快地更改perf_event_open采样速度?
答案 0 :(得分:3)
这是一种限制perf引起的开销的机制。您可以通过设置
来禁用它sysctl -w kernel.perf_cpu_time_max_percent=0
使用风险自负 - 系统可能会停止响应。
https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
perf_cpu_time_max_percent:
向内核提示应该允许使用多少CPU时间 处理性能采样事件。如果通知perf子系统 它的样品超过这个限制,它将减少其取样 尝试降低CPU使用率的频率。
在NMI中发生了一些性能抽样。如果这些样品出乎意料 执行时间太长,NMI可能会堆叠在每个NMI旁边 其他很多东西都不允许执行。
0:禁用机制。不要监视或纠正性能 采样率,无论CPU时间如何。
1-100:尝试将perf的采样率限制在此百分比 中央处理器。注意:内核计算每个的“预期”长度 样品事件。这里100表示预期长度的100%。甚至 如果将其设置为100,则可能仍会看到样本限制 超过长度。如果你真的不在乎多少CPU,设置为0 被消耗了。
答案 1 :(得分:3)
实际上无法将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 throttling
。如果您查看以下函数,将始终尝试减少样本
阅读以下功能以了解: -
当然,正如Zulan建议的那样,你可以尝试将其设为0,但是你会从perf
获得相同的最大样本数并进一步损害CPU,除非你想到,否则不可能增加最大值用其他方法(如果可能的话调整缓冲区)。