ある夜、ふとPCの状態表示画面を見ると、あるHDD(新HGST)の温度が高くなっていた。高々2℃程度ではあるが、ずっと下がらず、原因も分からないので、気持ちが悪かった。原因として考えられたのは、以下である。

  1. たまたま気温(室温)が高かった。
  2. そのHDDに頻繁なアクセスが行われていた。
  3. そのHDDの内部で処理が行われていた。
  4. 冷却ファンの調子が悪い。

室温が高かったのなら、他のHDDやSSDの温度も上がるはずなので考えにくいし、アクセスや内部処理にしても、ちょっと調べた感じでは、特に何も行われていなかった。ファンについても、回転数は下がっていなかった。

それで、室温とPC内部の温度は違うのではないかと思い、HDD温度と同時に内部温度を測りたくなって、Amazonを調べたら、おもしろそうなUSB温度計があった。Linuxでも(純正ドライバではないが)使えるもので、約800円または約1600円だった。

「あと少しで注文」というところで、ふと思い付いた。「マザーボードの温度は、室温に同期(室温+α(=マザーボードの固定的な発熱))しているのではないか?」と。そうであれば、温度計を使わなくても、室温の推定ができる。実際、マザーボードの温度は、この時期は約32-34℃でほとんど変わらないので、室温に同期している可能性が高い。

そして更に思い付いた。ケースファンはマザーボードの温度で回転数制御しているのだが、マザーボードの温度がほとんど変わらないから、回転数も変わらず、制御している意味がない。それで、その回転数制御機能をHDDファンの回転数制御に使えないものだろうかと。

ただ、(以前も書いたように、)HDDの温度は外部ハードウェア(センサ)で取得できない(HDDのSMARTという仕組みで取得する)ので、回転数制御チップ(SuperIO)に入力されていないので、SuperIOの自動制御機能は使えない。ただ、手動(=プログラム)でファンに入れる電圧(またはパルス幅)を変えて回転数を設定することはできるので、HDDの温度に応じて回転数を制御するプログラムを作れば、HDDファンの回転数制御も可能だ。

おもしろそうだったので、早速作ってみた。最初の版は、昨日の夕方に30分くらいでできて、それなりに動いた。処理内容は以下のとおりである。

  1. 各HDDの温度を求める。: hddtempコマンドを使った。
  2. 最高の温度を求める。
  3. それに応じたファン回転数設定値(0-255)をファンの回転数制御レジスタに書き込む。: SuperIO(NCT6775)の"Smart Fan IV mode"同様の単純な比例計算にした。
  4. 次の処理時刻まで待つ(約30秒)。
  5. 1に戻る。

なお、元々HDDファンを接続していた端子は回転数(出力電圧)を設定(変更)できないので、ケースファンの端子と入れ替えた。また、今までは、HDDファンの騒音を減らすため、回転数を下げるために抵抗を介して接続していたが、今度はソフトで回転数が変更できるので、直結にした。代わりに、ケースファンの回転数が丁度良く(約900rpm)なるように、抵抗(100Ω)を使用した。

例によって、それからが長かった。結局、今日丸一日、調整や改良に費やした。改良の内容は以下のとおりである。

  • 回転数設定値の変化が少ない時は、更新しない。: ファン回転数の精度が良くなく、同じ設定値で30rpm程度上下し続けるため、頻繁に変更しても意味がない。
  • HDD温度が設定以下なら、ファンを停める。 : 静音化のため。
  • HDD温度が設定以上なら、通常より回転数を高くする。: 冷却が間に合わずに過熱することを避けるため。
  • HDD温度を移動平均する。 : HDD温度は一時的に微妙に上下することがあるので、その影響を避けるため。また、1℃単位でしか取得できないHDD温度を、もう少し細かく(小数点以下の値を出す)扱いたかったため。
  • HDD温度で直接制御するのでなく、HDD温度とマザーボード温度との差で制御するようにした。: 本来のHDDの発熱量は室温からの増分だから、室温を無視して回転数を設定しても、無意味だと考えたため。上述のとおり、マザーボード温度は室温と同期している(マザーボード温度= 室温+約5℃)と考えられるので、HDD温度とマザーボード温度との差を使うことにした。 → 失敗だった。詳細を追記する。(7/19 20:17)
  • 上の制御をしている時、(マザーボード温度との差でなく)HDDの絶対的な温度が設定値以上になったら、通常より回転数を高くする。 : システム負荷や気温が高くてマザーボードが熱くなった時に、HDDの過熱を防ぐため。→ 上が失敗だったので、取りやめた。(7/19 20:17)
  • マザーボード温度も移動平均する。
  • 想定しているマザーボードでない場合にエラーで終了する。: 忘れて別のPCに移してしまった場合の対処。

改良の結果、プログラム(スクリプト)の行数は4倍近くに膨れ上がったが、今のところ、うまく動いている。一番熱い新HGSTの温度(の青)は、概ね37-38℃に保たれている。CPU負荷が大きい時(の右の、オレンジと緑が山になっている部分)でも、マザーボード温度(の一番下の青)が上昇することはなかった。そのため、HDDファンの回転数(の一番上の緑)もほとんど変わっていない(中の急な山や谷は、プログラムの修正中の一時的なもの)。

ただ、暑く感じる時でもマザーボード温度がほとんど変動しないのが気になる。体感的な問題か、エアコンのせいだろうか? 論理的に考えれば、ペルチェ素子や水冷などの吸熱機構なしで、物の温度が(周囲の温度から独立して)一定に保たれることはあり得ないので、 室温に同期しているのは確かで、部屋に居る(=PCを動かしている)時はエアコンを動かしているので、室温はそれほど変動していない(せいぜい±1℃程度)が、体感温度が変動していると考えるしかない。ちょっと長期的に見てみたい。

(7/19 20:38追記) HDD温度と(室温と並行に変化する)マザーボード温度との差でファン回転数を制御する効果を調べるため、日中にPCを動かし続け、その間のHDDやマザーボードの温度やファン回転数の変化を調べた。

なお、室温も記録しようと、スマフォ(Nexus 4)のタイムラプス撮影用アプリ(EasyLapse)で15分おきに温度計を撮影していたのだが、大変期待外れなものだった。撮影開始の1時間後にスマフォがスリープしてしまっていて、たった4枚しか撮影されていなかったので、すごくがっかりした。また、撮影した画像は動画にするしかなく、動画に変換すると、「撮影したデータ」(静止画と思われる)が削除されてしまうし、「データ」を取り出す機能もないので、全く役立たずだった。このような用途には、「インターバル撮影」で検索した方が良かったようだ。

その結果、HDD温度とマザーボード温度も並行に変化しており、日中、室温がかなり高くなり、帰宅時に約30℃になっていたにも関わらず、ファンの回転数がほとんど上がっておらず、HDD温度は40℃まで上がっていた。

この原因を考えると、確かにHDD自体の発熱は室温との差なのだが、HDD温度もマザーボードと同様に、室温と並行に遷移するため、差は常にほぼ一定になるので、その差でファンの回転数を制御しても、ほとんど回転数が変化しないのである。

ちなみに、最高温度は、室温: 30℃(推定)、マザーボード: 35℃、HDD: 40℃だった。マザーボードとHDDの温度のグラフの形状は似ているので、それぞれは約5℃の差で並行に遷移するようだ(HDDがアイドル時)。

だから、やはり、絶対的なHDDの温度でファンの回転数を制御することに意味があるのだろう。そして、いくら室温が高くても(HDDの温度より低ければ)、風を当てればHDDは冷えるのだ。

マザーボード温度は、室温の推定には使えるが、冷却の制御には使えないようだ。名案だと思ったが、残念だ。

(7/22 7:12 グラフを追加)

(7/22 7:07追記) その後、回転数制御に絶対的なHDDの温度を使う方法に戻し、設定を調整して、再度、PCに苦行をさせてみたw 昨日の朝から夕方まで、冷房を停めた室内でPCを起動したままにして、その間の外気温・室温(注)、HDD温度、マザーボード温度、ファン回転数を記録した。以下に結果を示す。

測定終了時(19時頃)の状況(気温・室温以外は、その日の最大値だった):

  • 外気温
    • 今回: 30.0℃
    • 前回: 27.4℃
  • 室温
    • 今回: 32.8℃
    • 前回: 30.7℃
  • HDD(新HGST)の温度
    • 今回: 41.0℃ (室温+8.2℃)
    • 前回: 40.0℃(室温+9.3℃)
  • マザーボードの温度
    • 今回: 36.0℃ (室温+3.2℃)
    • 前回: 35.0℃ (室温+4.3℃)
  • HDDファンの回転数
    • 今回: 1216 rpm (通常時: 約1050rpm)
    • 前回: 1036 rpm (通常時: 約1050rpm)

今回は、期待どおり、HDD温度に合わせてファンの回転数が変化した(約100rpm/3℃)。ファンの回転数がほとんど変化しなかった前回と比べて、以下のようなことが分かった。

  • HDDの室温からの増分は、前回より1℃しか低くなかった。→ まだファンが遅い? 室温が高くて冷えない? HDDの熱容量は大きいので、1℃でも効果があったと考えられる?
  • マザーボード温度の増分も、前回より約1℃低かった。HDDファンが速くなった効果?

結論としては、期待ほどではなかったが、それなりにファン回転数制御の効果が見られたので、しばらく使ってみることにした。なお、ファンの回転数は約200rpmの余裕があり、まだ高速化することも可能だが、効果は疑問だし、その分うるさくなるので、更に高温になった場合に備えることにする。

注: 外気温と室温は、「beeCam Easy連写」というインターバル撮影アプリで温度計を撮影していたのだが、間抜けなことに、ACアダプタの電源を入れ忘れていて、約4時間でスマフォ(Nexus 4)が落ちてしまって、失敗した。また、このアプリも画像を外部に取リ出せないので、期待外れだった。次回(やるとしたら)は別のを使おう。どうも、名前に"Easy"と付いているのは良くない気がする。

 

PS.アイデアが浮かんで、プログラムを作って、更にアイデアが浮かんで来て、それを実現していくのはおもしろかったのだが、この制御の仕組みは今のマザーボード(ASUS P8H67-V)に大きく依存しているので、もしPCを新しくしたら、このプログラムはまず使えない。少なくとも、同じメーカーでないと無理だろう。その点が、ちょっともったいない気がする。でも、考え方は転用できるし、おもしろかったから良しとしよう。

そういう意味では、今のPCのハードとLinuxは、さまざまなカスタマイズをしてしまっていて、新しいPCに移転させるのは、ものすごく手間が掛かる気がする。カスタマイズした自分ですら、(記録はあるけど)何をどうしたか思い出せないので、同じことをやれる自信はないし、する気分にもならない。まあ、バックアップはあるし、まだ壊れていないので、その時に考えたい。

(7/18 6:24 加筆・修正)

  •   0
  •   0

4件のコメント

  1. naoki:

    ハードウェアの制御は,ソフトウェアだけで完結するものと違った面白さがありそうですね。

    レジスタなんて単語が出た時には思わず武者震いしてしまいました。
    (若い頃少し勤めたソフトウェアの小さな会社で,社長が私にアセンブラを教えようとした事があったのを思い出しました)

    •   1
    •   1
  2. PiuLento:

    ●まさに、そうなんです。(結構前から多いのですが、)ソフトだけで完結するプログラムもまあおもしろいのですが、ハードをいじらないと、プログラミングの本当のおもしろさは分からないように思います。ハードをいじってはじめて、プログラムが現実の世界と結びつくからでしょうかね。

    今Raspberry Piなんていう小さいコンピューターが流行っているのも、そういうことかも知れません。

    という訳で、悲しいかな、ソフトは単体では成り立たないということで、ソフト屋はハード屋と仲良くする必要があります。そこが難しいのですがw

    naokiさんはソフト会社にも勤められていたんですか。アセンブラは死ぬ程訳が分からなかったのではないでしょうか。今はもう書くことはないですが、結構苦手です。

    余談ですが、今のLinuxですと、レジスタはファイルになっているんです。ファイルを読むとレジスタの値が読め、そのファイルに数字を書くと設定できます。すごく便利で、最初は感動しました。

    •   0
    •   0
  3. naoki:

    レジスタがファイルになっているなんて,想像したこともありませんでした(驚

    当時勤めた会社では,なぜか社長に気に入られ,コンピュータを知るにはアセンブラも知るべきだという考えから,休日に会社行って教わりました。が,たった1回でお茶を濁しました。(そりゃまあ,休みたかったので)

    ただ,コンピュータというハードウェアをいじっているような感覚がありましたね。

    •   1
    •   0
  4. PiuLento:

    ●ええ、世の中はどんどん便利になってますねー。そういうのをいじっちゃうと、もう、Windowsなんてクソ過ぎてイライラしまくりなんですよw

    最初からアセンブラをやるのはキツ過ぎます。僕でも逃げ出しますよw しかも、休日なんて。うちのジジイトップに近いものがあるかも知れません(爆)

    そう、アセンブラはハードに最も近いので、使いこなせると、その感覚はすごいんです。ただ、今(といっても30年以上前から)は、Cやその後継言語で充分ハードがいじれるので、使う価値も場所もほとんどなくなってます。ただ、本当にカリカリにチューニングする人とか、趣味としてはいいでしょうね。

    •   0
    •   1

コメントを書く

名前    

メール 

URL