我有两台机器,它们运行相同的操作系统、相同的内核、相同的 CPU 频率缩放驱动程序和相同的 CPU 频率缩放调节器。
如果一个进程固定一个核心,一个将提升所有核心频率。
如果有一个进程固定一个核心,则一个只会提升一个物理核心。
机器A
CPU: Intel(R) Xeon(R) W-2140B CPU @ 3.20GHz
Scaling driver: intel_pstate
Scaling governor: powersave
OS: Ubuntu 21.10
Kernel: 5.13.0-22-generic
机器 B
CPU: 11th Gen Intel(R) Core(TM) i5-11600K @ 3.90GHz
Scaling driver: intel_pstate
Scaling governor: powersave
OS: Ubuntu 21.10
Kernel: 5.13.0-22-generic
观察这些例子:
在机器 A 上固定两个内核:(请注意,这台机器具有超线程,因此可扩展 16 个可用虚拟内核中的 4 个。)
在机器 B 上固定两个核心:(请注意,这台机器有 6 个带 HT 的核心,并且可以扩展所有 12 个虚拟核心。)
屏幕截图是我自己编写的一个开源频率监视器freqtop 。橙色刻度显示每个内核上的负载,定义为用户+内核周期相对于总周期(用户+内核+空闲)的百分比。
为什么 i5-11600K CPU 会加速所有内核,即使只需要一个内核?
更新:我发现机器之间的一个区别是 pstate 的数量。
因为至强/sys/devices/system/cpu/intel_pstate
设置为33,而corei5设置为42。我不确定这有什么意义。
在 Intel CPU 中,有几种不同的方式来处理核心限制。全部学习它们是非常技术性的。大多数人只是学习他们使用的 CPU。但我确信是固件(BIOS、UEFI)和/或处理器内部允许的控制级别为您提供了这些不同的结果。
我在我们的两台机器上看到了相同的情况,它们都运行 Debian Bullseye,但处理器不同。有时
$ powertop
可以揭示。它旨在调整笔记本电脑的功耗,但由于不同的原因,台式机上显示的信息很有趣。我使用 powertop 检查内核是否在 turbo 模式下运行,以及它们的节流程度等等。它也适用于 AMD。
你已经写了那个监视器,所以看起来你可能比我知道的更多。
这个论坛不是讨论很多细节的地方,仅仅是因为材料太庞大和技术性太强。我希望这有帮助。
我已经能够让 corei5 机器表现得更合适,并且只增加我们实际工作的内核的频率。
为此,我发现我必须切换 intel_pstate 驱动程序模式。
在
/sys/devices/system/cpu/intel_pstate/status
您可以在主动和被动模式之间切换。活动模式: 在这种模式下,驱动程序绕过 CPUFreq 的缩放调控器层,并为 P 状态选择提供自己的缩放算法。
被动模式: ...驱动程序的行为类似于常规 CPUFreq 缩放驱动程序。也就是说,当需要与硬件对话以更改 CPU 的 P 状态时,它由通用缩放调控器调用...
如果我没看错的话,我认为在活动模式下,CPU 来自操作系统本身的反馈较少。我认为 CPU 错误地猜测所有内核都需要节流。
仍然无法解释的是,Xeon CPU使用相同的 intel_pstate 驱动程序在主动移动中表现良好。但这可能只是对并非所有 CPU 都相同的猜测。或者甚至可能是没有正确执行 pstates 的可疑主板或 BIOS。