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

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

我使用 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/设备/系统/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 频率,使其完全不波动?

答案1

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

如上所述在此主题中在某些 Intel 硬件上,有两种方法可以管理 CPU 频率:

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

当使用 pstate 时,BIOS 对时钟速度有一定的影响,这似乎是波动的根源。

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

完成此操作后,输出cpufreq-info看起来大不相同,并且我还注意到一组不同的 CPU 调节器变得可用(例如ondemand现在可用)。

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

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

答案2

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

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

答案3

我读这个帖子是因为我太想为我的 CPU 设置一个固定频率了,因为风扇不再工作了(当然,当你在国外一个失落的岛屿潜水休闲时,这些事情就会发生!)所以我的观点是设置最低频率(800Mhz)..我终于成功地改变了 /sys/devices/system/cpu/cpu*/cpufreq/ 中每个 CPU 的 scaling_max_freq,现在频率应该从 800Mhz 移动到....800Mhz 了。它起作用了,解决了我遇到的过热问题..(频率现在是 799Mhz,没有移动,这使得 CPU 保持在 50°C 左右!)

PS:我还禁用了 turbo 模式 (3,1Ghz)

相关内容