CPU 調頻
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