我正在运行一些基准。 我的基准跑步者监视实验之间的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:
- 如何删除CentOS 6上的旧内核(释放启动分区)?
- 奇怪:为什么在最后的ping回复后,linux响应ping请求呢?
- 将增加net.core.somaxconn有所作为?
- 可以高负载导致服务器挂起和错误“封锁超过120秒”?
- 在Linux中禁用交换的最佳方法
向内核提示应该允许使用多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的内核,但我不认为这是可能的。 该选项似乎不可切换:
编辑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内核。