試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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」)する。

関連記事:

使用したバージョン:

  • cpufreqd 2.2.1

*1:手元の環境でも、高負荷時にCPUファンの回転数が多少上がるのを気にしなければ、「室温33-34度程度の環境であっても、各部の温度が高すぎるという状況にはならない」というケース内の状態なので、設定などを書いてはいるが、ここではlm_sensorsプラグインの動作の確認の意味のほうが強かったりする