Cached I/O と Non-Cached I/O の違いをパフォーマンスカウンタで見てみたよ

高速・多機能ファイルコピーツールとして有名な,Fire File Copy というツールがあります.
Process Monitor で見てみたところ,Fire File Copy 4.8.0 (以下 FFC) は HDD に対してデフォルトで Non-Cached Synchronous I/O を使用しているようでした*1.ドキュメントによれば,書き込みと読み取りでスレッドを起こすことで読み書きを並列化しているとのことでした.
さて,Windows Vista RTM 版は,256 KB 以上のファイルコピーに非同期 Non-Cached I/O を用いていたこと以前書きましたが*2,これは FFC の読み書きスレッドをさらに複数並列化したものと考えれば分かりやすいでしょう.Vista RTM 版のファイルコピーの方向性は,実のところ FFC と似ていたというわけですね.
さて,FFC と Windows Vista SP1 標準のファイルコピーそれぞれでファイルをコピーさせながら,パフォーマンスカウンタを眺めることで,Cached I/O と Non-Cached I/O と違いが見えてくるか試してみましょう.

テスト条件

以下のようなテスト環境で,69 個,合計2.6 GB のファイルをディスク 0 からディスク 1 にコピーしてみました.

OS Windows Vista SP1
CPU Genuine Intel(R) CPU T2500 2.0 GHz
Memory PC2-667 2.00 GB
GPU ATI Mobility Radeon X1400
PhysicalDisk 0 HTS541010G9SA00 100 GB
PhysicalDisk 1 HTS541616J9SA00 160 GB
SSD 0 HEX-S8GJ 8 GB (4 GB for ReadyBoost)

この環境での CcDirtyPageThreshold は 256 MB です.
モニタしたパフォーマンスカウンタは以下の通りです.

  • Cache
    • Copy Reads/sec
    • Lazy Write Flushes/sec
    • Lazy Write Pages/sec
    • Read Aheads/sec
  • Memory
    • Modified Page List Bytes
    • Standby Cache Core Bytes
    • Standby Cache Normal Priority Bytes
    • Standby Cache Reserve Bytes
  • PhysicalDisk(0 E:)
    • % Disk Read Time
    • % Disk Write Time
    • Disk Read Bytes/sec
    • Disk Write Bytes/sec
  • PhysicalDisk(1 X: C:)
    • % Disk Read Time
    • % Disk Write Time
    • Disk Read Bytes/sec
    • Disk Write Bytes/sec
  • ReadyBoost キャッシュ
    • Bytes cached
    • Cache reads/sec
    • Hit read bytes/sec
    • Total read bytes/sec
    • Total write bytes/sec

今回のお話を要約すれば,私の独断と偏見で選んだパフォーマンスカウンタのログを取り,あとでだらだらと眺めながら Excel でグラフを書いてみましたよ,に尽きます.
『インサイド Windows』には他にもカウンタが紹介されてますので,興味がある方は参考にしてみて下さい.いっそのこと上に挙げたカテゴリに属する他のカウンタも全部取得してみるというのもありでしょう.

結果

実験は FFC,Explorer の順で行いましたが,若干 FFC の方が早くコピー完了しました.もっとも,その後また試したときは Explorer の方が早く終わることもありました.速度比較というよりは,アルゴリズムから予想されるパフォーマンスカウンタの変化を比べることをメインにした方が良いでしょう.
全ての結果の紹介はできませんので,生データをまとめた Excel 2007 形式のファイルを以下に置いておきます.興味がある方はどうぞ.

んで,いくつか面白かった点のピックアップです.

ディスク読み書き量の時間変化


上のグラフ,点線が Vista SP1 Explorer でファイルコピーをしたときの秒あたりの読み書き量で,実線が FFC でファイルコピーをしたときのものです.この値はシステム全体の読み書き量なので,ファイルコピー以外に起因する読み書きも含まれています.あと,読み込みと書き込みを行っているディスクは別であることにご注意下さい.
以下,軽く考察を書いておきます.

  • 立ち上がりについて
    • 読み取り速度の立ち上がり方は Cached I/O (Explorer),Non-Cached I/O (FFC) ともに同じ.
    • Non-Cached I/O での書き込み速度は最初からトップスピードなのに対し,Cached I/O による遅延書き込みがトップスピードにのるまで 15 秒近くかかっている.
  • 律速要素について
    • Cached I/O では,以前紹介した*3「書き込みの抑制」を介して,読み込みと書き込みが相互作用しているように見える.
      • 85 秒以降はほぼ完全に読み取り速度と書き込み速度が重なっている.
      • よく見ると,20 秒以降から時折読み込み速度の落ち込みが見られる.あとで示すのグラフの Standby Cache Reserve Bytes の値との相関もチェックすべし.
    • FFC では,最初から最後までほぼ一貫して読み書き速度が一致していて,全体的に書き込み律速になっていると考えられる.
      • FFC はバッファサイズを設定できて,今回はデフォルトの 40 MB のまま使っている.
  • 遅延書き込みについて
    • Explorer ではファイルの読み取り完了あたりでファイルコピーダイアログが終了するが,予想通りその後も遅延書き込みは続いている.

キャッシュメモリ使用量の時間変化

今度はキャッシュメモリ使用量の内訳と ReadyBoost Cache の時間変化.
まず Vista SP1 Explorer でファイルコピーをしたときのキャッシュメモリ変化からです.

適当な考察.

  • 遅延書き込みに利用している物理メモリは Standby Cache Reserve Bytes を切り崩して作っている模様.
    • 前のグラフで,20 秒あたりから「書き込みの抑制」の影響が出ていたかもと書いたが,確かにこの時点で既に Standby Cache Reserve Bytes の上昇が鈍化している.
    • 遅延書き込み完了後は Standby Cache Reserve Bytes に移動されていると考えると,形状の対称性の説明が付くかも.
    • 大量のファイルコピーの前後で,キャッシュの中身は結構入れ替わっているのかもしれない.
  • ReadyBoost Cache の初期値がここまで小さかった理由は不明.ただし,ファイルコピーが ReadyBoost Cache に影響を及ぼしてたのは確からしい.

次に FFC でファイルコピーをしたときの結果です.初期値を Explorer のときと揃えるのは無理でした.見にくいですが,以下の Modified Page List Bytes は Standby Cache Core Bytes とほぼ重なっています.40 MB あたりのがそれです.

こちらも適当な考察を.

  • FFC が設定で確保した 40 MB の物理メモリ以外は,物理メモリの使用状態に影響を与えていない模様.キャッシュを汚染しないクリーンなコピーが実現できている.
    • Non-Cached I/O では,読み書きしたファイルがディスクキャッシュに残らないので,これは予想通りの結果.
    • コピー先によっては,インデックスサービスやアンチウィルスソフトがすぐにファイルへアクセスすることになるので,これがベストかどうかは分からない.
  • ReadyBoost Cache の振る舞いはよく分からない.が,ファイルコピーが何らかの影響を及ぼしていたのは確からしい.

その他の結果

生データには入っているけど今回グラフ化をサボったものについて軽く一言.

  • ReadyBoost との相関は結構面白い.
    • 以前見たように,Non-Cached I/O でも ReadyBoost は活動していて*4,実際 HDD への読み書きと同じぐらい ReadyBoost メモリへも読み書きが発生している.
      • 寿命大丈夫か?
    • が,今回のケースではヒット率はほとんど 0 に近い.確かに大量のファイル読み書きで ReadyBoost が活躍できそうかというとかなり微妙.
      • 今回の結果への影響は軽微.

詳しくは Excel ファイルを直接どうぞ.

まとめと感想

  • 結論は使い慣れた Excel 2007 は良いねということで.
    • グラフを書くのにも大活躍.
    • 標準のパフォーマンスカウンタモニタツールは,実用面ではきつすぎる.
    • あんまりデータが増えてくると専用のデータマイニングツールが欲しくなってくるのかも.
  • FFC でコピー中のパフォーマンスログが表示されるとかっこいいのに.
  • それなりの数のパフォーマンスカウンタを並べてみると,OS の振る舞いを把握するのはそんなに難しくない.
    • ただしある程度予習も必要.
  • 何か新 OS で新しいベンチマーク結果が出ると「○○○○(ここに新機能の名前が入る)の効果と考えられる」という考察を並べるベンチマーク記事が多いけど,「それ××××(ここにパフォーマンスカウンタの名前が入る)で直接分かるよ」ということは結構ある.
    • とりあえず ReadyBoost のせいにして逃げている記事は「ReadyBoost キャッシュ - Hit read bytes/sec」がどれぐらいだったかぐらい示して欲しい.

*1:『[http://www.k3.dion.ne.jp/~kitt/pc/sw/ffc/help/opt.htm#writebuff:title=WRITEバッファリング - 使い方(オプション)]』にあるように,FFC では書き込みで Cached I/O を使用するかどうかをドライブごとに制御できるようです.Vista RTM 版と似たような考察がなされていて興味深いですね

*2:記事紹介: Inside Vista SP1 File Copy Improvements (1) - NyaRuRuの日記

*3:ユーザの感情に作用する遅延書き込みの仕組みを暴け - 記事紹介: Inside Vista SP1 File Copy Improvements (3) - NyaRuRuの日記

*4:ReadyBoost と FILE_FLAG_NO_BUFFERING - NyaRuRuの日記