十分に物理メモリを搭載しているにもかかわらずスワップアウトが発生する理由 - 動画版

id:NyaRuRu:20071010:p1 の動画版.
Windows XP で,物理メモリは十分に余っているにもかかわらず,単にウィンドウを最小化しただけでページファイルへの出力が行われている場面を,動画で撮ってみました.

テスト環境について

動画の環境は,Windows XP x86 版 SP2,メモリ 1.5 GB,ページファイル 512 MB という環境です.
実験には Firefox 2.0.0.8 を使用し,あらかじめ config.trim_on_minimize を true に (つまり Windows のデフォルト動作) にしておきます.Firefox を起動し,「最新ニュース」→右クリック→「タブを全て開く」タブを 40 個程度開きます.Firefox は,これで 200 MB 近くワーキングセットを消費しましたが,物理メモリは合計 1.5 GB あるのでまだまだ余裕です.
ここで,パフォーマンスカウンタの「Memory - Pages Output/sec」と「Paging file - % Usage」を表示しておきます.ページファイルの使用率が 2 % とごくわずかであることを確認し,Firefox のウィンドウを最小化します.
ウィンドウ最小化直後から,ページファイルへ書き込みがだいたい一秒間に 100 回程度の割合で続き,ページファイルの使用率が増加を始めます.

この後何が起きるか?

動画はページファイルへの書き出しが始まったところで終わっていますが,最終的に書き込みが停止した時には,ページファイルの使用率は 22 % 程度 (100 MB の増加) になっていました.
このとき,1.5 GB のメモリはまだ 1 GB 以上余っています.にもかかわらず,200 MB 程度メモリを使用していたアプリケーションを最小化しただけで,100 MB 程度のメモリの内容がページファイルに書き出されたということになります.
書き出された直後の状態では,物理メモリにも同じ内容がまだ残っています.id:NyaRuRu:20071010:p1 でも述べたように,これはディスク上のデータが物理メモリ上にキャッシュされているのと同じ状態です.
そして,あとはその他のファイルキャッシュとのヒット率の競争です.いくらメモリが 1GB も余っているからといって,音楽ファイルを流し続けたり,動画を見続けたりすれば,相対的に Firefox の使用していたメモリは「最近使用されていない」とみなされ,別の用途に転用されてしまうだろう,というわけです.
Windows Vista でのメモリマネージャの改良を理解するための基礎となる,XP までの基本動作の解説が世間に不足しているのはちょっと残念です.

簡単に再現できます

みなさんも,Windows XP を使っていて,適当に目立つぐらい大きなワーキングセットのアプリケーション (Visual Studio や nternet Explorer などが良いでしょう) があれば,上のパフォーマンスカウンタを表示させながらそのウィンドウを最小化してみてください.
空きメモリに関わらず,ページファイルへの書き出しが発生しているのではないでしょうか?

これ,お気づきでしたか?

さてこの“メモリが余っているにも関わらず”ページファイルに書き出しが行われるという挙動,皆さんはお気づきでしたか?
実際私も,今回実験してみるまで直接その挙動を確かめていた訳ではありませんでした.ただ,『インサイド Microsoft Windows 第4版上』に書かれている内容や,各種資料の記述をつきあわせると,最小化後にページファイルへの書き出しが観測できるはずだと予想し,実際試してみたらその通りだったというところです.
何年も Windows を使っていても,案外と気づかないものですね.

参考

  • Windows XP までの NT 系列では,トップレベルウィンドウの最小化時に最大限のワーキングセット縮小が行われる (id:NyaRuRu:20051022).
  • Firefox で config.trim_on_minimize を true にすると,上記デフォルト動作をそのまま受け入れる(id:NyaRuRu:20060620)
  • ワーキングセットから外れたメモリページは Modified Page となり,優先度 17 で動作する変更ページライタスレッドによってページファイルに書き出される.ページファイルとの同期が完了したページは,スタンバイリストに移行する.(『インサイド Microsoft Windows 第4版上』)