今、静音ミニPCが熱い
自宅サーバー用に静音PCを買った。
用途
うちの自宅サーバーは仮想化されていて、 物理的には1台に集まってる。
監視はprometheusで行なってるんだけど、 ある時、監視サーバーが落ちていて、 気がつかなかった。
サーバーを1台にしてしまうと、 そこが落ちてしまうと監視できない。
そこで、小さめのサーバーを物理的に追加しようと思った。
選定
監視サーバーなど、一部のサービスだけ動かす予定なので、 そこまで高性能なサーバーは必要ない。
一方で、場所を取らない小スペースな物を買おうと思った。
また、ファンの音がしない物を買おうと思った。
ファンレスなPCを探すと、 Celeronを搭載した小型ファンレスPCが数多くあった。
しかし、 今のCeleronの性能を調べたら、 ほぼRaspberry Pi4と同じぐらいしか性能がなさそうという事がわかった。
それだったら、Raspberryをサーバーとして用意した方がよさそう。
他の選択肢を探した所、 Core i5を搭載した小型PCもあった。
ノートPC用とはいえ、Core i5が搭載されているので、 RaspberryPiとは段違いの性能がでるだろう。 しかし、これらはファンがついているので、 要求にあわない。
更に調べた所、 マイナーメーカーのもので、 Core i5が搭載されていて、かつ、ファンレスのものも発見した。
今回は、EGLOBALというメーカーの、 Core i5-7267Uが搭載された物を購入した。 340ドル程だった。
問題
届いたマシンを電源を入れて、OSのアップデートをしていたところ、 本体がさわれない程発熱している事に気がついた。
温度計で計測すると、マシンのヒートシンクになっている部分が60℃、コア温度が93℃ぐらいになっていた。
IntelのCPUだから、コア温度は100℃まで動くだろうし、 それを越えてもサーマルスロットリングがあるだろうから、 壊れる事はないのだろうけど、 電解コンデンサが耐えられるのか疑問だし、 ケースが60℃もあると、ケーブルの抜き差しするのにさわれなくてこまる。
Core i5-7267UのTDPを調べたところ、 このCPUは30W程の電力を消費するようだ。 30Wといえば、小型のハンダゴテぐらいの消費電力だ。 これはたしかに、ヒートシンクだけでは放熱できないのもしかたない。
この発熱状態でOctane benchmarkを走らせた所、 スコアが38000あたりまで出ている。 性能は申し分ない。
なんとかしてここから発熱を抑えたい。
コアを制限してみる。
何か発熱を制限できないかとBIOSを見たところ、 クロックを制限する事はできないが、 コアの数を1つにする事やハイパースレッディングをオフにするはできそうだった。
元は2コア4スレッドだったので、性能は半分から1/4になるだろうから、 発熱は減りそう。
この状態で観測してみると、 計算負荷があるときの消費電力が8W程度で、 コア温度は65℃程度だった。
Octane benchmarkのスコアは27000程度だった。
これで良いかなと思ったが、 1時間半ほど連続で負荷を与えつづけた所、 コア温度が80℃を越えてしまった。
ファンでの放熱できないため、 ヒートシンクに温度がたまり続けるのだろう。 この方法ではだめだ。
サーマルスロットリングを制御
そもそも、CPUにはサーマルスロットリング機能があるのだから、 その基準温度が100℃ではなくもっと低ければいいはずだ。
調べた所、Model-specific register(MSR)というものが、 CPUにはあり、それをいじる事でCPUの動作をカスタマイズできるらしいという事がわかった。
MSRについては、公式にマニュアルがあった。
このマニュアルによると、 0x1A2Hにあるレジスタをいじればよさそう。
このレジスタは64bitで、リトルエンディアン16進数で、
0x XX XX XX XX AA BB XX XX
という形になっていて、
BBの所がCPUが定めたサーマルスロットリング温度(固定)で、
AAの所がBBから何度サーマルスロットリングを下げるかを設定できる。
debianだと、msr-toolsパッケージを入れて、sudo modprobe msr
した上で、
sudo rdmsr -a 0x1a2
を実行すれば現在の値がわかる。
このCPUの場合はBBは0x64(100℃)になっていて、AAは0になっていた。
ここでサーマルスロットリング温度を40℃下げて、60℃にするには、
sudo wrmsr -a 0x1a2 0x28000000
とした。
最初0xをつけ忘れて不正な値を書き込んでしまい、 その瞬間にマシンが落ちたので、注意されたい。
この結果、何時間負荷をかけてもコア温度は60℃を越えなくなった。 その分、クロックが下がる。
また、冷えている状態から60℃になるまで1分弱かかるので、 その間は全力で計算できるので、Octane benchmarkのスコアは落ちないところも気分がいい。
その他の方法
一般的に、こういう事をしたい時は、thermaldを使うのが普通のようだ。 thermaldは温度をもとにクロックを制御する以外に、ファンをコントロールしたりもできる。
一方、設定ファイルがXMLで書き方がよくわからないので、設定をカスタマイズするのが難しそうだ。
今回、このマシンの場合は制御すべきファンがないので、ファンがコントロールできる意味がないのと、 万が一マシンでOSが暴走するとクロック制御ができなくなってしまうので、 CPU内で処理が行われるサーマルスロットリングの方が安全ではないかと思うので、 サーマルスロットリングを使う事にした。
まとめ
静音PCは熱かった。