読者です 読者をやめる 読者になる 読者になる

レスポンスチューニング

さて,以上のように Windows の仮想メモリの働きについて見てきましたが,近年の搭載メモリ量の増加と共に一部パフォーマンスに問題が発生しているような局面も見受けられるようになってきました.
例えば 512MB の "Working Set" を持つアプリケーションのウィンドウを最小化すると,デフォルトでは "Working Set" の縮小が行われますが,ハードウェアスペックによってはこのときの縮小作業自体が軽快な UI 動作を損なうことがあります.さらにこの後アプリケーションのウィンドウサイズを復元した際にはページフォールトが多数発生しますし,ハードページフォールトが引き起こされた場合のレスポンスの悪化は非常に大きなものがあります.
例えば,以下のような点について議論が必要かもしれません.

  • ウィンドウ最小化という UI 操作をトリガーに使うことの是非
  • メモリ上にキャッシュするだけでいつでも高速にデータを再利用できるというプログラマの思いこみ
  • エンドユーザの無知による誤ったクレームの増加

近年扱うデータ量が増加してきたブラウザ,オフィススイート,統合開発環境といったアプリケーションでは特にこの問題が表面化しています.
http://forum.mozilla.gr.jp/?mode=al2&namber=9306&rev=&0&KLOG=62
https://bugs.eclipse.org/bugs/show_bug.cgi?id=85072
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5043070
レスポンスチューニングにはいくつかの方法が考えられますが,SetProcessWorkingSetSize で "Woking Set" 最大値を増加させる場合には注意が必要です.

解説

最小ワーキングセットサイズと最大ワーキングセットサイズの両方に 0xffffffff を指定すると、指定したプロセスのワーキングセットを空にすることができます。
dwMinimumWorkingSetSize と dwMaximumWorkingSetSize のどちらかがプロセスの現在のワーキングセットサイズを超える場合は、指定したプロセスに SE_INC_BASE_PRIORITY_NAME 権が必要です。一般に Administrators グループまたは Power Users グループのユーザーであればこの権限を持っています。 オペレーティングシステムワーキングセットを先着順に割り当てます。たとえば、64MB のメモリを搭載しているシステムで、あるアプリケーションがその最小ワーキングセットとして 40MB を獲得した後、別のアプリケーションが 40MB のメモリを要求すると、オペレーティングシステムは 2 番目のアプリケーションの要求を拒否します。

MSDN の説明に反して,少なくとも Windows 2000 以降の OS では Power Users グループはデフォルトで SE_INC_BASE_PRIORITY_NAME アクセス権 (SeIncreaseBasePriorityPrivilege) を持ちません.VirtualLock で物理メモリ上にロックできるメモリは "Woking Set" 最大値以下に制限されるため,一般的な Power Users グループでの運用では多量のメモリを物理メモリ上に固定することはできないことに注意してください.ただし,最大・最小サイズに 0xffffffff を指定する (x64環境では 0xffffffffffffffff) ことで "Woking Set" を減少させることは,SeIncreaseBasePriorityPrivilege を持たないユーザでも可能です.あくまで増加させることに特権が要求されます.
一方,Microsoft はページフォールト発生パターンの履歴を積極的に活用するという最適化を OS 側に取り込みつつあります.OS やプロセス起動時には大量のページフォールトが発生することが分かっており,起動時間を遅くする要因のひとつと考えられています.Windows XP では,特に影響が大きいハードページフォールトについて,予め必要なファイルを調べておき HDD のシークを減らすように最適化した事前読み込みを行うというメカニズムが導入されました*1
Windows Vista ではさらに改良を加えた SuperFetch と呼ばれる機構が導入される見込みです.PDC で行われた USB メモリを物理メモリの補助に使うというデモをご存じの方もいらっしゃるかもしれませんが,それも SuperFetch の機能のひとつです.

これに対し、Suse Linuxのカーネルを開発するAndrea Arcangeliは、SuperFetchによるパフォーマンス向上効果について懐疑的な見方をしている。

イタリアのイモラに住むArcangeliは、電子メールでのインタビューに答え、「SuperFetchは、キャッシュをすぐに空にする128Mバイトのメモリしかないシステムでは有用かもしれないが、1Gバイトのメモリを搭載したシステムで大きな違いが出るかどうかは疑わしい。また、一見したところでは、システムを複雑にするだけの価値があるようには思えない」と語った。

128MB の環境で Vista を使用するのは無謀かもしれませんが,一方で多くのユーザーが「CPU もメモリも数字は非常に大きくなっているのに,思ったほどは動作が軽快になっていない」と感じているのは確かではないでしょうか.私は現在の Windows のメモリ戦略に若干疑問を持っています.物理メモリに 1GB 以上も空きがあるのに,最小化のたびに数百MB の "Woking Set" 縮小は本当に必要でしょうか? (本当に必要なのはウィンドウ最小化しなくてすむぐらい広いディスプレイ?) こうした疑問に,Vista が何らかの回答を示してくれることを期待しましょう.

*1:『インサイドMicrosoft Windows (上)』7.10 ロジカルプリフェッチャ