解決筆記本在Linux下插電源降頻的問題

筆記本的處理器頻率,若使用電池,則可對最高頻率做適當限制,以達到省電目的;若插入移動電源,則可以解除限制,讓處理器能夠在其最高頻率上運行,以提高性能——這是最基本的電源管理策略。

然而,我的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

更新啓動參數,重啓即可生效。

到此,插電降頻問題徹底解決,終於可以愉快地享用了!

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章