1週間くらい前、なぜかPCのファン(その時はCPUファンと思ったが、実際にはケースファンだった)の音が少しうるさくなった。Linuxでは、マザーボードメーカー(ASUS)製のファンの回転数制御などをするプログラム(AI Suite II)は動かないので、BIOSの機能に任せていたのだが、それが良くないのか、BIOSの設定がおかしくなったのか、あるいは、暖かくなってエアコンをつけなくなって聞こえやすくなったのか、CPU負荷が高いせいなのか、原因は不明だった。

それで、Linuxに移行する時から、Linuxのfancontrolコマンドでファン回転数の制御をしたかったので、試してみることにした。実は、移行検討時にも試していたのだが、ファンの回転数が取得できなかったので諦めていた。今回、更に検索したら、Linuxの起動オプションの設定(/etc/default/grub: GRUB_CMDLINE_LINUX="acpi_enforce_resources=lax": 以下、"LAX")で取得できるようになることが分かったので、試したら取得できるようになった。ケースファン(その時は、CPUファンと思い込んでいた)が確かに1000rpm程度で回転していて、少し速かった。

しかし、そこからが謎だらけで大変だった。試したことを全部書くのは煩雑なので、主要なことだけを書くことにする。

散々苦労した末、fancontrolコマンドがなんとか動くようになって、CPU温度に追従してCPUファンの回転数が変化するようになった。

ただ、fancontrolの設定について調べているうちに、実は、マザーボードのチップ(SuperIO, NCT6776)には、ファンの回転数制御をする機能があることが分かった。BIOSはその機能でファンの制御をしているようだ。

それで、fancontrolはシステム負荷が非常に高かったりプログラムが異常終了した場合には、正常にファンが制御されなくなって、最悪の場合には熱でCPUが破損する可能性があるので、SuperIOの機能を使いたくなった。その時、Linuxから設定変更できれば、BIOSの設定画面を出すために再起動しなくて済むので便利だと思った。

ところが、マザーボードの残念な仕様のために、Linuxから設定を変更することが不可能なことが分かった。その仕様というのは、SuperIOからはCPU温度が取得できない(正確には、CPUTINに値は出るが、90℃などと異常な値になる。また、デジタル入力(PECIなど)はデータが取れない)ことだ。ハード的に接続されてないのか、Linuxからファン回転数を取得できる設定にしたために取得できなくなったのかは分からない。おそらく、CPUTINは前者、デジタル入力は後者だと思う。

試しに、LAXを解除して、SuperIOからCPU温度が取得できるか試したが、できなかった。それどころか、LinuxでSuperIOから取得できる情報が何もなくなってしまったから、SuperIOにアクセスするにはLAXが必要なのだろう。

それで、fancontrolを使うか、(今までと同じ)SuperIOの機能を使うかの選択となり、安全のために後者を選んだ。そして、詳しくは分からないが、LAXには危険な副作用があるとのことなので、無効にすることにした。

結局、それまでと何も変わらない結果になったのだが、なぜか、以前と同様、ファンの音がほとんど聞こえなくなった。

結局、うるさかった原因は、その時たまたまCPU負荷が高かった(ウイルススキャンをしていた)ためか、何かの拍子にBIOSの設定が変わってしまったかなのだろう。

諦め切れないものはあるのだが、ASUSのマザーボードのSuperIOで正しいCPU温度を取得することはできないというのが定説なので、まあ、諦めるしかないのだろう。

このマザーボード(P8H67-V)は気に入っているのだが、今になって思わぬ欠点が見つかってしまった。まあ、WindowsでなくLinuxを動かしても、ハード(SuperIO)が勝手にファン回転数制御をしてくれて、それでまったく問題ない(過熱しないし、うるさくもない)のだから、まあ、多くを望むべきでもなかろう。

(4/26 5:14追記) その後、やはりファンがうるさい気がするので、fancontrolを使うことにした。すると、ケースファンの回転数が約1200rpmから約800rpmに下がり、本当に静かになった。

fancontrolはSuperIO以外の温度も使って制御できるから、SuperIOでCPU温度を取得することができなくても使える。私は、以下のように、coretempというモジュールのtemp1_inputを使う設定にした。

  • hwmon1= coretemp-isa-0000
  • hwmon2= nct6776-isa-0290
  • CPUファン (hwmon2/pwm2) ← hwmon1/temp1_input
  • ケースファン (hwmon2/pwm1) ← hwmon2/temp1_input

(4/26 6:02追記) 更に調べたら分かってしまった! このマザーボードでは、CPU温度はSuperIO(NCT6776)のPECI Agent 0に入っているようだ。PECI Agent 0の温度はcoretempと異なる場合があるので、マザーボードの温度だと思い込んでいたのだが、ベンチマークで負荷を掛けるとcoretempと同じになるので、CPU温度であろう。実際、NCT6775シリーズのドライバのページにもそのように書いてある。

それで、再び、fancontrolを使うのを止めて、NCT6776のファン制御機能を設定するスクリプトを作り、OS起動時に実行するようにした。BIOSのデフォルトで問題なく設定されていたはずなのだが(実際、CPUファンについては正しい設定がされているようだ)、いつからかおかしくなってしまったようだ。以下に、設定値(僕の場合の例)を書く。

  • CPUファン (/sys/class/hwmon/hwmon2/pwm2*)
    • 温度源(pwm2_temp_sel): 7 (temp7_input, "PECI Agent 0")
    • 制御モード(pwm2_enable): 5 (Smart Fan IV)
    • 余裕温度(pwm2_temp_tolerance): 10000 (10℃)
    • 最低(ファン回転開始)温度(pwm2_auto_point1_temp): 30000 (30℃)
    • 最低(ファン回転開始)PWM(pwm2_auto_point1_pwm): 35000 (35℃)
    • 最高(限界)温度(pwm2_auto_point[2-5]_temp): 70000 (70℃)
    • 最高温度でのファンPWM(pwm2_auto_point[2-5]_pwm): 255
  • ケースファン (/sys/class/hwmon/hwmon2/pwm1*)
    • 温度源: 1 (temp1_input, "SYSTIN")
    • 制御モード: 5 (Smart Fan IV)
    • 余裕温度: 7℃
    • 最低(ファン回転開始)温度: 20℃
    • 最低(ファン回転開始)PWM: 95
    • 最高(限界)温度: 55℃
    • 最高温度でのファンPWM: 255

また、この設定は(ドライバの既知の問題のために)スリープからの復帰後に解除されてしまうので、復帰時に再設定するようにもした。

これで、システムの負荷が高い場合やfancontrolの異常終了時にCPUが過熱して破損するのを防げるし、余計なプロセスを動かさなくて済む。

※LAXを入れると、Xfce4のパネルウィジェットmulti-load-ngのCPU温度がおかしくなってしまうのは直らないので諦めることにし、別のプラグインで出すことにした。

安心していたら、スリープからの復帰後に、PECI Agent 0の温度が低いままになってしまうことが分かった。チップの設定が変わってしまうのだろうか。やっぱり、ちょっと残念なボードだ。。。 (4/26 6:42)

これも分かった。NCT6776のドライバがスリープに対応していないようなので、復帰後にmodprobeコマンドで再ロードするようにしたら直った。これで解決か!? そして、残念だったのはLinuxだったようだ。(4/26 7:18)

確認のため、ベンチマークソフト(sysbench)でCPUに負荷を掛けてCPUの温度を上げたら、ちゃんとCPUファンの回転数も上がった(下図の赤丸部分が、負荷を掛けた期間)。なお、CPU温度は55℃程度まで上がり、ファンの回転数は1300rpm程度まで上がった。 (4/26 7:53)

 

参考: 私のマザーボード(ASUS P8H67-V)での温度・ファンセンサ・ファン制御設定の内容一覧 (推定を含む)

coretemp-isa-0000 (/sys/class/hwmon/hwmon1):

  • temp1 (Physical id 0): CPU温度
  • temp[2-5] (Core 0-3): CPUコア1-4の温度

nct6776-isa-0290 (/sys/class/hwmon/hwmon2):

  • fan1: ケースファン回転数
  • fan2: CPUファン回転数
  • fan3: 電源ファン回転数
  • temp1 (SYSTIN): マザーボード温度
  • temp7 (PECI Agent 0): CPU温度
  • pwm1: ケースファンの制御設定
  • pwm2: CPUファンの制御設定

※nct6776-isa-0290のtemp2 (CPUTIN)、temp3 (AUXTIN)、pwm3は未接続と思われる。

(2017/4/27 4:47記)

PS. Linuxには、thermaldというちゃんとしたプログラムもある。これは、基本的にはCPUの周波数を調整して過熱を防ぐものらしい。が、それ以外に、設定すればファンも使えるようだ。だが、設定が面倒なせいなのか、検索してもこれを使っている例は出て来ず、fancontrolの例ばかりだった。そもそも、上述のように、僕のマザーボードにはファンを制御できるチップ(NCT6776)が載っているので、わざわざ設定して使うまでもないだろう。 (2017/4/27 7:28)

PS2. ケースには、もう一組、前面(HDDの前)にファンが2個ある(HDDファンと呼んでいる)。以前は、ケースファンと同じ系統の端子("Chasis fan 2")につないでいたが、この設定をしたら回転数が下がってHDDの温度が数度高目になるため、電源ファン(PWR fan)端子に接続している。この端子は回転数の調整ができないが、そもそも、SuperIOの機能ではHDD温度で調整することはできないので、諦めた。

なお、ファン端子に直結すると回転数が1500rpm前後と高過ぎて、ちょっとうるさいので、昔買った抵抗を入れて調整した。100Ωだと遅過ぎで、50Ωでも遅目なので、50Ωを2本並列にして25Ωにしたら、少し高目(900rpm程度)ではあるが、HDD温度が下がり、うるさくなくていい感じになった。(4/29 17:22)

  •   0
  •   1

コメントを書く

名前    

メール 

URL