Linux:为什么使用性能调控器时CPU频率会波动?

Edd*_*ett 8 linux performance central-processing-unit linux-kernel benchmark

我正在使用 Debian 8 amd64 机器进行基准测试。在实验过程中,我希望 CPU 以固定频率(最好是最大可能)运行。这将排除 CPU 时钟速度作为结果变化的来源。

经过一番阅读,似乎正确的做法是将 CPU 调控器更改为performance,这在 Linux 内核文档中描述:

CPUfreq 调控器“性能”将 CPU 静态设置为 scaling_min_freq 和 scaling_max_freq 边界内的最高频率。

遗憾的是,没有提供有关scaling_min_freq和 的更多详细信息scaling_max_freq。希望这无关紧要,因为使用的 CPU 频率是间隔的最大值。

所以我使用 cpufreq-set 启用了这个调控器:

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
表现
表现
表现
表现

为了更好地衡量,我还在 bios 中禁用了涡轮增压模式:

$ cat /sys/devices/system/cpu/intel_pstate/no_turbo
1

根据以上对性能调节器的描述,我预计 CPU 时钟速度不会出现波动。然而,如果我反复运行cpufreq-info,我会看到时钟速度波动:

$ cpufreq-info | grep '当前 CPU fr'
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 3.99 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 4.00 GHz。
$ cpufreq-info | grep '当前 CPU fr'
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 3.96 GHz。
$ cpufreq-info | grep '当前 CPU fr'
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 3.94 GHz。
$ cpufreq-info | grep '当前 CPU fr'
  当前 CPU 频率为 4.01 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 4.00 GHz。
  当前 CPU 频率为 3.98 GHz。

这种波动是由于硬件、BIOS、内核还是其他一些因素造成的?有没有办法设置 CPU 频率,使其根本不会波动?

Edd*_*ett 9

经过一些实验,我想我可以回答我自己的问题。

正如该线程中所述,在某些 Intel 硬件上,有两种方法可以管理 CPU 频率:

  • 使用 pstate。
  • 使用常规 ACPI。

使用pstate时,BIOS对时钟速度有一定的发言权,似乎这就是波动的来源。

您可以通过附加intel_pstate=disable到内核​​参数来强制关闭 pstate (编辑/etc/default/grub并将 arg 添加到GRUB_CMDLINE_LINUX_DEFAULT. finally run sudo update-grub)。

这样做之后,输出cpufreq-info看起来大不相同,而且我还注意到一组不同的 CPU 调控器变得可用(例如ondemand现在可用)。

最重要的是,在将performance调控器设置为 后,时钟速度现在是固定的(在我的情况下为 4.00GHz)。

您可以查看/sys/devices/system/cpu/cpu*/cpufreq/scaling_driver以确定是否使用 pstate 或 ACPI 来扩展 CPU。这些文件可以采用值acpi-cpufreqintel_pstate.


Sav*_*btz 5

对于当代英特尔处理器,频率由处理器本身控制,软件暴露的 P 状态与性能水平相关。 对于英特尔酷睿处理器来说,频率可以设置为单一频率的想法 是虚构的。即使缩放驱动程序选择单个 P 状态,处理器运行的实际频率也是由处理器本身选择的。[1]

[1] https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt