fc2ブログ

SuperfetchとPrefetchについて~(1)

一、
 Superfetchという機能は、XPに搭載されていたPrefetchの機能を拡張するものとしてVistaから採用され、両々相俟ってプログラムの起動を高速化する働きを持つとされる。しかし、WindowsにあってSuperfetchほど毀誉褒貶相半ばする機能も珍しい。その働きと効用がなかなか分かりづらいことが、我々利用者を混乱させているのかもしれない。

 SuperfetchとPrefetcherについて私には正確な知識がなかったので、改めて調べてみた。

 Technet Magazineの"Inside the Windows Vista Kernel: Part 2"でMicrosoftのTechnical FellowであるMark Russinovichは、「Windows XPには、以前のOS起動やアプリケーションの開始に基づき、予測されるコードやファイル・システムのデータをメモリに予め読み込んでおいてディスクに対する大きな入出力を行なうことにより、OS起動やアプリケーションのスタートアップのパフォーマンスを向上させるPrefetchというサポートを導入した」と述べ、Vistaでは「時間経過に伴う情報や先取り的なメモリ・マネージメントによって、アクセス頻度の最も低いものから順次追い出すというアプローチを強化したメモリ・マネージメントの仕組み」であるSuperfetchを採用した、と言う。

 続けて以下のように説明する。
 Superfetchは、Service Host processの内部で実行されるWindowsサービスとして実装され、メモリ・マネージャにディスク上のファイルやページングファイルからスタンバイ・リストにデータやコードを予め読み込むように指示し、ページに優先度を割り振るためだけでなく(メモリ・マネージャは優先順位を8段階に分ける)、ページの使用履歴を検索するするためにも、メモリ・マネージャの助けを借りる仕組みになっている。このサービスは、基本的には以前メモリ内に存在していたが、新たなデータやコードに空きを作るために再移動されたデータやコードにまでページ追跡機能を拡張するものである。その情報は、Prefetchのディレクトリ内にアプリケーションの起動を最適化するために用いられる通常のPrefetchファイルと並んで、拡張されたデータベースと共にシナリオ・ファイルとして保存される。このようなメモリ使用の詳細な情報を元にして、Superfetchは、物理メモリが利用可能になった時に、データやコードを事前に読み込むことができるのである。

 このメモリ使用の情報には、使用した曜日や時間帯も含まれていると言われており、Superfetchはユーザの細かなメモリ使用状況に配慮するものとなっているようである。

 Superfetchは、この概要を見る限りは、何ら問題のない実に素晴らしい機能に思える。

 また、アプリケーションが終了しあるいはメモリを解放した時、Superfetchはメモリ・マネージャに追い出されたばかりのデータやコードを取りに行くように指示を出すのだが、これは、メモリへの事前の読み込みがユーザや他の使用中のアプリケーションに影響を与えないように、優先度の非常に低い入出力操作によって毎秒数ページの割合で実行される、と説明されている。

 しかし、このような振る舞いをするSuperfetchは、Vistaのあまりに鈍い動作に憤懣やるかたないユーザによって槍玉に挙げられることになったのであろう。実際、使用状況やPC環境によっては、ディスクへの異常なアクセスが発生する場合があるようである。

二、
 Windows 7の登場に伴い、Superfetchも改良が加えられたようである。その一つがSSDへの対応である。

 "Support and Q&A for Solid-State Drives"(Engineering Windows 7 - MSDN Blogs)によると、SSDを備えた大部分のシステムにおいては、Superfetchは無効になるとされる。
 「システムディスクがSSDであり、さらにそのSSDがランダムリードにおいて適切なパフォーマンスを有し、ランダムライト又はフラッシュに甚だしいパフォーマンス上の問題がないならば、Superfetch、OS起動時のprefetch、アプリケーション起動のprefetch、ReadyBoost及びReadDriveは全て無効となる。
 当初は、全てのSSDにおいてこれらの機能の全てを無効とする設定にしていたが、しかし、いくつかのシステムにおいてかなりのパフォーマンスの後退に見舞われることになった。それらの後退を引き起こす原因について、初期のSSDの中には最終的に長時間にわたってディスクの読み出しがブロックされるという事態に至るほどの重大なランダムライト及びフラッシュ上の問題を抱えるものがあることが分かった。Superfetchと他のprefetchを再び有効にしてみると、大筋においてパフォーマンスは著しく改善した」と、そこには記載されている。

 これについては、"Performance Testing Guide for Windows"というペーパーに、「Windows 7では、SuperfetchはWindowsエクスペリエンス・ディスク・スコアが低いディスクに対しては自動的に有効となり、高いスコアのディスクに対しては無効となる」とも説明されている。

 そもそも物理メモリとHDDとの入出力の速度の差が大きいことから、PrefetcherないしSuperfetchという機能が求められたのであり、物理メモリほどではないにしろ、HDDに比べランダムリード及びライトが格段に速いSSDでは、それほど効果は得られないということなのであろう。

 ここで問題となるのは、それらの有効・無効をWindowsが自動で判断すると言うが、果たして適切にそれが行なわれているのであろうか、ということである。つまり、Superfetch等の機能を無効にしても問題のないSSDに対して有効にしている場合があるのではないか、ということである。

 これについては、TechNetのForumに"SSD and Windows 7"と題されたスレッドがあった。

 スレ主は、IntelのSSDにWindows 7 x64をインストールしたが、Superfetch等の機能が停止されておらず、なぜかWindows 7が私のSSDをSSDと認識していないと言う。Windows 7のバグではないか? Microsoftにそう問いただした。

 Microsoft側はこう答えている。

 「これらの機能は、SSDであるシステム・ディスクにおいては無効となります。そのディスクがシステム・ディスクでない場合には、そのブログ(Wikipediaの"Solid-state drive"を指す)の記述にあるようにパフォーマンスを改善するために再度有効にされます。Windows 7にうまくSSDをサポートさせるには、ファームウェアをアップグレードした方がよいでしょう」と。
 「私のファームウェア? 私の全てのSSDについてはTrimとともにIntelの最新のファームウェアにしています。なぜWindows 7は私のシステム・ディスクをSSDと認識しないのか?」とスレ主。

 その後、Microsoftは、再びファームウェアのアップデートとToolboxのインストールを勧め、スレ主は、既にファームウェアは最新のものだと前にも述べている、と苛立ち始める。

 「あなたはIntelに情報を求めるべく連絡を取りましたか? このSSDは現時点ではWindows 7でサポートされていないかもしれません。」
 「Intelとは連絡を取っていないし、Intel側がWindows 7とこのディスクについてあなた以上に知っているとは限らない。」

 「前に申し上げたように、システムが問い合せた時にドライブがSSDであると適切に報告を返さないドライブが多く存在し、そのためWindowsがそれらのドライブに対してSSDの最適化を適切に適用することができないのです。あなたは、製造者に正確な情報を得るために連絡を取る必要があります。さらに、あなたがPCに3台のSSDをインストールしていることに気が付きました。どうかSSDを1台だけ接続して、それがSSDとして検知され、正確にSSDの最適化が適用されるかみてください。」
 これがMicrosoft側からの最後の返信である。

 「問題はWindows 7にある」とするスレ主は、「SSDに問題あり」とするMicrosoftと平行線をたどったまま、二度と応ずることのなかったMicrosoftに憤りつつ、1年3か月以上の長きにわたって続いたスレッドでその鬱憤を、気に入らぬ書き込みをした者に時折ぶつけていたようである。

 煎じ詰めれば、Windows 7はSSDをSSDとして検知しない場合があり、その場合はSuperfetch等の機能は有効のままであるから、それらの機能を不要と考えるならば、手動で無効にするほかない、ということになろう。

 我がPCはといえば、システム・ディスクとして2台のSSDをRAID 0にしてあり、Windowsエクスペリエンス・インデックスのプライマリハードディスクのスコアは7.9の最高値であるのだが、やはりSSDとして検知しなかったようで、Superfetch等は有効のままであった。

【追記】:CrucialのC300(64GB)、1台をシステム・ディスクにしたWin7(32bit)機では、SSDが認識され、Microsoftが言うようにSuperfetchのサービスは自動的に停止されている。RAIDの場合はSSDであってもSSDと認識されないようである。


三、
 さて、SSD2台をRAID 0にしてWindows 7 SP1 64bitをインストールしてある我がPCは、SuperfetchやPrefetcherを無効にすべきか、有効のままにしておくべきか。

 関連するPC環境は、
 SSD : Crucial m4 CT128M4SSD2(128GB)×2 RAID 0
 Memory : CFD T3U1333Q-2G (2GB 3枚組) 計6GB
 である。

 まず、Superfetchの設定には、[コントロールパネル]⇒[管理ツール]⇒[サービス]から[Superfetch]の右クリックで[プロパティ]⇒[スタートアップの種類]の[自動](有効)又は[無効]を選ぶという方法がある。このサービスは「Superfetch」という名称であるが、prefetchするためのデータベースや「.pf」ファイルを作成する機能を管理しているようなので、これを無効にすると、SuperfetchのみならずPrefetcherの機能も停止することになるから注意を要する。

 また、レジストリを操作することにより、SuperfetchとPrefetcherの有効・無効を個別に設定することができ、しかも、それぞれの適用場面を、大まかではあるが、変えることができる。これについては、Microsoft Answersに解説がある(「SuperFetch がキャッシュするアプリケーションやファイルを設定することはできますか?」)。

 regedit.exeを起動し、[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters]までたどり、その中にある[EnablePrefetcher]と[EnableSuperfetch]の右クリックの[修正]で値を「0」~「3」のいずれかに変更して、適用場面を変えることができると、そこにある。それぞれの値の意味は次の通りである。

 「0」:キャッシュを無効にする。
 「1」:キャッシュがユーザの実行したアプリケーションにのみ適用される。
 「2」:キャッシュが起動ファイル(システム・ファイル、サービス、スタートアップ・プログラム等)にのみ適用される。
 「3」:全てをキャッシュする(デフォルト)。

 Prefetcherに関しては、デフォルトの「3」のままで通常は問題ないようである。SSDの場合でも有効でよいのではなかろうか。

 問題は、Superfetchをどうするかである。
 「0」の無効にしてしばらく使ってみたが、アプリケーションの立ち上がりに時間がかるようになった。例えば、Photoshop CS5の起動に、「3」の全て有効の場合には3秒ほどしかかからなかったが、無効にした場合は7~8秒かかるのである。SSDであってもやはり、Superfetchの効果は充分に認められるので、再び「3」に戻すことにした。

SSDには、書き込み可能回数という制限があり、10000回とも物によっては5000回とも言われていることから、その延命を図るために、できるだけ無用な書き込みを減らそうとして、インデックスの作成やSuperfetchを無効にした方がよいという意見がある。私もそれを鵜呑みにして、そのためだけにSuperfetchを無効にしたりしたのである。
 しかし、SSDにはウェアレベリングという寿命を延ばす機能が備わっており、寿命を心配する必要はないようである。
 「SSD耐久テスト」というウェブページ(突然、2014年6月1日に「SSD耐久テスト」の更新終了。その後、これを掲載していたBotchyWorldというサイトも閉鎖。「SSD耐久テスト」の内容はBTOパソコン.jpが記録保管しており(「SSD耐久テスト - BotchyWorld補完計画」)、http://bto-pc.jp/botchyworld/で見ることができる。)によると、例えばintel X25-Vの120GBの場合、1日10GBの書き込みを毎日続けたとして寿命が尽きるのに約51年かかる計算になるらしい。SSDの価格は年々下がっており、寿命が尽きる頃には安価に入れ替えができるであろうから、神経質にならず、せっかく大枚をはたいてSSDをあがなう以上、その高速アクセスを満喫しした方がよろしいようで。
 上記のウェブページ「SSD耐久テスト」には、Intelや東芝等の新品のSSDに対して書き込みをし続けるというプログラムを組み、1日15時間延々と寿命が尽きるまでテストした記録が掲載されている。実に奇特な、驚歎すべき実験である。寿命を算出する計算式も見事である。一読の価値はある(2012年5月21日現在、Crucial C300 64GBのテストが進行中)。
 また、SSDの寿命に関しては、我々素人には少し難解な点もあるが、「Lansenの現実逃避日記」も参考に。


 ところが、大量のデータを長時間処理し続けると、突如一つ一つの操作に極端に時間がかかるようになり、PC全般の反応が鈍くなるのである。これは、スラッシングに陥っている状態なのであろうか、あるいはスラッシングには至っていないがページ・フォールトが頻発している状態なのであろうか。いずれにしろ、メモリ不足が生じているのは確かである。 「Superfetchは予め読み込まれたページをシステムのスタンバイ・リストに追加するが、そのスタンバイ・リストは長期にわたってメモリに有益なデータを保持するように再編成され、再設計されて」("Performance Testing Guide for Windows")おり、「Superfetchは、キーボード又はマウスからのインプットが少なくとも1分間に1回行なわれる限り、システムを監視する」(同書)とされているから、キーを叩きマウスをクリックし続けている限り、Superfetchはシステムを監視し続けることになる。このような働きをするSuperfetchは、PCが重くなる要因の一つと考えられているようであり、このような現象を避けるためとして無効を選ぶ人もいるようである。

 まさに痛し痒しである。Superfetchを有効にするにしても、「起動ファイルのみ」かあるいは「アプリケーションのみ」にして、何とかその効用と弊害のバランスをとろうとする人もいるのである。

 ここで注意すべきことは、SuperfetchやPrefetcherの設定の変更、あるいはアプリケーションのアンインストールなど、システム上重要な変更を行なった場合には、C:\Windows\Prefetchフォルダ内のReadyBootフォルダを除く全てのファイルを削除すべきである、ということである(前掲Microsoft Answers、"Performance Testing Guide for Windows"参照)。再起動後に改めてSuperfetch及びPrefetchファイルが再構築されることになる。

【追記】:(ReadyboostとReadybootを混同した頓珍漢な記述をしていたので、それを削除し、改めて両者の異同を確認しておく。)
 ReadyboostとReadybootは、「s」の一字の有無が異なるだけの非常に紛らわしい用語であり、MSDNのペーパーにおいてもReadyboostをReadybootと誤記している箇所があるくらいである("Windows PC Accelerators")。

 その"Windows PC Accelerators"及び"Windows Internals sixth edition Part 2"(pp.346-348, pp527-528)によると、両者はRAMやフラッシュメモリ等の高速なディバイスを利用して、HDDの伝送速度の遅さを補おうとする点で共通する。ともにPCの高速化に寄与する働きをする。

 両者の相違点は、Readybootが、文字通りWindowsの起動を最適化しようとするものであるのに対し、Readyboostは、それに限らずHDDの読み書きのすべてを高速化しようとするものである。

 起動ごとに、どのファイルがRAM(Random Access Memory)にキャッシュされ、そのファイルはHDDのどこに位置するのかといった情報がReadybootフォルダに保存され、それに基づき次回の起動のためにキャッシング計画が立てられ、それに沿って次回の起動が進められる。それによって、起動時間の短縮が図られることになる。Readybootフォルダに保存される起動時の追跡ファイルは、Trace1.fx、Trace2.fx、Trace3.fx…と順次番号が振られ、常に最新の5つのファイルが保存されることになっている(Trace10.fxに至るとTrace1.fxに回帰する)。
 これがReadybootの仕組みであるが、これらの.fxファイルを分析し、キャッシング計画を立てるのは、Readyboostサービスであり、そのキャッシュもReadyboostと同じディバイス・ドライバ(Ecache.sys)によって実装されると説明されている。
 Readyboot自体は、Superfetch(Sysmain)サービスの一部として実装されており、Superfetchが無効となると、Readybootも停止される。

 Readyboostは、Rdyboost.sysというドライバとして実装され、その機能は、その開発時の名称である"External Memory Device"が表しているように、主に外部メモリ・ディバイスとしてSSDといった高速ドライブの一部をキャッシュ領域として利用し、RAMとHDDとの間に介在して読み書きをより高速化しようとするものである。接続されたディバイスが一定以上の転送速度であると検知されると、利用者にReadyboostの許可が求められる。利用者がReadyboostを許可すると、そのドライブのルートディレクトリにReadyboost.sfcacheというファイルが作られ、それがキャッシュとして利用される。キャッシュされたデータは、安全を考慮して暗号化される。この点、Readybootモードにおいては、RAM上のキャッシュはサービス開始後50秒で削除されるため、暗号化されることはない。

 ただし、SSDをシステムディスクにしている場合には、リムーバブルディスクとして認識された他のSSD等のプロパティの[ReadyBoost]タブには「このコンピューターのシステムディスクは十分に高速であるため、ReadyBoostが有効になっていません。ReadyBoostでさらにパフォーマンスが向上する可能性は小さいと考えられます。」と表示され、システムディスクのアクセス速度が一定以上であれば、自動的にReadyboostは無効となる。その場合、通常は、Superfetch等も無効となっているはずである。

 しかし、我が機のようにSSDをシステムディスクとしていながら、レジストリを操作して敢えてSuperfetchを有効とした場合、Superfetch(Sysmain)サービスの一部であるReadybootは有効となるから、Readybootフォルダ内に起動追跡ファイルは生成される。ところが、ReadyboostもSysmainサービスが担当するのであるから、SysmainサービスがオフになっているとReadyboostは有効とならないのは当然であるが、Sysmainサービスが手動で有効にされたとしても、Readyboostサービスは、システムディスクとして使用するSSD等のパフォーマンスをテストし、その結果によって(エクスペリエンスインデックスを参考にしているらしい)、独自にReadyboostを有効とすべきかどうかを判断しているようである。

 従って、TraceX.fxファイルは生成されるが、Readyboostが無効になっているため、それらファイルに基づいたキャッシング計画は立てられておらず、それによるReadybootが行われていないこともあると考えられる。実際、我がPCのレジストリを覗くと、そのキャッシング計画が格納されているHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\rdyboost\Parameters内のLastBootPlanUserTimeには1年以上も前の日付が記録されており、キャッシュに関する統計情報が格納されているはずのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Ecache\Parameters\ReadyBootStatsは存在しない。

 
 また、Superfetchの設定をどうするかを検討する際に、もう一つ考慮すべきことがある。メモリの容量である。

 当初、それほどメモリは必要なかろうと判断して6GB(2GB×3)にしていたが、もう一組6GBを追加して計12GBにすることにした。メモリを増量すれば、メモリ・マネージメントに余裕をもたせることができ、Superfetchの働きに有益にこそなれ、不利益になることはなかろう、と考えたからである。

 取り敢えず、メモリを12GBにし、Superfetch、Prefetcherともに「3」の全て有効にして様子をみることにする。

※【この続きは「SuperfetchとPrefetchについて~(2)」を御覧下さい。】

tag : SuperfetchPrefetchSSDメモリマネージャReadybootReadyboost

コメントの投稿

管理者にだけ表示を許可する

No title

有り難う御座います。

了解いたしました。

Re: No title

Luciferさん、
コメントありがとうございます。

"Performance Testing Guide for Windows"のご指摘の箇所を改めて確認しました。

"If you make significant system configuration changes, such as changes to drivers, services, or applications that start automatically, remove the \Windows\Prefetch directory and all its contents from the system drive. This removal eliminates any stale prefetched data. You must then retrain the system."
となっており、「ReadyBootフォルダを除く」という限定を加える文言は見られません。"August 18, 2009"版以降、改訂はないようですから、私が独自に付け加えたものと思われます(10年ほど前に書いたものですから何故付け加えたのかは思い出せません)。明らかに不要な文言ですので、削除することにいたします。失礼いたしました。ご指摘ありがとうございます。

また、Windows 10のSuperfetch・Prefetchに関するMicrosoft側の新たな情報は、私も少し検索してみましたが、見つけることができませんでした。

現在ほとんどのマシンでは、OSを始めとするソフトはNVMe SSDやSATA SSDにインストールしており、SuperfetchおよびPrefetchのサービスを利用することがないので、これに関する情報については疎くなっております。申し訳ありません。

No title

興味深く拝見しました。

> ここで注意すべきことは、SuperfetchやPrefetcherの設定の変更、あるいはアプリケーションのアンインストールなど、システム上重要な変更を行なった場合には、C:\Windows\Prefetchフォルダ内のReadyBootフォルダを除く全てのファイルを削除すべきである、ということである(前掲Microsoft Answers、"Performance Testing Guide for Windows"参照)。再起動後に改めてSuperfetch及びPrefetchファイルが再構築されることになる。

との事ですが
Performance Testing Guide for Windows
を現在確認すると
\ Windows \ Prefetchディレクトリとそのすべての内容をシステムドライブから削除してください。
と成っている様です。
変更された?!

後 Windows 10 に関しての Microsoft 側の情報を探していますが引っかからない、ご存じならばブログ上に UP していただければ幸いです。
プロフィール

そんぷうし ふうえん

Author:そんぷうし ふうえん

忙中閑は、こっそりと見出す。
カミさんと子どもたちが寝静まるのを待って、夜な夜なPCの前に端座し、その不可思議なる箱の内奥にそっと手を入れては、悦に入る日々なのであります。
時としてその手はPC以外の内奥にも。


※ リンク貼付及び引用は自由ですが、引用する場合は該当ページのURL及びタイトルを明記して下さい。

Automatic Translation
If you click a language below on any page, the translator is supposed to display the latest page at first. So you need to jump back to the previous page you were about to read.
Please note that there are some translations that are non-grammatical and do not accurately reflect the meaning of the originals because of machine translation.
 【Translated by Google Translate】
全記事一覧表示

   全ての記事のタイトルを表示する

最新記事
カテゴリ別アーカイブ
最新コメント
月別アーカイブ
検索フォーム
リンク
最新トラックバック
RSSリンクの表示
累計閲覧回数
  
QRコード
QR