我正在运行一些基准测试。我的基准测试运行程序会监控实验之间的dmesg缓冲区,寻找可能影响性能的任何内容。今天它抛出了这个:
[2015-08-17 10:20:14警告] dmesg似乎已更改!差异如下: --- 2015-08-17 09:55:00 +++ 2015-08-17 10:20:14 @@ -825,3 +825,4 @@ [3.802206] [drm]启用RC6状态:RC6打开,RC6p关闭,RC6pp关闭 [7.900533] r8169 0000:06:00.0 eth0:链接 [7.900541] IPv6:ADDRCONF(NETDEV_CHANGE):eth0:链接已准备就绪 + [236832.221937] perf中断花费的时间太长(2504> 2500),将kernel.perf_event_max_sample_rate降低为50000
经过一番搜索,我现在知道这与Linux内核中称为“ perf”的性能分析子系统有关。我认为我们不需要这个,所以我想完全禁用它。
再次搜索,发现sysctl perf_cpu_time_max_percent
可以提供帮助。这里有人建议通过将其设置为0来禁用它。在这里阅读更多内容:
perf_cpu_time_max_percent:
提示内核应将多少CPU时间用于处理性能采样事件。如果性能子系统被告知其采样数已超过此限制,它将降低其采样频率以尝试减少其CPU使用率。
在NMI中会进行一些性能采样。如果这些样本出乎意料地花费太长时间执行,则NMI可能会紧挨在一起堆叠在一起,以致其他任何东西都不允许执行。
0:禁用该机制。无论花费多少CPU时间,都不要监视或校正perf的采样率。
1-100:尝试将perf的采样率限制为该CPU百分比。注意:内核会计算每个样本事件的“预期”长度。这里的100表示预期长度的100%。即使将其设置为100,如果超过此长度,您仍可能会看到样品节流。如果您确实不关心消耗了多少CPU,则设置为0。
在我看来,这听起来像0,意味着不再检查分析采样率,但是freq子系统保持运行状态(?)。
谁能阐明如何使用freq完全禁用内核性能分析?
编辑:有人建议我尝试在没有性能的情况下构建内核,但是我什至认为这是不可能的。该选项似乎不可切换:
EDIT2:经过更多阅读后,我决定可以将其设置kernel.perf_event_max_sample_rate
为零。即每秒没有样本。但是,您也不能做到这一点(source):
提交02f98e3e36da106338b7c732fed516420fb20e2a 作者:纳特·彼得森(Knut Petersen) 日期:2013年9月25日星期三14:29:37 +0200 perf:将1强制为perf_event_max_sample_rate的下限
编辑3:FWIW perf_cpu_time_max_percent
设置为25,这意味着内核花费了其硬件采样时间的25%以上。这对于基准测试机是不可接受的。
我现在确定将其设置perf_cpu_time_max_percent
为零只会使情况恶化,因为内核将继续使用其25%以上的时间读取硬件寄存器。该错误会触发以调整采样率,从而尝试确保内核满足其配额(使用小于25%的时间作为perf)。25%仍然太高恕我直言。
如果我真的不能禁用性能,则最好的折衷办法可能是设置perf_event_max_sample_rate
为1。
EDIT4:一位朋友建议我可能对的含义有误解perf_cpu_time_max_percent
,因此上述说法可能不正确。值25表示内核使用了为服务性能中断保留的任意长度的25%以上。
编辑5:
如注释中所指出,-*-
对perf选项的使用表明该功能是由另一个启用的功能强制启用的。如果我查看help
,它会显示以下功能:
我认为我不能在这里赢球。布尔公式selected by
说
如果您的目标是X86,或者...
我刚刚检查了X86_64的定位确实可以启用CONFIG_X86
。这样看来,一旦您瞄准X86或X86_64,您就会获得性能。
因此,我想将我的问题稍微更改为:
我可以使用哪些性能设置来最小化内核在性能例程中所花费的时间?
请记住,总体目标是控制基准的随机变化源。如果无法禁用性能,如何最大程度地减少对基准的影响?
CONFIG_HAVE_PERF_EVENTS=y
和CONFIG_PERF_EVENTS=y
。我不认为这是残疾人行为。
-*-
确实表示某些子系统取决于perf模块。Help
显示了需要禁用以将选项更改为[*]
或的依赖关系树[M]
。