Android タブレット(俗に言う中華パッド)関係の話題は「中華パッド研究所」へ徐々に移動させているところです。GF12(Impression i7)の話題もこちらに。

2013年9月17日火曜日

[linux]LinuxMint15でのAtom N270のCPU温度測定結果は正しくない模様

そのネットブックを手に入れたのはもう2年前。
AsusのEeePC 1001HAというエントリーモデル。



だけど、今やデスクトップの出番はないというほど使い倒している状態。確かに今や性能は見劣りはするけれど、メモリも実は2GBまでは搭載可能。

プリインストールされているWindows XPはHomeからProfessionalにアップグレードしてあるけどこれはまぁいいです。メインで使っているのは昔はUbuntu。今はLinuxMint(まだ14のまま)だったりします。仕事でもUbuntuつかってますので。

で、これが最近良く落ちます。夏も過ぎたというのに…



ブラウザで多数のページを開いていて、よそ見してしばらくたってからマウスをコン!と叩くとなぜか停止とかありえないことに。

メインで使っているブラウザがChromiumなので確かに負荷は高めですがちょっと酷い。本体の左下あたりにはCPUやチップセットが集まっていて、そこがだいたい熱くなりますが、そういえば最近ファンがあまり回らないな…と。最初ファン故障を疑ったのですが、Windows環境でブートするとちゃんと駆動しているので、これはLinux側の電源管理の問題ではないかという懸念が。

温度モニタアプレットを入れると、どうもおかしなことが。

温度低すぎ
EeePC1001HAに搭載されているのはAtom N270。これをマルチコアというのかシングルコアというのかはともかく(シングルコアです)。カーネル(coretempドライバ経由)から取得したプロセサの温度="Core 0"が32度ってのはありえない。同時に表示されている、二つはそれぞれacpiから取得した値ですが、だいたいこれが実感に近いです。

Jupiterは大丈夫か…いやすでに死んでいる

電源管理などで入れているアプリケーションは、EeePCに特化した機能を持つJupiterでした。まずこれがおかしくないか…と。



Jupiterはacpiから取ってきた温度を見ているみたい。しかしファン制御はどうなっているのか…。そういえばここ最近EeePCのファンの回転数調整がどうも動いていない気がする。

…と調べているとこれが2012年の12月でプロジェクト停止。そして2013の6月でSourceForgeのファイル更新も止まりました…acpid周りの変更の多さやらについていけなくなったのでしょうか。「Jupiterは上流(主にLinux Kernel)の実装が充実してもう無用になった」とか「Fuduntu Linuxに吸収される形で継承された」と言われてます(何れもJupiter開発者の弁)が、それも今は見えない気が。Jupiterの開発者でありFuduntuの創始者である、Andrew Wyattもまたこのプロジェクトを閉じてしまった。いまどうなってるんだ....

確かに、いつの頃からかホットキーのいくつかが取れなくなっていたりしていました。acpi_listenコマンドを起動して、いくつかホットキーを叩いてみるとわかりますが、イベントが上がってこないです…。

それはさておき。

カーネルドライバモジュール coretemp がいくつかのソフトウェアで温度監視の元になる値をプロセサの内蔵温度センサからとってきているわけですが、これが32度とかなら当然CPUがヒートアップした時の制御ソフトの動作はおかしくなるので、場合によってはオーバーヒートして死ぬことになります。Jupiterはすでに新しいカーネルに対応しきれていないのではないかという懸念が。

Jupiterの代替は?

探していて見つけたのはまずこの記事。

Solve Overheating Issue And Get More Battery Life In Ubuntu 13.04

Jupiter亡き後は、tlpというソフトウエアが最近は使われているようです。tlpはシェルスクリプトの集合ですが、インストールはUbuntuやLinuxMintの場合は

sudo add-apt-repository ppa:linrunner/tlp
sudo apt-get update
sudo apt-get install tlp tlp-rdw

でいいらしいです。
なお、余談ながらThinkPadなら

sudo apt-get install tp-smapi-dkms acpi-call-tools

で更に便利になるらしい。

さて、これでも実はまだ温度のハンドリングがおかしい。

tlp-stat -t

としてみると、

--- TLP 0.3.9 --------------------------------------------

+++ Temperatures
CPU temp               =    32 [°C]
Fan speed              = (not available)

ありえないですよね。tlpよ、お前もか。

coretempドライバは大丈夫か

こういう議論にたどり着く。


ここの議論の核は要約すれば「Intelが出してきているTjMax(接合温度上限〜通常これがプロセッサの動作可能温度の上限とされる)が正しくないんじゃないのか?」となります。

Coretempのカーネル文書を見てみると、N270はTjMax=90℃

45nm  Atom Processors
  D525/510/425/410    100
  K525/510/425/410    100
  Z670/650     90
  Z560/550/540/530P/530/520PT/520/515/510PT/510P 90
  Z510/500     90
  N570/550     100
  N475/470/455/450    100
  N280/270     90
  330/230      125
  E680/660/640/620    90
  E680T/660T/640T/620T    110
  E665C/645C     90
  E665CT/645CT     110
  CE4170/4150/4110    110
  CE4200 series     unknown
  CE5300 series     unknown


とされています。で、coretempの仕様より計測値を取ると…

# cat /sys/devices/platform/coretemp.0/temp2_input
32000

と32℃を示してますが、これを補正しないと温度が実際のCPU温度より低いままでtlpも動いてしまうでしょう。

解法…になるのか?coretemp報告値の修正

先のgooglecodeでの議論に戻ります。このコメントより、実際の温度は

Temperature = TjMax - TSlope * Value

つまり

「TjMaxの値(上限値)からセンサーより取得した値(Value)に何らかの係数(TSlope)を掛けて差し引かないといけない」

という話になるようですが…Linuxのドライバもこの計算で温度を求めているなら、実際はTSlopeはプロセッサによって一様であるはずはなく実装の放熱能力に左右されるはずです。CPUに直接放熱ファンが付けられているなら放熱は優秀でしょうが、EeePC1001HAは(分解してわかったことですが)直接ファンが付けられているわけではなく、キーボード下に金属製のプレートが置かれていて、そこでまず放熱し、それでも溜まる熱をファンで外に出している設計です。大した放熱能力は期待できないです。

幸いなことに、coretemp ドライバは、パラメータとして"tjmax=xxx"でTjMax値を上書きできるようです。

試しに、こうしてみます。

# rmmod coretemp
# modprobe coretemp tjmax=105

"Core 0"の値が46℃に変わりました。でも実際はもっと高いようです。

tjmax=118

あたりが妥当な線でしょう。これを /etc/modules に次の行を追加して反映。

coretemp tjmax=118

そして再起動。

治ったようです。が、様子を見て成功かどうか確認中。


1 件のコメント:

そらをみるひと / Watcher さんのコメント...

その後…

もちろん、温度制御がうまくないというのも一因ながら、どうも表示周りのドライバがうまくない感じです。

Intelから配布されている945GMのドライバに追随したいがために、Linux Mintやめました。1年くらい使ってたっけ…

バージョン変わるたびにHomeの内容移して…というのも大概嫌になったとかまぁ、Mintにはもう戻らんよ。多分。