Raspberry Piシリーズにおける夏場の熱対策

Last modified: 2019-08-02

Raspberry Piシリーズはファンレスのコンピュータであるが、初代やZero系のような低発熱なモデルを除いて発熱量が多いため、夏場に温度が上がることで異常動作を起こしたり(部分的であっても)ハードウェアの寿命を縮めたりする可能性がある。

ここでは主にPi 2以降のRaspberry Piシリーズにおける発熱関係とその対策についてを扱う。

ハードウェア的な対策

ヒートシンクの装着

Raspberry Piシリーズ向けのヒートシンクが販売されており、スターターキットと呼ばれるセット品にも含まれていることが多い。ただし、その製品(形状やサイズ)は販売者によって異なる。

手元の3B+のスターターキットでは、SoC(CPUやGPUなどを詰め込んだチップ)を含めて2箇所分だけが用意されており、付属する熱伝導性両面テープの片方を剥がしてヒートシンクに貼り付けてから反対側を剥がして本体にくっつける形だった。やや頼りなさそうな感じもしたが、稼働中に指で触れるとそれなりに熱いため、きちんと熱を伝えてはいるようだ。

とは言え、空気の流れがないため、既にWebで検証記事を載せている方々の結果からも分かる通り、無いよりはマシといったレベルで、本格的に負荷をかけて運用する場合には不十分。

ヒートシンクだけを買い足すことについては個人的には費用対効果が悪いと考えており、別の対処法を推奨する。

ケースの変更やケース構成の変更

CPUに負荷をかけ続ける用途で使う場合、根本的な熱対策として、冷却に特化したファン付きのケースがあればそれを使うか、ケースの蓋部分などの一部を開けてUSB扇風機や冷却ファンを用意して風を本体上部へ送り込む。

一時しのぎとして、風を送らずに蓋部分などを開けておくだけでも少しは違いが出るが、空気の流れがあるのとないのとではかなり違いが出る。

夏場なので、ケースの一部を開けていると “黒い悪魔” や “G” と呼ばれるアレがケースに入り込む可能性が否定できないし、そうでなくても “家を守る” とされるあの小さな爬虫類が部屋にいる場合は入り込んでしまうかもしれない。その辺りに十分注意を払う必要がある。

よくスターターキットに含まれている密閉タイプのABS樹脂ケース(蓋を含めて3つの分離可能な部品から成るもの)があるが、これは蓋が上になるようにすると蓋の中央部にあるRaspberry Piのロゴになっている通気孔から熱が上方に出ていくようになっており、蓋を開けて風を当てる場合を除いてこの向きは変えないほうが効率的に熱が出ていくと思われる。

このケースは底面にも通気孔が多数あるので、ケースの下が空くように小さな物を下に置いて浮かせたり(ケースが少しだけ傾くようにする方法もある)、可能であれば底面側からファンなどで風を送るのも効果があるかもしれないが、本体上部へ直接風を送ったほうが冷却効果があると思われる。

GPIOピンを用いて冷却ファンを接続

冷却ファンの電源供給はPi本体のGPIOピンから行え、高回転数で回したいなら5V,遅めに回したいなら3.3Vのピンからといった選択もできる。

ファンの選び方としては、2本の線が出ていて端子がメスのものが接続しやすいため、その形で設置環境に合ったものを選ぶのがよい。

トランジスタやジャンプワイヤーを別途用意してPiのPWMモジュールにつながるGPIOピンを含めた接続を行いつつ制御用の小さなプログラムを用意して動かすことで、(PCのCPUファンのように)SoC温度を取得してその値による自動的な回転数制御(ファンコントロール)を行うことも技術的には可能らしい。複数の外部サイトでその詳細や制御用プログラムも公開されている。

ソフトウェア的な対策 (Raspbian)

自動的なCPUクロックダウン (サーマルスロットリング) とその設定

Raspberry Piの動作限界温度は85℃とされており、その温度が近づくとCPUのクロックを自動的に下げることでそこに達しないように設計されている。

ただ、そうは言っても室温25℃程度のPi 3B無印(ヒートシンク有・密閉タイプのケース)の環境でCPU使用率全コア100%の状態が数分続いただけで85℃を超えて異常動作となった人の体験談がWebにはあるので、密閉タイプのケースを使っている場合はもっと積極的に下げるようにする必要がありそう。ABS樹脂ケースを使用している場合の耐熱温度もやや気になる(70℃は超えないようにしたい)。

/boot/config.txtに温度の限界の値(摂氏)の記述を追加して再起動すると、CPUのクロックが自動的に下がる境目の温度がその値に応じて変わる。

[追記]ファイル名:/boot/config.txt

# 55℃を指定する例だが
# 真夏には常時55℃を超えてクロックが下がりっぱなしになる
# 性能を犠牲にしても温度をとにかく下げたい場合向け
# またはGPIO接続のサウンドカードを使用して音楽再生専用にする場合など
# 特殊な使い方でも有用かもしれないが、性能が下がりすぎることによって
# 問題が出る可能性は否定できない
temp_limit=55

手元の3B+(ヒートシンクのみ使用)では無負荷時にクロックが0.6GHzまでしか下がらないが、低めのtemp_limitを設定することで0.3GHzまで下がるようになっている。それでも室温や負荷のかけ方によっては簡単に “設定温度プラス10℃” の65℃を超えてしまう。

85を越える値が指定された場合、既定値であり動作限界温度でもある85℃が指定されたものとして動作する。

低めの温度を設定することの最大のデメリットは画面右上に常に温度警告のアイコン(3B+時点では温度計)が出てしまうこと。

画面出力をオフにする (効果大)

vcgencmd display_power 0を実行してHDMI出力をオフにして遠隔操作する(SSHやVNCのみで操作を行う)ことで、SoCの温度が大幅に(手元の3B+で5-7℃ぐらい?)下がる。逆にその状態から0の代わりに1を指定して画面出力を再度有効化すると温度が大幅に上がる。GPUのクロックが低い初代やZero系では温度変化の幅が小さくなるかもしれないが未確認。

最も大きなデメリットは、画面出力がオフとなることでGPUの支援を使用しての動画再生や画像閲覧ができなくなること。これも用途次第で、例えばGPIO接続のサウンドカードを接続して音楽再生専用にする場合などはオフにしたほうがSoCからサウンドカード側に行く熱を抑えられる。

実際、音楽再生に特化したPi用のディストリでは画面出力をオフにしてWebインターフェースで操作するようになっていたりする。

有線LANのリンク速度を落とす (3B+時点で効果があるが4以降では不明)

有線LANを使用していて、それほど帯域幅を使う用途で使っていない場合には、有線LANのリンク速度を10Mbpsに落とすことで100Mbpsのリンク時と比べてSoC温度を少し(手元の3B+で2℃ぐらい?)下げることができる。手元の3B+で何度か試したが、10Mbpsと100Mbpsとでは無通信時を含めてSoC温度に確実に差が出る。

(10Mbps全二重通信に設定)
$ sudo ethtool -s eth0 speed 10 duplex full

(100Mbps全二重通信に設定)
$ sudo ethtool -s eth0 speed 100 duplex full

(1000Mbps全二重通信に設定・3B+以降のみ)
$ sudo ethtool -s eth0 speed 1000 duplex full

手元のPCのオンボードLANでは一瞬でリンク速度変更の処理が完了するが、Pi 3B+では設定反映時に数秒から十数秒の間固まるような挙動になる。

手元の3B+は100Mbpsリンク時には(特に通信時に)高いピーピー音がよく鳴るが、10Mbpsリンクにするとある程度静かになった。

temp_limit=55を設定した手元の3B+では、30℃程度の室温でYouTubeの1280x720の60fpsの動画を10Mbpsリンクでも途中で止まることなくストリーミング再生できる(mpvで動画再生支援を使用して再生)。その際のCPUクロックは0.3GHzで動作しており、SoC温度は60℃台前半だった。

Pi 3B+までは有線LANが内部的にUSB 2.0経由となっているが、Pi 4からはハードウェア構成が変わってそうではなくなったため、リンク速度を落としたときに温度が下がるかどうかは分からない。

ビルドなどの重い作業を実機で行わない

Piで動かすソフトウェアをビルドする作業など、処理が重く時間もかかり、かつ実機でなくても可能な作業は実機で行わない。実機で行う必要のある作業をする場合でも、夏場にCPUの全コアを同時に分単位以上の時間ぶん回すのはできる限り避け、避けられない場合はファンなどで冷却する。

ソフトウェアのビルドをする必要がある場合、GNU/LinuxのインストールされたPCを用意して、QEMUのユーザモードのエミュレーション(microSDカードとRaspberry Piを参照)を用いて(x86版ではなく実機用の)Raspbian環境を作ってその中で必要な開発パッケージを入れたりソフトウェアのビルド作業を行ったりする。

開発パッケージ(lib[名前やその数字]-dev形式が多い)のインストール作業はmicroSDカードの書き込み可能回数を消費することにもつながるため、その観点からもPC上で行ったほうがよい。

カメラなど、Piに接続されたハードウェアからデータを取得する用途の場合、GPUの支援が利用可能な範囲の処理にとどめておいて、CPU処理が必要な部分がある場合はPCにデータを移してそちらで作業を行うのが理想的。もちろん、先述したようにPiの画面出力を切って操作はSSHかVNCで行ったほうが温度は下がるので、その形で作業を行うのがよい。

使用しないハードウェア機能の無効化 (温度変化は未検証)

boot/config.txtに記述を追加して再起動することで、特定のハードウェア機能を無効化することができる。

手元の環境で個別に温度の差を比較したわけではないため、実際に温度を下げる効果があるかは不明。消費電力についても未検証。

標準搭載のBluetooth機能を使わない場合

手元の3B+で無効化済み。dmesgでBluetooth関係のログが出なくなった。

dtoverlay=pi3-disable-bt

標準搭載の無線LAN機能を使わない場合

手元の3B+は用途の一つとして無線LANルータにしているため、無効化はしていない。無効にする場合は下を追記する。

dtoverlay=pi3-disable-wifi

オンボードサウンドとHDMIオーディオの無効化

これも手元の3B+では用途の都合で無効化していない。

(HDMIオーディオ含め)全く音を出さない用途の場合や外部サウンドカードを使用する場合、オンボードのサウンド機能を無効化することができる。

dtparam=audio=on

となっている行を

dtparam=audio=off

とするかコメントアウトする(既定値がoffとなっている)。

Raspberry PiシリーズのHDMIオーディオはグラフィックドライバではなくオンボードサウンドのドライバが担当しており、オンボードサウンドの出力のみを無効化することはできない。

音の出力についてはPulseAudioやJACK Audio Connection Kitを用いて他のマシンに送る方法もある。これらはPi側にサウンドデバイス/ドライバがなくても使用できる。