CPU 調頻為作業系統提供了動態調整 CPU 頻率的能力,實現節能或提升性能。系統負載、ACPI 事件或者用戶空間程序都可以觸發 CPU 頻率的調整。
Linux 內核通過 cpufreq 子系統實現此功能,包含以下兩個抽象層:
系統會自動選擇默認的調頻驅動程序和調速器,但是為您仍然可以使用cpupower、 acpid、 Laptop Mode Tools 或桌面環境提供的 GUI 工具等用戶空間應用程式來進行高級配置。
用戶空間工具
thermald
thermald包 是一個防止 Intel 平台過熱的 Linux 守護進程。此守護進程會監控平台溫度,並通過控制 P-states、T-states 和 Intel power clamp 驅動主動控制溫度水平。thermald 也適用於較老的 Intel CPU。如果最新版本的驅動程序不可用,那麼守護進程會還原為 x86 MSR (Model Specific Register),由 Linux「cpufreq 子系統」來控制系統冷卻。
默認情況下,它利用 CPU 中的數字溫度傳感器讀取 CPU 溫度,在硬體採取激進的降溫措施之前將 CPU 的溫度控制在允許的範圍內。如果 sysfs 中存在表面溫度傳感器,那麼它會嘗試將表面溫度保持在 45℃ 以下。
在使用 Tiger Lake 架構處理器的筆記本電腦(例如 Dell Latitude 3420)上,此守護程序據說可以解鎖更多性能。
對應的 systemd 服務是 thermald.service
,您應該啟用並啟動此服務。
i7z
i7z包 是 i7 CPU (也同樣適用於 i3、i5、i9 CPU)的報告工具。可以在終端下輸入 i7z
或者使用圖形化工具 i7z-gui
來運行該工具。
turbostat
turbostat包 可以顯示現代 Intel 和 AMD CPU 的頻率、功耗、空閒狀態和其他統計數據。
cpupower
cpupower包 是一組為輔助 CPU 調頻而設計的用戶空間工具。該軟體包並非必須,但強烈建議安裝,因為它提供了方便的命令行實用程序,並且內置 systemd 服務,可在啟動時更改調頻器。
cpupower 的配置文件位於 /etc/default/cpupower
。此配置文件由 /usr/lib/systemd/scripts/cpupower
中的 bash 腳本讀取,而該腳本由 systemd 通過 cpupower.service
激活。若要在啟動時啟用 cpupower,請執行:
# systemctl enable cpupower.service
cpupower-gui
cpupower-guiAUR 是一個圖形實用程序,旨在幫助 CPU 調頻。該 GUI 基於 GTK,提供與 cpupower 相同的選項。cpupower-gui 可以更改每個內核的最大 / 最小 CPU 頻率和調速器。該應用程式通過 polkit 獲得權限,並允許 wheel
用戶組中的任何登錄用戶更改頻率和調速器。
gnome-shell-extension-cpupower
gnome-shell-extension-cpupower-gitAUR是一個GNOME shell擴展,可以改變 CPU 的最小/最大的頻率,並啟用/禁用調頻。
auto-cpufreq
auto-cpufreqAUR 是一個用於Linux的自動CPU速度和功率優化器,它基於對筆記本電腦的電池狀態、CPU使用率、CPU溫度和系統負載的主動監測。
power-profiles-daemon
power-profiles-daemon包 中的 powerprofilesctl 命令行工具通過 power-profiles-daemon.service
處理電源配置文件(如平衡、省電、性能)。GNOME 和 KDE 也提供了切換配置文件的圖形界面;見下文:
關於使用方法、用例以及與類似項目的比較,請參見該項目的 README。
啟動/啟用 power-profiles-daemon.service
。注意,當 powerprofilesctl 啟動時,它也會嘗試啟動該服務(見dbus.service
的單元狀態)。
power-profiles-daemon.service
(另見 [1],[2])。調頻驅動
調頻驅動實現了 CPU 特有的設置調速器指定頻率的細節。嚴格來說,ACPI 標準要求電源性能狀態(P-state)從P0開始性能逐漸降低。這種功能在英特爾稱為 SpeedStep,在AMD稱為 PowerNow!
但在實踐中,處理器提供了指定特定頻率的方法,而不是局限於調頻驅動程序處理的固定 P 狀態。
- 原生 CPU 模塊將會自動加載。
- 對於現代 Intel CPU,將使用
intel_pstate
功率驅動程序,而非下列其他驅動程序。此驅動程序的優先級高於其他驅動程序,並編入內核(而非編譯為模塊)。此驅動程序將自動用於 Sandy Bridge(以及更新的 CPU)。intel_pstate
可能會忽略 BIOS P-State 設置,或者通過intel_cpufreq
運行於 "被動模式"。如果使用時遇到問題,可以在內核行加入intel_pstate=disable
,這樣系統會使用acpi_cpufreq
驅動。 - 在支持的 CPU 上(Zen 2 及之後型號),在內核參數 中加入
amd_pstate=passive
可以手動啟動amd_pstate
。如果內核參數不起作用,可能需要進入主板設置程序中將CPPC和全局C狀態控制(global c-state control)打開。主板中的大部分選項默認設置可能是自動(Auto),這往往意味著禁用,必須要手動改成啟用(Enabled)才能生效。
cpupower 需要相應模塊來了解本地 CPU 的限制信息:
模塊 | 描述 |
---|---|
intel_pstate | 此驅動程序通過內置調頻器,實現面向 Intel Core(SandyBridge 和更新的型號)處理器的調頻驅動。 |
intel_cpufreq | 從內核 5.7 開始,intel_pstate 調頻驅動程序為不支持 硬體P 狀態管理(HWP) 的 CPU 選擇「被動模式」又名 intel_cpufreq,即第 5 代或更早的 Intel Core i處理器。 |
amd_pstate | 此驅動程序為 AMD Ryzen(某些 Zen 2 和更新版本)處理器實現了帶有內部調速器的調頻驅動程序。 |
acpi_cpufreq | 此 CPUFreq 驅動程序可充分利用 ACPI Processor Performance States。此驅動程序也支持 Intel Enhanced SpeedStep(之前由 speedstep-centrino 模塊(已廢棄)提供支持)。 |
speedstep_lib | 此 CPUFreq 驅動程序面向支持 Intel SpeedStep 的 CPU(主要包括 Atom 和早於 Pentinum 3 的 CPU)。 |
powernow_k8 | 面向 K8/K10 Athlon 64/Opteron/Phenom 的 CPUFreq 驅動程序。從 Linux 3.7 開始,對於此系列中的較現代 CPU,將自動使用「acpi_cpufreq」。 |
pcc_cpufreq | 此驅動程序支持 HP 和 Microsoft 提出的 Processor Clocking Control 接口,在某些 ProLiant 伺服器上比較有用。 |
p4_clockmod | 面向 Intel Pentium 4/Xeon/Celeron 處理器的 CPUFreq 驅動程序,可通過跳頻來降低 CPU 溫度。(您最好使用 SpeedStep 驅動程序。) |
查看所有可用的模塊,運行以下命令:
$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/
加載合適的模塊 (see Kernel modules for details)。一旦合適的 cpufreq 驅動模塊被加載成功,就可以通過以下命令查詢到 CPU 的信息:
$ cpupower frequency-info
設置最大和最小頻率
在罕見的情況下,可能有必要手動設置最大和最小頻率。
運行以下命令設置最大時鐘頻率(clock_freq 為時鐘頻率,單位為:GHz, MHz):
# cpupower frequency-set -u clock_freq
運行以下命令設置最小時鐘頻率:
# cpupower frequency-set -d clock_freq
運行以下命令設置運行於指定頻率:
# cpupower frequency-set -f clock_freq
- 僅設置某一核心,添加參數
-c core_number
。 - The governor,頻率的最大值和最小值可以在
/etc/default/cpupower
中設置。
或者,也可以手動設置頻率:
# echo value | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
可以在 /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies
或者類似的地方找到取值。 參考 [3]
配置超頻
在合適的散熱條件下,某些處理器支持在短時間內將其頻率提高到高於正常最大值的頻率。 在 Intel 處理器上,這稱為英特爾睿頻加速(英語:Intel Turbo Boost), 在 AMD 處理器上叫做 Turbo-Core(別名:AMD Core Performance Boost ,縮寫CPB)。
通過 sysfs 配置 (intel_pstate)
intel_pstate 有一個特定於驅動程序的接口,用於禁止處理器進入 turbo P-States:
# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
通過 sysfs 配置 (Other scaling drivers)
對於 intel_pstate 以外的縮放驅動程序,如果驅動程序支持超頻,系統中應該可以找到 sysfs 屬性/sys/devices/system/cpu/cpufreq/boost
,並可用于禁用/啟用超頻:
# echo 0 > /sys/devices/system/cpu/cpufreq/boost
通過 x86_energy_perf_policy 配置
在 Intel 處理器上,x86_energy_perf_policy包 也可用於配置 Turbo Boost:
# x86_energy_perf_policy --turbo-enable 0
調速器
調速器(見下表)是預設的 CPU 電源方案,有些是設置為固定頻率,有些會根據算法計算出需要的頻率。在同一時刻只會有一個會調速器被激活。詳見內核文檔。
intel_pstate
scaling driver in active mode will bypass the generic CPUFreq governors, providing its own scaling algorithms: powersave
and performance
. Although they share names with generic governors, their algorithms work differently: both intel_pstate
governors provide dynamic scaling similar to the schedutil
or ondemand
generic governors. The performance
algorithm should give better power saving functionality than the old ondemand governor.調速器 | 描述 |
---|---|
performance | 運行於最大頻率, 數值通過 /sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq .
|
powersave | 運行於最小頻率,數值值通過 /sys/devices/system/cpu/cpuX/cpufreq/scaling_min_freq 查看。
|
userspace | 運行於用戶指定的頻率,通過 /sys/devices/system/cpu/cpuX/cpufreq/scaling_setspeed 配置。
|
ondemand | 按需快速動態調整CPU頻率, 一有cpu計算量的任務,就會立即達到最大頻率運行,空閒時間增加就降低頻率 |
conservative | 按需快速動態調整CPU頻率, 比 ondemand 的調整更保守 |
schedutil | 基於調度程序調整 CPU 頻率 [4], [5]. |
根據實際硬體,以下的調速器可能被默認啟用:
-
powersave
:Intel 使用intel_pstate
驅動的 CPU(Sandy Bridge 和更新的CPU)。 -
powersave
(for Linux < 5.10) orschedutil
(since Linux 5.10) for CPUs using theacpi_cpufreq
driver.
如果需要指定特定的調速器,運行以下命令:
# cpupower frequency-set -g governor
- 僅設置某一核心,請在命令的最後跟隨以下參數
-c core_number
。 - 激活某一調速器,需要特定的 內核模塊 (名為
cpufreq_governor
)正確載入。在 3.4 內核上,這些模塊應該已經自動加載。
也可以這樣實現:
# echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
$ watch cat /sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_cur_freq
調節 ondemand 調速器
詳見內核文檔。
開關閾值
設置到其他值(增加)的步長,執行以下命令:
# echo -n percent > /sys/devices/system/cpu/cpufreq/governor/up_threshold
設置到其他值(減小)的步長,執行以下命令:
# echo -n percent > /sys/devices/system/cpu/cpufreq/governor/down_threshold
採樣率
採樣率決定調速器多久進行一次檢查並調整CPU頻率。
設置sampling_down_factor
大於1將通過降低負載評估的消耗,並將CPU保持在最高運行頻率而提高性能。sampling_down_factor
的可選數值是 1 到 100000。這個可調參數對低CPU頻率/負載沒有效果。
要獲取這個值 (default = 1),運行:
$ cat /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
要設置這個值,運行:
# echo -n <value> > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
保存設置
要在重啟後自動啟用設置,通常使用內核模式選項和 systemd#systemd-tmpfiles - temporary files。
例如要將 up_threshold 設置為 10:
/etc/tmpfiles.d/ondemand.conf
w- /sys/devices/system/cpu/cpufreq/ondemand/up_threshold - - - - 10
如果某些特殊情況下會出現時序問題,可以使用 udev。創建如下 udev 規則:
$ udevadm info -a /sys/devices/cpu
... KERNEL=="cpu" SUBSYSTEM=="event_source" ...
/etc/udev/rules.d/cpu.rules
KERNEL=="cpu", SUBSYSTEM=="event_source", ACTION=="add", RUN+="/bin/sh -c 'echo performance | tee /sys/devices/system/cpu/cpufreq/policy*/scaling_governor'"
$ udevadm test /sys/devices/cpu
... Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules Reading rules file: /etc/udev/rules.d/cpu.rules ...
要在 initramfs 中啟用設置,請參考下面例子:udev#Debug output.
Intel performance and energy bias hint
The Intel performance and energy bias hint (EPB) is an interface provided by Intel CPUs to allow for user space to specify the desired power-performance tradeoff, on a scale of 0 (highest performance) to 15 (highest energy savings). The EPB register is another layer of performance management functioning independently from frequency scaling. It influences how aggressive P-state and C-state selection will be, and informs internal model-specific decision making that affects energy consumption.
Common values and their aliases, as recognized by sysfs and x86_energy_perf_policy are:
EPB value | String |
---|---|
0 | performance |
4 | balance-performance |
6 | normal, default |
8 | balance-power |
15 | power |
Setting via sysfs
The EPB can be set using a sysfs attribute:
# echo epb | tee /sys/devices/system/cpu/cpu*/power/energy_perf_bias
Setting via x86_energy_perf_policy
With x86_energy_perf_policy包:
# x86_energy_perf_policy epb
Setting via cpupower
With cpupower包:
# cpupower set -b epb_value
與 ACPI 事件交互
用戶可以把調速器配置為基於不同的ACPI事件自動切換的形式。例如接入外接電源,或是合上屏幕時。以下是一個簡明的例子,但可能有必須通讀一遍文章acpid.
事件是在/etc/acpi/handler.sh
中定義的。如果acpid包軟體包已經安裝,這個文件應該已經存在並且設置為可執行。例如,當外接電源拔除時將調速器從performance
改為conservative
,而當電源再次接入時將它改回來:
/etc/acpi/handler.sh
[...] ac_adapter) case "$2" in AC*) case "$4" in 00000000) echo "conservative" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo -n $minspeed >$setspeed #/etc/laptop-mode/laptop-mode start ;; 00000001) echo "performance" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo -n $maxspeed >$setspeed #/etc/laptop-mode/laptop-mode stop ;; esac ;; *) logger "ACPI action undefined: $2" ;; esac ;; [...]
疑難解答
- 一些應用程式,如ntop,對自動頻率調整不能很好地響應。在ntop的案例中它可能導致分段錯誤和大量信息丟失,因為在大量網絡數據包突然到達被監控的網絡接口時,
on-demand
調速器不能迅速反應,以致當前處理速度滿足不了處理這些數據包所需的速度。
- 一些CPU在默認的
on-demand
調速器配置下可能受到比較嚴重的性能損失(例如flash視頻不能平滑地播放,或窗口動畫停頓)。為了解決這些問題,完全禁用掉頻率調整不如採取更積極的措施——降低每個CPU的up_threshold sysctl變量值。閱讀#調節 ondemand 調速器章節以獲得更多信息。
- 有時on-demand調速器可能達不到最高頻率而只能達到次級頻率。這個問題可以通過把max_freq值設置得稍微高於最大頻率的方式來解決。例如,如果CPU的頻率範圍是2.00 GHz到3.00 GHz,把max_freq設置為3.01 GHz就是一個不錯的主意。
- ALSA驅動和有些聲音晶片配合工作時,可能導致在調速器改變頻率時聲音跳躍。改回non-changing調速器應該能夠解決這個問題。
BIOS頻率限制
一些CPU/BIOS配置可能導致達不到最高頻率或根本無法調高頻率。這很可能是因為BIOS告訴作業系統限制頻率,結果在/sys/devices/system/cpu/cpu0/cpufreq/bios_limit
中設置了一個過低的值。
這種情況下需要在BIOS設置中修改指定的配置(頻率,發熱管理等)。這通常是由於有問題的/過舊的BIOS導致,也可能BIOS有特別的原因要求必須這樣。
可能的原因有(假設你的機器是一台筆記本)電池被移除(或快要完全損壞),所以你只能用外接電源。這種情況下如果電源適配器提供的電能太弱,就會滿足不了整個系統在峰值所需的電能,而且又沒有電池輔助供電,就可能導致數據丟失,數據損壞或最壞的情況下損壞硬體!
不是所有的BIOS都會在這種情況下限制CPU頻率,但如IBM/聯想 Thinkpad就會。參考thinkwiki以獲取更多信息thinkpad related info on this topic.
如果你檢查後發現並沒有不正確的BIOS設置,而且你也十分清楚自己在做什麼以及可能導致的結果,你還可以選擇讓內核忽略BIOS限制。
一個特殊的參數需要傳遞給處理器模塊。
臨時嘗試這辦法時可以修改/sys/module/processor/parameters/ignore_ppc
值從0
到1
。
要固化這個修改請參考Kernel module或繼續閱讀本文。
添加processor.ignore_ppc=1
到內核啟動參數或創建
/etc/modprobe.d/ignore_ppc.conf
# 如果你的機器受到錯誤的BIOS頻率限制,這應該會有幫助 options processor ignore_ppc=1