seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

少し古いノートPCにWindows8を入れたらCPUが本気を出してくれなくなったときの対応方法

要約

少し古いノートPCにWindows8を入れたら激遅になってしまった場合、

  • まず、タスクマネージャかパフォーマンスモニタで現在のCPUの速度を確認する
  • Windows Vista/7/2008/8などの最近のOSはCPUの省電力機能に対応してクロック数を可変できるようにしている。
    • Windows8の場合はタスクマネージャからCPU速度を確認できる。
      • Windows7/2008r2はパフォーマンスモニタから確認できる。
      • XPを含むWindows8,2008,7でもcpu-zなどの定番アプリでも確認できる。
    • CPUの速度が、なにをやっても最大速度の60%とか30%しか出ていなければ、Core2などCPUによるEIST(SppedStep)やCoQのクロック制御が効きすぎている。
    • その場合は、
  • まず、BIOSが最新であることを確認する
    • 最新でなかったら最新にする。(EISTの機能はCPU x BIOS x OSの3者連携によるもののため。)
  • 電源プランで高パフォーマンスを選択してみる
    • それでも改善がみられなければ、レジストリを変更してCPUまわりの省電力機能を変更できるようにする
    • 電源プランの詳細でCPUの省電力機能のパラメータを調整する

以上の手順で、CPUが定格速度を出し切れていない、という問題は回避できると思われる。


ポイントとしては、

  • Windows8は、Windows7と比較して運用上の体感速度的が著しく劣るということはない。
    • もし、ノートパソコンをXPからWindows8に入れ替えたら激遅になった、というならばCPUを疑ってみる。
      • ただし、すでにWindows7が入っているPCならば、それらの対応はされている可能性も高い。*1
  • Windows8のシャットダウンは実際にはハイバネート(休止モード)なので次回起動が激速になっている。
    • ただし前回の状態が残る可能性があるため、BIOSの更新後やレジストリの変更後は「再起動」をすること。

経緯

一年ちょいにわたる東京出稼ぎが終了することとなり、9月中旬にアパートからパソコン等を含む日用品の荷物のほとんどを持ち出した。
それで月末に、このアパートを引き払うまでは、パソコン環境は、2009年発売モデルのHPのProBook4510sを久しぶりに引っ張り出して使ってみようと思った。


HP ProBook 4510sは、時期的にいえばVistaモデルのXPダウングレード権つきモデルだったと思う。

http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c01747311&lang=en&cc=us&taskId=101&prodSeriesId=3934828&prodTypeId=321957

  • HP ProBook 4510s Notebook PC
  • CPU: Intel Mobile Core 2 Duo P8600 @ 2.40GHz
  • Chipset: Intel GM45/GM47
  • Graphics: Mobile Intel 4 Series Express Chip
  • PC2-6400(400MHz) 2GBx2


実際にはXPで使っていたのだが、Windows8の新機能の習得と、各種自作アプリのWindows8対応修正・確認作業用に、Windows8のまともな環境を用意しても良いかな、と思ったわけである。

少し前にVMWareWindows8を入れて試してみたことがあったので、問題もなくさっくり入るだろうなぁ、と予想していた。


で、実際にHP 4510sにWindows8を入れたところ、ディスプレイもオーディオもネットワークも、すべてのデバイスはOS標準のドライバで利用可能になり、まったく問題がなかったように見えたのである。

しかし、そのままVisual Studio 2012を入れはじめて、次第に環境を整え始めてから、だんだん違和感に気が付く。


うーむ、どうももっさりしている?


何か変なプロセスが動いているのかと思って、まず、タスクマネージャを開いてみると、何も動いていないのにタスクマネージャ自身がCPU負荷30%以上とか、ありえない数字を出している。

タスクマネージャ自身が30%以上とか、、、そんなバカな!!


これは何かまずいことになっているようだ、とGoogleさんにお伺いを立てようとIEを立ち上げようとする。

少し待つと、グラフィックス的にはパッと表示されるのだが、検索内容をキーボードから入れようとすると、一文字一文字反応が遅い。

イライラしながらも検索してみる。

検索自身は早いし表示も遅くはないのだが、スクロールが、めちゃくちゃ遅い。

右マウスボタンも、マウスが故障しかけているのかとおもうぐらい、クッとボタンをしっかり押し込まないとホップアップメニューが反応しない。

そして、検索してもタスクマネージャがCPU負荷をかける、それらしい記事がみあたらない。


しかし、あまりに遅すぎて検索するのも大変だ。

このIEは駄目だ、Chromeを入れてみよう、と思う。

今度は、さらに最悪な状況に。


Chromeのアドレスバーで検索内容をキーボードから入れようとすると一文字ごとにサジェストを検索しにゆくが、それが、むちゃくちゃ時間がかかる。

アドレスバーに検索文字を入れ終わるまでに30秒以上はかかって、イライラMAX状態。

ぶちきれてノーパソを壁に叩きつけたくなる衝動にかられる。


とりあえず、チューニングとして「パフォーマンス優先」にして「電源プランは高パフォーマンス」に設定してみるが、まったく効果なし。


いや、さすがに、これはおかしい。なにかが根本的に間違えている。

こんな遅いスペックのはずがない。



そして、ついにWindows8のタスクマネージャーの「速度」が「0.8GHz」とか出ていることに、ようやく違和感を感じ始める。



※ 画像は改善後のキャプチャなので、常時、ほぼ100%の速度が出てます。


「速度」のところが、0.8GHzにはりついたまま微動だにしない。

いや、800MHzで動作中ってこと? いやいやいや、そりゃ遅すぎますって。

800MHzのCPUで、最近のOS用のタスクマネージャを立ち上げたら、そりゃ30%ぐらいは食うかもしれん。

タスクマネージャがCPU負荷をかけてるんじゃなくて、そもそもCPUのキャパシティが足りてなくて相対負荷が高いだけなんだ!!


Core2などの省電力サポートのCPUが出回ってから、もう何年も立つし、それらのノートパソコンもデスクトップもたくさん使ってきたけれど、こうゆうトラブルははじめて経験した。


まだMixiをやってたころ、マイミクだった人がご自慢のPCにVistaを入れたらパフォーマンスが出なくなった、省電力まわりのトラブルらしい、みたいなことを嘆いていたことを思い出す。

これ臭いぞ。


で、Core2発売後ようやく5年目にして、EIST(Enhanced Intel SpeedStep Technology)について調べてみることにした。

EISTの役割は、あまり負荷がかかっていないときはCPUのクロックを落として省電力とし、負荷が高ければCPU速度を上げる、という機能とのこと。

この機能を生かすには、CPUだけではダメで、それに対応するWindows Vista以降のOSと、BIOSEISTに対応していなければならない。

つまり、CPU x BIOS x OSの3者がともに機能していなければダメらしい。


クソ遅い状態の中で「コンピュータの管理」から「イベントビューワ」の「システム」を開いてみると案の定、
「グループ 0 のプロセッサ 0 のスピードはシステム ファームウェアによって制限されます。プロセッサは、最後のレポート後 56 秒間このパフォーマンスが制限された状態にあります。」(イベントID: 37)
なんてエラーが発生している。


で、クソ遅いブラウザで検索してみると、このメッセージが出ているときは、

  • CPUの最高速度が制限されている状態に出るようである
  • これを解決するには、どうもBIOSを更新しなければだめらしい
    • BIOSによってはEISTの有効・無効を設定できるらしい。

ということがわかる。


でHPのページで調べてみると、いま使っているBIOSが、かなり古いもの、というか購入時から更新してなかったことが判明する。

http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareIndex.jsp?lang=en&cc=us&prodNameId=3934829&prodTypeId=321957&prodSeriesId=3934828&swLang=13&taskId=135&swEnvOID=1093#120

「 F.20 9 Dec 2011」の2011年末版が最新だが、使っていたのは2009年のまま。
そりゃ、古いかもしれん。


これで解決してくれ!!と祈りつつ、BIOSを更新。BIOS更新には、かなりの時間がかかるので、しばし放置。


で、BIOS更新してWindows8を起動したところ、かなり状況がよくなっている。

いろんな動作がキビキビしていてストレスがなく使えるようになっている。

そうそう、この感覚。本来は、このぐらいの速さはでるよねー。解決したかな、よかったよかった。

イベントログにも、先のエラーはでなくなっている。


それで、タスクマネージャを見ると、CPU速度はだいたい1.6GHzぐらいになっている。

まあ、EISTは可変クロックだから負荷がなければ1.6GHzぐらいなんだろうな。


でも、ちょっと気になるからsuperpiでも試してみよう。

あれ....おかしい。1.6GHzよりも上がらない。CPU負荷が70%ぐらいで頭打ちになっている。

superpiを使えば100%になるものだと思っていたのだが、最近のマシンはCPUよりも別のボトルネックがあるということなの!?!?

2コアあるから?

じゃあ、同時に2つ立ち上げてみよう。

....おかしい。CPU負荷が70%で頭打ちになっている。

どうゆうことだ??

Windows8だから??


※ 結局、どうして1.6GHzで頭打ちだったのかの原因はわからないが、Windows8のシャットダウンはハイバネートであるため、前回起動時の状態が残っていたためではないか、と推測している。何度か再起動したら治っていたようである。あるいは、電源オプションを設定しなおしたのがよかったのか...。よくわからない。 →原因らしきものが判明しました。下に追記しています。(2012/9/27)


BIOSは更新したし、このBIOSにはEISTの有効・無効を設定したり調整したりする項目は存在しない。

なので、EISTを無効にすることもできない。

EISTをOSから無効にする方法はないものか..。

「電源オプションの詳細設定」で「プロセッサの電源管理」を詳細設定できるようにするレジストリ変更方法

それで、さらに調べてみると、Windows 7/2008では「電源オプションの詳細設定」で「プロセッサの電源管理」という項目に細かな設定ができるようになっているらしいとわかる。

これは、Microsoftの公式ガイドにも書かれている。


レジストリを編集し、コントロールパネルの非表示フラグをoffにすることで、「電源オプションの詳細設定」で「プロセッサの電源管理」からCPUの省電力設定が細かく設定できるようになるのである。

どうやら、ほぼ同じことがWindows8でも使えるようである。


レジストリの設定方法は、このあたりにも詳しい。


レジストリエディタで以下のキーの
HKLM\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00\
そのしたにある各キーに
Attributes」という値があれば、それを「0」にする。

「0」にするとコントロールパネルに表示されるようになる。


それを変更後、「電源オプション」の電源プランから「詳細な電源設定の変更」を選択すると、
以下のように「プロセッサの電源管理」に多数の詳細設定項目が編集可能になる。


各項目の内容については前述の公式ガイドと、レジストリキーからGoogleで検索しても、いろいろな情報がひっかかる。


とりあえず、Windows7でのおすすめ例をみつけたので、それをベースに適用してみることとした。

参考URL


ただし、この設定だと、たしかに使っている最中は最高周波数まであげてくれて、しばらく放置してアイドル状態になると、CPUクロックがほぼ0まで縮退して省電力にものすごく貢献してくれる様子なのであるが、
プログラミングとかで「うーん」とか少し考えてからキーボードを打ち始めようとすると、10秒間ぐらい、ものすごく反応が遅くなってしまうことが判明した。


※ これはイベントログに「システム ファームウェアがスリープ状態への移行 (S4) の際にプロセッサの MTRR (Memory Type Range Registers) を変更しました。これによって、再開のパフォーマンスが低下する場合があります。」(イベントID: 137)とあるのと関連があるかもしれない。結局、現時点でのBIOSを最新にしても、まだ一般発売前のWindows8とは合わない部分があるのかもしれない。


これは、なかなかのストレスであり、
ノートPCだけど外出時に持ち運ぶことは想定していない、据置型ノートPCとして使うため、
もうCPUは、いつでも最高周波数でいいんじゃないの、と思わざるを得ない。

そこで、結局のところ、以下のように設定してみることとした。

詳細設定::高パフォーマンス
  • プロセッサの電源管理
    • プロセッサパフォーマンスの向上しきい値
      • バッテリ駆動: 30%
      • 電源に接続: 0%
    • プロセッサ パフォーマンスの待機時間感度に関するヒント
      • バッテリ駆動: 無効
      • 電源に接続: 無効
    • プロセッサ パフォーマンスの低下しきい値
      • バッテリ駆動: 10%
      • 電源に接続: 10%
    • プロセッサ パフォーマンスの低下ポリシー
      • バッテリ駆動: 単一
      • 電源に接続: 単一
    • プロセッサ パフォーマンスの向上ポリシー
      • バッテリ駆動: ロケット
      • 電源に接続: ロケット
    • プロセッサ アイドル降格しきい値
      • バッテリ駆動: 40%
      • 電源に接続: 10%
    • プロセッサ アイドル無効
      • バッテリ駆動: アイドルを有効にする
      • 電源に接続: アイドルを有効にする
      • Windows7/2008r2だと、「無効」にするとCPUは常に最高周波数になる様子
      • Windows8だと、「無効」にするとCPU負荷が常に100%になる。
    • プロセッサ アイドルしきい値スケーリング
      • バッテリ駆動: スケーリングを無効にする
      • 電源に接続: スケーリングを無効にする
    • プロセッサ アイドル昇格しきい値
      • バッテリ駆動: 60%
      • 電源に接続: 50%
    • 最少のプロセッサの状態
      • バッテリ駆動: 5%
      • 電源に接続: 100%
    • 最大のプロセッサの状態
      • バッテリ駆動: 100%
      • 電源に接続: 100%
    • プロセッサ パフォーマンスの向上モード
      • バッテリ駆動: アグレッシブ
      • 電源に接続: 効果的なアグレッシブ

こんな感じ。

赤字は、アイドル時でもCPU周波数を下げないようにしようと思って変えてみたところ。

※ アイドル時にコアを縮退するなどのパラメータもあるが、これらはデフォルト値のままとし省略している。
※ 一度、「規定のプランの復元」で各値を初期化してから、あらためて設定したほうがよいかも。


結論

こんな感じで、

  • BIOSの更新
  • レジストリ変更による「プロセッサの電源管理」を有効にする

の以上の対策で、とりあえず、このノートPCでもWindows 8は、快適にキビキビ動作してくれるようになった。


このノートPCを常用するのも今月末ぐらいまでなので、とりあえず、このぐらいのパフォーマンスが出せれば問題ないというか。


とりあえず、このパラメータ値が最適であるかはわからないが、まあ、このあたりをいじれば、なんとかなりそうな感じである。


以上、備忘録終了。



原因は電源だったみたい...orz (2012/09/27追記)

上記対策で1週間ぐらい快調に使えていたのだけれど、昨日、仕事から帰ってきて電源をいれたら、あきらかに遅い兆候が。


ついに再現しました。1.6GHzで頭打ちになる問題が。


BIOSも更新したし、レジストリも書き換えたのに、直ったんじゃなかったのか!?

他に、どんな手があるというのか。

いままで快調だったのは、なんだったのか?


とりあえずSession0ハイバネート*2が悪さしているのではないかと何度か再起動してみたり、
そういえば前回メモリチェックしたあとに快調になっていたような気がするから、とほとんどオカルト状態でメモリチェックやら、いろいろ試してみる。


ダメだ、ちっともよくならない。


レジストリを書き換えてもCPU周波数がぜんぜん変わらなくなっているので、
この設定値が無視されているのではないかと思い始める。


それで、AC電源を抜いてバッテリ動作に切り替えて、バッテリ側のレジストリ設定値が効いているのか確認してみることにした。


低周波数を50%、80%と増やしてゆくとパフォーマンスモニタの周波数のラインが上がってゆく。
おおっ、効いている!!

まさかと思って100%にしてみると、100%まで上がるではないか。


ええー?


ふたたび、AC電源をさしてみるとCPUが50%付近までガクンと落ちて、それ以上上がらなくなる。

AC電源を外してみると、100%まで跳ね上がる。

なんだこれ??



AC電源がダメでバッテリならOKって、どうゆうこと??
ふつう逆じゃないの?



で、ググってみました。

HP CompaqのノートパソコンはAC電源が劣化するとCPU速度が低下するのがデフォみたい。

探すまで気が付かなかったのですが、これ、かなり、よくある質問みたいでした。

いくつも記事があったのですが、たとえば、HP laptop go-slow caused by power supplyのブログ記事とか。


どうも、HP CompaqのノートパソコンはAC電源の質が悪いと低消費電力モードになるようなのである。

このhp4510sは安物なので、このブログ記事にあるようなスマートアダプタなる高級なものじゃないけれど、似たような機能があるのかもしれない。

惜しむらくは、すでにテスターなどの工具類は、すべて撤収してしまっていて、この部屋には電圧を確認する術がない、ということ。


しかし、もしかして〜、と思い、延長ケーブルを冷蔵庫とかがつながっている壁から、別のコンセントにかえてみた。

おおー、AC電源でも100%に回復したよ!!


ほんとうに、そんな機能がついていたのか、このノーパソには...。

コンセントの位置を変えたら速度が変わったということは、

  • このノートパソコンには、電源の状態によって周波数を変える機能は、たしかについているっぽい。
  • このレオパレスの屋内配線は、けっこう貧弱か、もしくはバランスが悪いのかも *3
  • (もしくは、このACアダプタが壊れかけていて、ランダムに、あるいは多少の衝撃によって電圧がよくなったり悪くなったりする?)

ということなんだろう。


ここ数日のイベントログを見てみたら、
たしかに、同じ時間帯に低パフォーマンス状態になっていたことが確認できた。
たまたま私が、その時間帯にパソコンを使ってなかったので気が付かなかっただけのようである。


たぶん、住人の帰宅時間なんだと思う...。洗濯機でも回していたか、レンヂでチンしてたのかな。
この状態は30分ぐらいで解消されている様子。

他にもCPUの速度を低下させる要因あり

さらにサーバー機などマザーボードによっては温度によって周波数を低下させる機能があったりするため、

  • 排熱が悪い筐体
  • 周辺温度が高い状態

で使用すると、起動直後は最速で動いていても発熱が進むことによってCPU速度が制限されてしまう、
つまり、しばらく使っているとCPUが遅くなるように見える、というような状況も発生しえることもわかった。


CPUが最高速度を出してくれないという状況には

  • 単純にBIOSが古い
  • 電源が安定していない、劣化している
  • 温度が高い、排熱処理がうまくいっていない

というようなケースがあることが分かった。


今回のケースでは、

  1. BIOSが古いため0.8GHzで固定されていて
  2. 電源が悪い環境で使おうしていたため、1.6GHzで固定され
  3. BIOS更新後、しばらく悪戦苦闘していたら、それとは関係なく電源が改善されたので100%になっていた?

ということのようである。

顛末

正直、レジストリ関係なかった...。


でも、

  • EIST、CnQの前提
    • BIOSは最新にしなければダメということ。
    • イベントログに、その旨エラーが出ることも見逃せない事実。
  • レジストリによるCPUの消費電力のチューニングの方法が分かったこと、
    • BIOSEISTを無効にできなくても、常に最大周波数を目標に設定できるらしいこと、
  • CPU周波数の調整が外部条件によっても可変されること
    • AC電源が安定しなかったりしても低パフォーマンスになる。あるいはACアダプタの劣化でも。
    • 周辺温度が高くても低パフォーマンスになる。排熱が悪いと次第にパフォーマンスが低下する現象にも。

などを知ることができたのは収穫だったと思う。


※ まあ、もう月末なので、このノートパソコンが活躍するのも、もう数日で終わりなんですけど。今回は、いろいろ勉強になりました。ほんとに。

以上、メモ終了

*1:Windows7を入れているPCをWindows8にするのは勿体ない気がするけれど。

*2:Win8のシャットダウンについてはWin8の目玉機能なので各所でとりあげられていますが、説明不足と思われたようでコメントをいただいたので、あらためて補足いたしますと、Win8のシャットダウンは端的にいえば「ログオフした状態でハイバネート」です。MSDNのブログにWin7のシャットダウンとスタートアップのプロセスとの手順の違いについて記載を見つけました。ポイントは"the key difference for Windows 8: as in Windows 7, we close the user sessions, but instead of closing the kernel session, we hibernate it." つまりシャットダウンによってユーザセッションはアンロードされますが、Session0のカーネルセッション(ロード済みのデバイスドライバやサービス)はアンロードされずにハイバネートされます。だからシステムの次回の起動が速いわけです。(ちなみに電源が切れるハイバネートなら電源投入後のデバイスの初期化処理はハードウェア的に必須なわけで、これは従来のハイバネートでも同様です。つまり、Win8のシャットダウン(セッション0のハイバネート)でも、デバイスは完全に電源が切れるため、次回起動時にデバイスが初期化される点は、従来のWin7のコールドブートと変わりません。再起動ではデバイスの電源が切れないためチップ内のメモリ等が初期化されない可能性があるなどでデバイスを確実にリセットしたいためにシャットダウンを好んでいたユーザはWin8でも同じ使い方はできますよ、ということかと思います。コメントではWin8以前の休止状態からの復帰ではデバイスの初期化をしないような書き方になっていますが、それは某日本語記事の書き方のせいでミスリードされてしまわれたのではないかと思います。)それを前提とすれば、たとえばWindows Updateなどでシステムファイルを書き換える場合など、使用中のため書き換えを保留していたり再ロード待ちのファイルがある場合、あるいはアンロードしなければ再初期化されないような状態をリセットするには、ハイバネートでは不味いじゃなかろうか、という意味で、再起動が必要な場合もあるはずと思うわけです。

*3:単相三線は片側に負荷をかけると電圧のバランスが崩れる