cpufreqdでlm_sensorsを使用して、センサの値に応じたクロック・電圧制御を行う
cpufreqdデーモンは、Linux(カーネル)に含まれるhwmonという機能を利用して温度・電圧・ファン回転数といった情報を取得するlm_sensorsというツールが出力する値を(プラグインから)利用して、ポリシー変更のルールに取り入れることができる。
目的について
cpufreqdのlm_sensorsプラグインを使用することで
- [センサの場所]の温度が[指定温度]度を越えたら、[指定されたプロファイル(governorとクロック範囲のセット)]に変更する
- [センサの場所]のファン回転数が[指定温度]回転/分を越えたら、[指定されたプロファイル]に変更する
といったことができる。
目的としては、(特に夏場において)
- 高温により動作に支障が出る(例: 突然ソフトウェアもしくはハードウェア的に電源が落ちる)場合に対しての対処
- 極力各部品やケース内の温度を下げたい(精神衛生上の問題も含め、長持ちさせたい)
- 回転数が自動調整される各種ファンの回転数が上がりすぎるため、低クロック動作で発熱を抑えることで、ファンの回転数を下げ、消費電力を少しでも下げたい(冷却にかかるエネルギーを減らしたい)
などが考えられるが、特に、CPUが高発熱だったり、ケースに熱がこもりやすかったりするときに有用かもしれない。
ただし、これまで行われなかったプラグイン処理が増える他、切り替えを検討するプロファイルも増えるため、特に必要がなければ無理に導入する必要はない。本当に必要かどうかを検討し、必要であれば導入する。*1
準備
lm_sensorsを事前に設定し、
$ sensors -u
でセンサの値が取れることを確認した上で、どの名前(「fan4」「temp1」など)が、利用したい値を出力する項目なのか(例:「CPUファンの回転数はfan4」)も知っておく必要がある。ただし、この対応関係に関しては、ハードウェア環境ごとに、実際の数値を見た上で、どこに対応しているかを推測するしかない。
設定例
以下は手元の設定ファイル。
- 「fan4」のファンの回転数が1800以上になると最低クロックで動作
- 「temp1」の温度が55度以上になると最低クロックで動作
という設定を追加している。
これはあくまでも設定の参考程度。運用上のポリシーによって、設定は変更する。クロック周波数などの各種の値も、環境に合わせて変更する。
また、設定ファイルの全体を貼り付けている関係で、programsプラグインの設定も含んでいるが、このあたりの説明は「動的にCPUクロックや電圧を変更するcpufreqの概要とcpufreqdデーモンについて」でしているため、ここでは扱わない。
ファイル名: /etc/cpufreqd.conf
[General] pidfile=/var/run/cpufreqd.pid poll_interval=4 enable_remote=1 remote_group=wheel verbosity=0 [/General] [sensors_plugin] sensors_conf=/etc/sensors.conf [/sensors_plugin] [Profile] name=ondemand low minfreq=1000000 maxfreq=1800000 up_threshold=70 policy=ondemand [/Profile] [Profile] name=ondemand mid minfreq=1000000 maxfreq=2000000 up_threshold=70 policy=ondemand [/Profile] [Profile] name=ondemand high minfreq=1000000 maxfreq=2200000 up_threshold=70 policy=ondemand [/Profile] [Profile] name=powersave low minfreq=1000000 maxfreq=1000000 policy=powersave [/Profile] [Profile] name=powersave mid minfreq=1800000 maxfreq=1800000 policy=powersave [/Profile] [Profile] name=performance minfreq=2200000 maxfreq=2200000 policy=performance [/Profile] # lm_sensors上で「fan4」と認識されるファンが1800RPM以上になるとクロック下げ [Rule] name=fan cpu_interval=0-100 sensor=fan4:1800-99999 profile=powersave low [/Rule] # lm_sensors上で「temp1」と認識される温度が55C以上になるとクロック下げ [Rule] name=temp cpu_interval=0-100 sensor=temp1:55-999 profile=powersave low [/Rule] # 最低クロックで快適に動作するがCPU使用率100%のものに対してクロック下げ [Rule] name=throttle low cpu_interval=0-100 programs=[コンマ区切りの実行ファイル名一覧] profile=powersave low [/Rule] # 最低クロックよりは高いクロックが必要だが常に100%というわけではないもの [Rule] name=throttle mid-ondemand cpu_interval=0-100 programs=[コンマ区切りの実行ファイル名一覧] profile=ondemand low [/Rule] # 最低クロックよりは高いクロックが必要なもの(100%使用)に対してクロック下げ [Rule] name=throttle mid-fixed cpu_interval=0-100 programs=[コンマ区切りの実行ファイル名一覧] profile=powersave mid [/Rule] # デフォルトは最低クロックから最大クロックまで使用 [Rule] name=default cpu_interval=0-100 profile=ondemand high [/Rule]
「sensors_plugin」セクションでlm_sensorsの設定ファイルの場所を指定する他は、認識される名前(「temp1」など)とその範囲による指定を行う形で使用する。
動作確認の流れなどは「動的にCPUクロックや電圧を変更するcpufreqの概要とcpufreqdデーモンについて」を参照。既にデーモンが動いている場合
$ sudo /etc/init.d/cpufreqd stop
のようにして一度止めてから設定変更とテストを行い、OKであれば通常通り開始(「stop」の代わりに「start」)する。
関連記事:
- 動的にCPUクロックや電圧を変更するcpufreqの概要とcpufreqdデーモンについて
- hwmonモジュール+lm_sensorsとhddtempで温度を取得
- cpufreqd 2.2系向けのプロファイル手動切り替えスクリプト
使用したバージョン:
- cpufreqd 2.2.1