自宅サーバー用に静音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℃を越えてしまった。

graph

ファンでの放熱できないため、 ヒートシンクに温度がたまり続けるのだろう。 この方法ではだめだ。

サーマルスロットリングを制御

そもそも、CPUにはサーマルスロットリング機能があるのだから、 その基準温度が100℃ではなくもっと低ければいいはずだ。

調べた所、Model-specific register(MSR)というものが、 CPUにはあり、それをいじる事でCPUの動作をカスタマイズできるらしいという事がわかった。

MSRについては、公式にマニュアルがあった。

https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-software-developers-manual-volume-4-model-specific-registers.html

このマニュアルによると、 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は熱かった。