CPU動作クロックを向上させることによりAmazon Prime Musicも問題なく再生できるようになったRaspberry pi 3ですが、まだ不満があります。
CPUの動作周波数を上げるとどうしても熱や消費電力が増えてしまいます。また、LSIの寿命にとってもよくありません。
そこで、必要な時だけ動作周波数を上げるようにしたいと思います。
温度が5度以上違う
Raspberry pi 3のCPUの動作周波数を600MHzから1.2GHzに上げるとCPUの温度がかなり上がります。
何も動かしていない状態でも5度ほど高いです。今の季節はまだいいですが、夏になるとかなり不安です。
また、クロックが高くなるとエレクトロマイグレーション現象で半導体の劣化が進むので寿命の点でもよくありません。
消費電力は…もともと高くないので問題ではないかもしれませんが気持ちの点では低くしたいものです。
cpufreq-utilsでondemandやconservativeを使う
1つの解決策はcpufreq-utilsでがバナーを変更することです。
ガバナーとは、どのようにCPUのクロックを変化させるかを決めるルールのことで、前回の記事で使ったpowersave/performanceもこのルールの1つです。
ルールは6つあり、
- powersave : もっとも低い動作周波数でCPUを駆動
- conservative : 負荷に合わせて動作周波数を切り替え、下げる場合と上げる場合の閾値が異なる
- ondemand : 負荷に合わせて動作周波数を切り替え、下げる場合と上げる場合の閾値が共通
- performance : もっとも高い動作周波数でCPUを駆動
- userspace : ユーザーが指定した周波数でCPUを駆動
- schedutil : スケジューラによって周波数を切り替え
となっています。
この中のondemandやconservativeを使うことで、CPUの負荷が高くなったらクロックを上げ、負荷が低くなったらクロックを下げることで消費電力や熱を最適化できるのではないかと考えました。
ondemandを使う場合、
sudo cpufreq-utils -g ondemand
としてガバナーを切り替え、
/sys/devices/system/cpu/cpufreq/ondemand/up_threshold
にCPU周波数を切り替えるCPU使用率の閾値を設定します。
conservativeの場合は
sudo cpufreq-utils -g conservative
として、
/sys/devices/system/cpu/cpufreq/conservative/up_threshold
/sys/devices/system/cpu/cpufreq/conservative/down_threshold
にそれぞれCPUクロックを上げる/下げるCPU使用率の閾値を設定します。
conservativeの場合はクロックを上げる閾値と下げる閾値が別にあるので、クロックを上げたらしばらく上げっぱなしにするような設定が可能です。
なお、閾値のファイル(というかフォルダ)はガバナーを切り替えてからでないと存在しないので注意してください。再起動後にこれらのファイルを書き換えようとしても、タイミングによってはファイルが存在せずにエラーになります。
ondemandやconservativeでは追い込み切れず
これを使って閾値をいろいろ試しましたが、結論としては音切れはなくなりませんでした。
それどころか、設定によってはmpdのほうにも音切れが発生したりと、いまいちでした。
CPUクロックの切り替えにはオーバーヘッドが必要になるので、あまり頻繁に切り替えるとダメなのかもしれません。
(追記): どうやら、USBドライバによってはondmandやconservativeでは音切れが発生するようです。
また、スケジューラ任せにするschedutilも試しましたがダメでした。
cpufreqdでAmazon Prime Musicのみクロックを上げるように設定
そこで、cpufreqdを使ってAmazon Prime Musicの動作時のみクロックを上げるように設定してみました。
cpufreqdは、CPU負荷だけでなく、ほかにも様々な条件でガバナーの切り替えができるデーモンです。
sudo apt-get install cpufreqd
でインストールできます。
インストールしたら
/etc/cpufreqd.conf
の設定ファイルをいじります。
設定によって特定のプログラムが起動中のみガバナーを変更することができますので、chromiumが起動中のみガバナーがperformance、その他はpowersaveになるように設定します。
こんな感じです:
[Profile]
name=Performance High
minfreq=100%
maxfreq=100%
policy=performance
#exec_post=echo 8 > /proc/acpi/sony/brightness
[/Profile][Profile]
name=Powersave Low
minfreq=50%
maxfreq=50%
policy=powersave
[/Profile][Rule]
name=Audio
programs=chromium-browser
cpu_interval=0-100
profile=Performance High
[/Rule][Rule]
name=default
cpu_interval=0-100
profile=Powersave Low
[/Rule]
これにより、mpdでもAmazon Prime Musicでも音切れが(ほとんど)なく、熱や消費電力も抑えられた環境ができました。
Amazon Prime Musicを使わないときはchromiumを落とさないといけないのが面倒ですが、それくらいは許容しようかと。
cpufreqdを使うと温度でもガバナーが切り替えられるので試してみたのですが、どうやらacpiで温度が取れないらしく、切り替えることができませんでした。
より良い設定もあるかもなので継続して調査予定
今回の設定で環境づくりは一段落としようかと思います。
ChromiumをAmazon Prime Musicに応じていちいち落とさないといけないのが面倒なので、ここを何とかしたいです。
また、相変わらずまれに音切れが出ることがあるのでそこも何とかしたいなと。
Raspberry piは奥が深いです。
コメント