メモリパフォーマンスに関連するレジストリまとめ

Windows 高速化」なんてワードでググるとそれっぽいサイトが大量に出てくるわけですが,「とにかくここのレジストリをこう変えると高速化!」みたいな感じで,あまりにもブラックボックス.意味もわからずレジストリをいじくり回すのはなんだか気持ち悪いので,自分なりに調べたものをまとめてみます.今回はメモリの使い方に関係する,
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Memory Management
について.

とりあえず公式の解説

レジストリの公式リファレンス(英語)があるのでそれ見ましょう.Windows Server 2003/2000のしか無いけど…
Memory Management: Core Services

結論

んで,高速化に意味あるのか的な観点から先に結論をまとめる.

名前 意味 高速化
ClearPageFileAtShutdown ページファイルを終了時にゼロクリア.セキュリティ上の項目で,1にしても高速化はしない ×
DisablePagingExecutive カーネルメモリをすべてRAMに常駐.カーネルに対し十分な物理メモリがあれば高速化に多少の効果.
IoPageLockLimit I/Oバッファサイズの指定.少なくともXP SP3以降は使われていない値. ×
LargeSystemCache システムキャッシュを8MB固定or物理メモリいっぱいまで使い切るかを設定.Vista以降使われていない値.
NonPagedPoolQuota 非ページプールの最大値.デフォルト値推奨. ×
NonPagedPoolSize 非ページプールの値.デフォルト値推奨. ×
PagedPoolQuota ページプールの最大値.デフォルト値推奨. ×
PagedPoolSize ページプールの値.デフォルト値推奨. ×
PagingFiles ページファイルのパスと最小・最大値.物理メモリが十分なら0にすると幸せ?
PhysicalAddressExtension 32Bit OSにおいて,4GB以上の物理メモリを扱うPAEを有効化.大抵の場合自動的に有効化されている. ×
SystemPages デフォルト値推奨.システムPTEサイズ.ドライバにより0以外の変な値に設定されているなら変更の価値有. ×
SecondLevelDataCache システムがL2キャッシュを認識失敗した時のデフォルト値.HALがL2キャッシュを認識している限り無用.

「速くなるよ!」と解説されている項目も,よくよく調べると本当かよみたいな所が多い.以下は各項目の説明.間違ってる所があれば突っ込んで下さるととてもうれしいです…

ClearPageFileAtShutdown

「ページファイルをシャットダウン時に毎回削除するので,断片化を解消して高速化する」と解説しているところもあるが間違い.1に設定すると,ファイルの削除も断片化の解消も行わず,ページファイル領域をゼロクリア(=中身のビットが0のファイルを生成)する.本家解説によると「This is a Windows Server 2003 security feature that prevents the pages from being read by another process. 」とあり,要はセキュリティに関する設定項目.1にするとむしろ終了時のゼロクリア処理に時間を食う.
関連:ClearPageFileAtShutdownで断片化は直りません、速くなりません - のろのろのろ雑記

DisablePagingExecutive

1にするとカーネルを物理メモリ上に常駐させる.タスクマネージャ上でのカーネルの「ページ領域」項目はカーネルの常駐領域+作業領域であり,この値を1に設定しても作業領域で適宜ページを食うので0にはならない.当然カーネルに割り当てた分アプリケーションその他で使える物理メモリは減っているが,カーネルの容量は知れているのでGBクラスのメモリが乗っているPCであれば1にしてしまっても構わないかも.

IoPageLockLimit

デバイスドライバが使用できるI/Oバッファの最大値を指定する(単位バイト).デフォルトでは512KBが使われる.少なくともXP SP3以降では参照されておらず,設定しても意味は無い模様.
関連:間違いだらけの Windows チューニング その2 (IoPageLockLimit) - Windows 2000 Blog

LargeSystemCache

システムキャッシュとして使用するメモリ領域の値を設定する.0の場合は8MB固定,1の場合は最大で搭載物理メモリ量-4MBまでのシステムキャッシュが確保される.0-1どちらが良いかはケースバイケースだろうが,ディスクアクセスの多いサーバ用途ならともかく,一般用途で大量のシステムキャッシュを確保するとアプリケーション用のメモリ領域が圧迫されてしまうばかりでメリットは薄いのではないだろうか.また,Vista以降のOSではこの値が使われていない可能性が高いらしい.
関連:安直に「LargeSystemCacheを1に」と言う人が多すぎる - のろのろのろ雑記

NonPagedPoolQuota/PagedPoolQuota

物理メモリに展開される非ページ/ページプールの最大値を指定する(単位MB).0の場合はシステムが自動で計算する.0-128まで指定可能だが通常0が最高パフォーマンス.ページプールについては以下などを参考に.
Windows: ページ プールと非ページ プール

NonPagedPoolSize/PagedPoolSize

物理メモリに展開される非ページ/ページプールの値を指定する(単位バイト).0の場合はシステムが自動で計算する.通常0が最高パフォーマンス."Changing the value of this entry can degrade the performance of your computer."

PagingFiles

ページファイルのパスと最小/最大サイズを指定する.コントロールパネル→システム→詳細設定→パフォーマンスからも設定可能.メモリが潤沢ならページファイルを0にしてやってもいいかも.

SystemPages

意味
0x0 システムPTEを自動で計算し,設定する
0x1–0xFFFFFFFE 自動計算を無効にし,システムPTEの値を設定値に強制する
0xFFFFFFFF システムPTEを物理メモリの領域いっぱいまで拡張する.システムは自動で値を調整することがある

メモリ空間はページと呼ばれる単位に分割して管理されており,これを物理アドレスマッピングする際にPage Table Entry (PTE)の配列を使用する.1個のPTEは4Kbyteの物理メモリを指すので,たとえば3GBのメモリ空間を使う場合PTEは786,432 (3 GB ÷ 4 KB)個 となる(参考:メモリ管理ユニット - Wikipedia).SystemPagesが指定するのは,ディスクI/Oとネットワークとの通信を行う「システムPTE」に使うPTEの数であり,システムキャッシュなどは含まれない.最適な設定値については,Microsoft様によると

  • Windows Server 2000 ... 24,000 〜 31,000 の間に設定するべき
  • Windows Server 2003 ... 0x0固定を推奨
  • その他OS ... 記述なし

とややこしい(参考:SystemPages の設定値が大きすぎる - Microsoft | TechNet).XPや7の場合どうするのが最適なのかは分からないが,ここを大きくしすぎたり小さくしすぎたりするとPTEを使い切ってシステムがクラッシュしたり,激しい断片化を生じることがあるようなので,下手に触らず0x0にしておいたほうが良いと思われ.
ただ,たまに下手なドライバがこの値を勝手に変更していることがあるようなので,その場合はドライバを特定の上で0x0に戻してみるのも手かも.

PhysicalAddressExtension

32Bit OSにおいて,4GB以上の物理メモリを扱う物理アドレス拡張(PAE)を有効にする.これが0だと4GB以上のメモリ空間を扱えない.Windows Server2003の場合,boot.iniに/NOPAE スイッチが設定されていない場合,コンピュータを再起動すると自動的に 1 にリセットされる.また,XP SP2以降のOSではDEP(データ実行防止機能)を明示的に抑制していない限り,起動のたびにPAEは強制的に有効化され,この値は1に設定される*1
参考:@IT:解説:Windows XP SP2で採用されたDEPの仕組み
   Windows の DEP は物理アドレス拡張 (PAE) を自動的に有効にする

SecondLevelDataCache

CPU2次キャッシュ(L2キャッシュ)をHAL(Hardware Abstraction Layer)が認識できなかった場合に割り当てられるデフォルト値(単位バイト).0だと256KB.あくまでHALが認識に失敗した場合のデフォルト値なので,よくある「2次キャッシュを有効に使いたければここを設定しましょう」的な解説はちょっと間違い.HALが認識しているかどうかは,コマンドプロンプトからWMICを呼んでみればOK.

wmic Memcache get maxcachesize,description

と聞くと1次キャッシュから順番にこたえてくれる.

キャッシュ メモリ  64
キャッシュ メモリ  4096
キャッシュ メモリ  0

この場合は4MBのL2キャッシュが認識されている.ここで表示されている値がCPUスペック値と一致するのなら,HALが正しく2次キャッシュを認識しているのでSecondLevelDataCacheを設定しても性能向上は見込めない(ここらへんちょっと自信ない).最近のハードなら大抵正しく認識されているはず.

まとめ

たいていのレジストリはそれなりに全体最適な値に設定されているので,あんま高速化Tipsを鵜呑みにしないほうが良いかも.レジストリは自分が何やってるかある程度認識した上で弄りましょう.公式リファレンス大事.

*1:正確にはCPUによって挙動が異なる.DEPに対応したCPUの場合,DEPの実行のためにPAEモードが必須であるため,起動ごとにPAEが有効化される.DEPに対応していないCPUの場合,PAEはこのレジストリで設定された通りの挙動を示す.