Linux 與 CPU 風扇控制
最近在二號機上使用 Wine 或 Proton 執行 Windows 遊戲時,無論是 2D 還是 3D 遊戲,都發現容易在連續玩了數小時後出現當機情形(畫面凍住,整個主機沒有反應)。於是經過觀察並且做了一些比對後,認為可能是 CPU 熱當。因為觀察到 CPU 在前述的使用情境下,單一執行緒的使用率會持續滿載,而 CPU 溫度也會隨之上升,然後在一段時間後就有可能會發生當機情形。然而其它的使用情境,例如原生的 Linux 遊戲,則負載看似相對平穩,未重現出相同的狀況。
二號機的 CPU 是上了年紀的 AMD FX-8350,散熱器則是 Cooler Master Hyper 212X Turbo。至於其它的硬體規格則包含了顯卡是 GeForce GTX 1650(這是近期才更換的),以及主機板是 Gigabyte GA-990FXA-UD3。其實多數的使用情形都是蠻正常的,就唯獨用 Wine 或 Proton 跑遊戲,執行久了會有死當的風險。倘若嚴格控制玩遊戲的時間(比方說每次一個小時,然後就先結束遊戲等硬體冷卻),則確實也未曾遇到死當的情形。
不過老實說,DR 也覺得這是一個就技術層面而言,應該要設法排解的問題(想要正常彈性地玩遊戲啊……)。於是便開始研究要如何強化主機現有的散熱狀況,而其中一項對策是設法從作業系統控制 CPU 風扇的轉速。本文是在 Fedora 38 下的操作流程,首先於系統上安裝 lm_sensors 套件:
- sudo dnf install lm_sensors
完成安裝後,先執行 sensors-detect 工具程式:
- sudo sensors-detect
sensors-detect 會以詢問式的文字介面流程逐一偵測主機上的各項感測器,基本上就是直接以預設值一路按 Enter 即可。最後的偵測結果會存入到 /etc/sysconfig/lm_sensors 設定檔裡,並且會啟動 lm_sensors 服務,可以使用 systemctl 指令來檢視服務啟動狀態:
- sudo systemctl status lm_sensors
接著便執行 sensors 工具程式:
- sensors
sensors 是用於檢視感測器及風扇數據,會列出讀取到的風扇轉速以及感測器溫度,後續也可以多次利用此工具來檢視數據。至於下一個步驟則是執行 pwmconfig 工具來設定風扇控制的參數:
- sudo pwmconfig
倘若執行 sensors 時沒有列出風扇資訊,或者執行 pwmconfig 時出現「/usr/sbin/pwmconfig: There are no pwm-capable sensor modules installed」訊息而中止,就得先確認 lm_sensors 服務是否有正常啟動。反之 pwmconfig 的文字介面將會有多項偵測步驟,以及需要做出選擇的項目。如附件所示,可以單純按照文字介面上的提示來操作,工具程式會在過程中先後測試全速運轉風扇、以及停止風扇運轉。並且可以自訂感測器溫度與風扇轉速的對應關係,比方說讓 CPU 風扇進入全速運轉的溫度閥值預設為 60 度,可以再往下調整。完成設定後,再將設定值儲存到 /etc/fancontrol 設定檔裡。
最後就可以啟動 fancontrol 服務,以便根據設定參數來控制 CPU 風扇:
- sudo systemctl enable fancontrol
- sudo systemctl start fancontrol
該服務實際上就是執行 fancontrol 工具程式,不過以服務的形式來啟動應該是比較好管理。此外 fancontrol 同樣也依賴於 lm_sensors 服務是否有正常執行。