升级到 18.04 后,cpufreq 会同时扩展所有 CPU,而不是单独扩展

升级到 18.04 后,cpufreq 会同时扩展所有 CPU,而不是单独扩展

我有一台英特尔 i7-6900K,8 核/16 超线程。

我的桌面上运行着 conky,它显示了 8 个硬件核心时钟频率。在升级到 18.04(从 16.04)之前,每个核心都单独缩放,“按需”策略似乎运行良好,核心在负载下加速到涡轮速度(例如,单个线程努力工作),而其他核心保持节流。在 18.04 下,核心似乎并行增加和减少。

18.04 中可用的策略是“性能”和“按需”。启用“性能”策略(升级后的默认策略)后,所有核心都保持在 3.2Ghz 的基本频率以上,大约在 3.45-3.53Ghz 之间。我可以通过 systemctl 启用服务并重新启动来启用“按需”策略。但随后所有核心都保持在 2.5Ghz 左右的水平,即使在持续负载下,也没有一个核心能够完全扩展。

在 16.04 下,核心保持在相对较低的时钟速度,然后在负载下几乎立即扩大。

现在的情况相当混乱,因为网上的很多文档不适用于较新的处理器和/或较新的内核。更令人困惑的是,人们可以使用 ACPI 来控制 CPU 时钟频率。

是否有任何指南包含以下全部或部分信息:

  • Linux 中的哪些处理器应该被哪些扩展方法覆盖?
  • 有哪些可用的机制(cpufreq、ACPI、均无、其他)
  • 如何准确读取当前 CPU 速度。例如,有人可能认为“cat /sys/devices/system/cpu/cpufreq/policy*/scaling_cur_freq”是准确的,但文档说它可能不准确:

“在大多数情况下,这是缩放驱动程序使用其提供的缩放接口从硬件请求的最后一个 P 状态的频率,它可能反映也可能不反映 CPU 实际运行的频率(由于硬件设计和其他限制)”

感谢您的帮助。我会尝试仔细检查并记录我收集的所有信息,然后将其发布到某个地方。

答案1

对于您的处理器来说,最重要的是处理器封装中只有一个锁相环 (PLL - 它可以调高或调低 CPU 时钟频率)。因此,CPU 总是同时调高或调低。以前看起来不同的原因是 acpi-cpufreq CPU 调高驱动程序过去报告它认为的 CPU 频率应该是多少,而不是实际频率是多少。现在它报告实际频率是多少。

对于几乎所有用户/场景来说,使用cat /sys/devices/system/cpu/cpufreq/policy*/scaling_cur_freq提供了足够好的指标来表明各个 CPU 的频率是多少。文档之所以有这样的免责声明,是因为如果 CPU 处于空闲状态且时钟停止了一段时间,那么信息可能会有点过时。

默认情况下,您的处理器应使用 intel-pstate CPU 频率驱动程序,并且它具有 HWP(硬件 pstate 控制),这意味着处理器本身可以决定请求的 pstate(CPU 频率)。请注意,所有 pstate 请求都会进入 PLL 内容,以及空闲状态,并决定 PLL 将在哪个 pstate 下运行。您似乎正在使用 acpi-cpufreq CPU 缩放驱动程序,所以我猜您已经禁用了 intel_pstate 驱动程序,如果这是您的偏好,那么这很好。

至于 CPU 频率调整工具/方法。我从不使用它们。我只通过命令行使用基本的原始命令来管理 CPU 频率调整。

至于为什么您的 CPU 现在似乎无法进入 turbo 范围,我们需要更多信息来提供帮助。例如:

doug@s15:~$ grep . /sys/devices/system/cpu/cpufreq/policy*/scaling_driver
/sys/devices/system/cpu/cpufreq/policy0/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy1/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy2/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy3/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy4/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy5/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy6/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpufreq/policy7/scaling_driver:intel_pstate
doug@s15:~$ grep . /sys/devices/system/cpu/cpufreq/policy*/scaling_governor
/sys/devices/system/cpu/cpufreq/policy0/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy1/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy2/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy3/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy4/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy5/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy6/scaling_governor:powersave
/sys/devices/system/cpu/cpufreq/policy7/scaling_governor:powersave
doug@s15:~$ grep . /sys/devices/system/cpu/intel_pstate/*    <<<< If driver is intel-pstate.
/sys/devices/system/cpu/intel_pstate/max_perf_pct:100
/sys/devices/system/cpu/intel_pstate/min_perf_pct:42
/sys/devices/system/cpu/intel_pstate/no_turbo:0
/sys/devices/system/cpu/intel_pstate/num_pstates:23
/sys/devices/system/cpu/intel_pstate/status:active
/sys/devices/system/cpu/intel_pstate/turbo_pct:18

预期问题:如果只有一个 PLL,并且所有 CPU 始终以相同频率运行,那么为什么报告的它们的频率不同?示例:

doug@s15:~$ cat /sys/devices/system/cpu/cpufreq/policy*/scaling_cur_freq
2186018
2315657
2308037
2254830
2111971
2127314
2169466
2152378

答案:在任何给定的测量间隔内,CPU 也会进入和退出各种空闲状态,如果空闲状态足够深,则 CPU 时钟会停止。报告的频率是该处理器在上一个测量间隔内的平均活动频率。

相关内容