いつからか我が家のVAIO type Gのファンがぶんぶん回りっぱなしになっています。冬の間は「うるせえなあ…」と思う程度で済んだのですが、改めて本体を触るとかなり熱い。
これから夏を迎えるに当たって温度が心配になってきましたので、原因を探ってみました。
さて負荷をどうやって調べるかが問題です。ファンがブンブンしている状態でタスクマネージャを見ても0% のままで、負荷がかかっているのかすらわかりません。というわけで 1秒おきにrdtsc命令を発行し、その差分を表示するプログラムを書き(※)ました。
このプログラムが表示する値を理解するには、まずCPUの動作周波数がどうやって決まるか、rdtsc命令の返す値は何を表すか、を説明しなければなりません。付け焼き刃の知識で頑張って説明します。
(※)本来なら自分で書かなくても、Crystal CPUIDのReal Time Clock表示機能を使うべきです。しかしCrystal CPUIDは無駄に表示が凝っており、表示の負荷でシステムクロック周波数が上がる(rdtscの変化分が300MHzくらいまで)本末転倒状態だったので、没にしました。
まずCPUバスクロック(CPU <-> ノースブリッジバス)の説明から入ります。CPUバスクロックはシステムバスクロックの半整数倍です。VAIO君の場合はシステムクロック = 133MHz、CPUバスクロック = システムクロック(133MHz)x 4倍 = 533MHzのようです。
システムクロックはマザーボード上の水晶振動子(安い10MHz〜30MHzくらい?)を原発振としたPLL(Phase Locked Loop)で供給されます。PLLって何?と聞かれても詳しくは知らんので勘弁して下さい。
CPUバスはIntelの伝統でFSB(Front Side Bus)と呼ばれ(※)ますが、今回はCPUバスで通します。
ノースブリッジにはメモリコントローラが載っていてSDRAMが繋がっています。比較的高速のバス(AGPバス、PCI-e x16バス)などをノースブリッジに繋げることが多いようです。
ノースブリッジの先にはサウスブリッジが居て、PCIバス、PCI-e x1, x4バスなど、比較的低速のデバイスを繋ぐことが多いようです。
CPU <- (1) -> ノースブリッジ <- (2) -> サウスブリッジ
| | (PCIバス)
DDR SDRAM PCIデバイス
(1) FSB(Front Side Bus, Intel系), HyperTransport(AMD系)
(2) DMI(Direct Media Interface, Intel系), HyperTransport(AMD系)
別にこの2つでなければならないことはないです。
他の方式で接続するシステムも有るはず。
重要な点として、(1)、(2) のクロックとDDR SDRAMやPCIのクロックは全て同期しています。でないとデータのやりとりができないからだと思うんですが…。
そのためCPUバスと同様に、システムクロックから生成したバスクロックを用います。PCIバスだと33MHzを欲しがるので、システムクロック133MHz x 1/4 = 33MHzとします。
(※)"Front" Side Busに対して "Back" Side Busもあるのか?
BSBもあります、いや…ありました。BSBはCPU <-> 2次キャッシュのバスです。しかし最近はCPUに2次キャッシュも混載されているのでBSBは不要です。ですから「最近のシステムにはありません」という方が正しそう。
rdtsc命令とはCPU内部のタイムスタンプカウンタを読み出す命令です。Core系以前のCPUではrdtscのカウントアップ周波数 = CPU動作周波数でしたので、SpeedStepなどで倍率を変化させるとrdtscの増分も変化していました。しかしCore系では常に一定の周波数(Core Solo 1500Uの場合は最大動作周波数1330MHz)でカウントアップされます。
(hdk氏、ご指摘&情報提供ありがとうございます)
つまり、
過去のCPU: システムクロックx動作倍率(可変)
Core系: システムクロックx一定値
です。
じゃあ最初に書いたrdtscを見るプログラムって意味無くね?と思うのはまだ早いんだ、これが。
VAIO上で先ほどのプログラムを使ってrdtscの増分を見ると、システムの負荷によって変化します。rdtscの増分はシステムクロックx一定値、のはずですから、変化しているのはシステムクロック側と予想されます。
システムクロックを上げれば茨の道のオーバークロック(※)ですが、下げる方向に使えば省エネです。VAIOではCPUの省エネ機能(Enhanced SpeedStep)に飽きたらず、システムクロックも下げさらに省エネしようという設計なのでしょう。
(※)規定値よりシステムクロックを上げることをオーバークロックといいます。今までの説明からも類推できるように、システムクロックをメチャクチャ上げるとCPUバスクロック、さらにはPCIバス(1/4倍 = 33MHz)やAGPバス(1/2倍 = 66MHz)まで上がり、いずれバスに繋がっているデバイスの許容値を超えて異常動作したり動作しなくなります。
この問題の解決にはシステムクロックと周辺バスクロックの比率を変える必要があります。オーバークロックを売りにしているマザーボードだと比較的柔軟みたいです。
システムに負荷をかけると、システムクロックが最大値に張り付いてrdtscの増分も最大値である1330MHzに張り付きます。負荷が低いと50MHz程度(※)まで落ちます。
さて、今のVAIOを見ると 1330MHzに張り付きっぱなしです。ファンがずっとブンブンしているのはこのせいでしょう。
ファンのスピードはシステム負荷に連動しているようなので、rdtsc値の増分を下げる方向 = システムクロックを下げる方向へ改善することで「ファンがブンブン言う問題」は解決すると思われます。VAIOがシステム負荷をどうやって測定しているのかまではわかりませんでした。
(※)負荷が低いときはCPU内部動作周波数倍率は6.0倍まで落ちますので、rdtscカウンタの増分x 6/10が本来のシステムクロックです。まあ、その辺の細かい値は今回どうでもいいので、高い、中間、低い、くらいが見えればOKです。
というわけで犯人捜しです。片っ端からケーブルを引っこ抜いてみると、USB HDDを引っこ抜いた段階で50MHzくらいまで下がりました。犯人はこれかあ。手始めに、デバイスの取り外しで無効化してみたものの全く負荷が下がりません。
USB 2.0コントローラが有効な状態で一度USB HDDを認識させてから、USB 2.0コントローラ(Intel USB2 EHCI)を無効にすることで、USB 1.1の機器として再認識させると、負荷が下がりました。
これで解決ですね……って、こんなん毎回やってられんよ。面倒くさくて死にそう。
ひょっとするとHDDケース(センチュリーのやつだった気がする)がおかしいのかもしれません。こやつは Windows XPの起動時に電源ONだと100%BoDするという、怪しさ爆発デバイスです。
というわけで別のUSB HDDを繋いで、再度実験。やはり負荷が上がってダメです。さらに手持ちのデバイスで実験。
うーむ、どうもUSB Mass StrageがNGっぽいですね。WindowsのUSB EHCIドライバか、USB Mass Strageドライバのどちらかが常に負荷をかける作りになっているんでしょうか?これはノートPCの設計者に優しくない作りだなあ…。
まとめといた。
< | 2008 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
合計:
本日: