如何在Linux内核中禁用perf子系统?

我正在运行一些基准。 我的基准跑步者监视实验之间的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开启,RC6pclosures,RC6ppclosures
  [7.900533] r8169 0000:06:00.0 eth0:连结
  [7.900541] IPv6:ADDRCONF(NETDEV_CHANGE):eth0:链接已准备就绪
 perf [236832.221937] perf中断时间过长(2504> 2500),将kernel.perf_event_max_sample_rate降至50000

经过一番search之后,我现在知道这涉及到linux内核中称为“perf”的剖析子系统。 我不认为我们需要这个,所以我想完全禁用它。

再次search,我发现sysctl perf_cpu_time_max_percent可以帮助。 这里有人build议通过将其设置为0来禁用它。在这里阅读更多:

perf_cpu_time_max_percent:

向内核提示应该允许使用多lessCPU时间来处理perf采样事件。 如果perf子系统被告知其样本超过此限制,则会降低其采样频率以尝试降低其CPU使用率。

一些perf抽样发生在NMI中。 如果这些样本意外花费太长的时间执行,那么NMI可能会彼此紧挨在一起,以至于没有其他的东西可以执行。

0:禁用该机制。 不pipeCPU占用多less时间,都不要监视或纠正每个采样率。

1-100:尝试将perf的采样率调整到这个百分比的CPU。 注意:内核计算每个样本事件的“预期”长度。 这里的100意味着100%的预期长度。 即使设置为100,如果超过此长度,仍可能会看到样品限制。 设置为0,如果你真的不在乎多lessCPU消耗。

这对我来说听起来像0意味着分析采样率不再检查,但freq子系统保持运行(?)。

任何人都可以阐明如何彻底禁用与freq内核分析?

编辑:有人build议我尝试build立一个没有perf的内核,但我不认为这是可能的。 该选项似乎不可切换:

menuconfig的

编辑2:更多的阅读后,我决定我可以设置kernel.perf_event_max_sample_rate为零。 即每秒没有采样。 但是,你不能这样做( 来源 ):

提交02f98e3e36da106338b7c732fed516420fb20e2a
作者:Knut Petersen 
date:Wed Sep 25 14:29:37 2013 +0200

 perf:强制执行1作为perf_event_max_sample_rate的下限

编辑3:FWIW, perf_cpu_time_max_percent设置为25,这意味着内核花费超过25%的时间采样硬件寄存器。 这是基准testing机器无法接受的。

我现在确定将perf_cpu_time_max_percent设置为零只会使情况恶化,因为内核将继续使用超过25%的时间读取硬件寄存器。 这个错误引发了调整采样率的问题,因此试图确保内核满足其使用率<25%的时间。 恕我直言,25%仍然过高。

如果我真的不能禁用perf,可能最好的办法是将perf_event_max_sample_rate设置为1。

编辑4:朋友build议我可能曲解了perf_cpu_time_max_percent的意思,所以上面的语句可能是不正确的。 值为25表示内核使用超过其为服务性能中断保留的任意长度的25%。

EDIT5:

正如在注释中指出的那样,对照perf选项的-*-表示该function被另一个启用的function所强制。 如果我寻求help ,它说这些function是:

帮帮我

我不认为我能赢在这里。 由布尔公式selected by

如果你的目标是X86,或者…

我刚刚检查过,确定目标X86_64确实启用了CONFIG_X86 。 所以看来,只要你瞄准X86或X86_64,你会得到性能。

所以我想稍微改变我的问题:

我可以使用哪种perf设置来最小化内核在perf例程中花费的时间?

请记住,总体目标是控制基准的随机变化的来源。 如果我不能禁用perf,我怎样才能最小化它对基准的影响?

禁用[HAVE_PERF_EVENTS]内核选项并重新编译Linux内核。