如何通过绕过 CPU 缩放来使我的 CPU 以最大速度运行?

如何通过绕过 CPU 缩放来使我的 CPU 以最大速度运行?

我在一台相当旧的笔记本电脑(Lenovo T61)上运行 CentOS 7(7.9.2009)(内核 3.10.0-1160.49.1.el7.x86_64),该笔记本电脑配有双核 CPU(Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz)。CPU 扩展的驱动程序是 acpi-cpufreq,当表现调速器,我可以让 CPU 以所列的最大 CPU 速度运行/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq,并通过执行以下操作来观察:

$ grep -i mhz /proc/cpuinfo 
cpu MHz     : 2001.000
cpu MHz     : 2001.000

在这个速度下,它非常稳定。我可以通过以下方式验证这一点:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
2001000
$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq 
2001000

我正在尝试以恒定频率运行一个实时程序,该程序计算 CPU 时钟周期以进行计时。我编译了一个自定义内核 (5.10.83-rt58) 来支持默认 CentOS 内核 (3.10.0) 不支持的硬件。CPU 缩放通常会导致时钟频率跳动,但我发现可以通过将所有值设置为来获得稳定的频率/sys/devices/system/cpu/cpu*/cpuidle/state*/disable1当我检查频率时:

$ grep -i mhz /proc/cpuinfo 
cpu MHz     : 1995.106
cpu MHz     : 1995.106

它没有达到 3.10.0 内核中看到的 2001MHz。以下命令验证了这一点:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
1995106

但输出:

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
2001000

是不同的。我的问题是,有人知道为什么我的 CPU 没有以最大频率(2001MHz)运行,而是低了约 6MHz?内核 3.10 和 5.10 之间的 CPU 扩展是否发生了重大变化?

答案1

我正在尝试以恒定频率运行实时程序,该程序通过计算 CPU 时钟周期来计时。

这种方法是有问题的,因为现代性能扩展 CPU不会以一个频率运行。它们的确切循环次数取决于热条件。也许你的插槽有轻微的缺陷。而且你的自定义内核可能与 Red Hat 的内核有任意差异,所以是的,它(或微代码)可能以不同的方式刺激 CPU。

使用提供的计时器 API。Linux realtime 概述了基本循环应用。请注意将clock_nanosleep()与CLOCK_MONOTONIC一起使用。

ESR 的时间编程参考很好地解释了为什么有几十个时间函数。


要调整 CPU 调节器和其他针对延迟和功耗的调整,请查看已调整。例如,延迟性能配置文件。

相关内容