如何在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打开,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%以上。 …