筆記本的處理器頻率,若使用電池,則可對最高頻率做適當限制,以達到省電目的;若插入移動電源,則可以解除限制,讓處理器能夠在其最高頻率上運行,以提高性能——這是最基本的電源管理策略。
然而,我的ThinkPad X200卻不走尋常路,故意和我對着幹。X200搭載Intel Core 2 Duo P8600 雙核處理器,設計最高主頻爲2.40GHz。在使用“performance”調控器(governor),並儘可能將調控器最高頻率設爲最大值的情況下:
- 若只使用電池,則處理器最高頻率可以達到2.40GHz,平均運行頻率常常能超過1.6GHz。
- 但是,若插上電源適配器,過一段時間後,最高頻率就被限制在了1.60GHz,且無法使用
cpufreq-set
工具進行更改。
這也太奇怪了吧,筆記本居然會在插電時降頻!儘管插電後電量多到用不完,毫無費電之虞,筆記本卻仍然認爲應該省電;而使用電池時,筆記本卻根本不管這些,允許CPU達到最大頻率。什麼邏輯!
嘗試解決問題
起初,我以爲是BIOS中的節能控制設置不當。有一個設置是Intel SpeedStep Technology,這是英特爾的處理器電源管理功能。我嘗試將其中針對AC適配器和電池的策略設置爲相同的值,結果重啓後問題如故;而關閉該功能後,Linux管理CPU頻率的acpi-cpufreq
驅動直接失效,不可行。後來,我又嘗試將PCI和PCI-E的省電功能關閉,問題同樣如故。
看來,不能靠更改BIOS設置來解決插電降頻的問題,只能從系統層面入手了。會不會跟內核有關?對此,我嘗試了不同的內核版本,以及使用OpenSUSE安裝盤的Shell進行測試,運行以下命令設置調節器爲performance
,讀取調控器最大頻率(須在Root用戶下測試):
cd /sys/devices/system/cpu/cpu0/cpufreq
echo performance > scaling_governor
cat scaling_max_freq
結果,插電後仍然降頻。由此可排除內核版本和操作系統的問題。
那麼,問題到底出在哪裏呢?
突破口:BIOS的限制
在Linux中,控制處理器頻率的目錄是/sys/devices/system/cpu/cpu*/cpufreq
(星號爲處理器核心編號),其中包含一系列節點,用於讀取或設置處理器頻率的參數。主要包括:
節點名 | 作用 | 讀寫權限 |
---|---|---|
affected_cpus | 顯示受影響的CPU編號 | 只讀 |
bios_limit | BIOS提供的頻率限制值 | 只讀 |
cpuinfo_cur_freq | CPU的當前頻率 | 只讀,須root |
cpuinfo_max_freq | CPU的最大頻率 | 只讀,須root |
cpuinfo_min_freq | CPU的最小頻率 | 只讀,須root |
cpuinfo_transition_latency | CPU頻率切換的延遲 | 只讀 |
freqdomain_cpus | 受調節且在同一組內的CPU編號 | 只讀 |
related_cpus | 顯示當前頻率調節器關聯的CPU編號 | 只讀 |
scaling_available_frequencies | 頻率調節器允許的CPU頻率值。設置的頻率只能爲其中之一,否則會報錯 | 只讀 |
scaling_available_governors | 可用的頻率調節器 | 只讀 |
scaling_cur_freq | 調節器調控的當前CPU頻率。此值爲當前CPU的真實頻率 | 只讀 |
scaling_driver | 當前的調頻驅動 | 只讀 |
scaling_governor | 顯示與設置當前使用的頻率調節器 | 讀寫 |
scaling_max_freq | 顯示與設置調節器的最大頻率 | 讀寫 |
scaling_min_freq | 顯示與設置調節器的最小頻率 | 讀寫 |
scaling_setspeed | 手工設置CPU頻率。只在userspace 調節器下生效 |
讀寫 |
stats | CPU使用信息統計 | 目錄 |
注:上述節點中,頻率值的單位爲Hz。
注意其中的bios_limit
,它反映的是BIOS所提供的頻率限制值。在本文開頭的條件下,使用電池時,其中的值爲2400000,而插上電源後該值立刻降到1600000。由此不難得知,是BIOS在限制CPU的頻率,X200的BIOS對處理器頻率的調控策略簡直是弱智!
讓系統忽略處理器頻率限制
那麼,有什麼辦法可以打破限制?的確是可以的,Linux系統可以忽略bios_limit
中BIOS所提供的不合理限制值,讓用戶可以自由設置理想的頻率,使處理器性能的發揮重回正軌。
具體的做法是,調節內核當中的一個參數——ignore_ppc
,將其值設爲1,表示忽略BIOS頻率限制:
echo 1 | sudo tee /sys/module/processor/parameters/ignore_ppc
設置即時生效。這時再插入電源適配器,即可發現頻率再也不會被限制在1.6GHz下了。
若要使該設置在每次重啓後都能自動應用,可以更改啓動配置文件/etc/default/grub
。在root權限下打開它,找到GRUB_CMDLINE_LINUX_DEFAULT
,將processor.ignore_ppc=1
加在值的後面,就像這樣:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash processor.ignore_ppc=1"
最後運行
sudo update-grub
更新啓動參數,重啓即可生效。
到此,插電降頻問題徹底解決,終於可以愉快地享用了!