-
Notifications
You must be signed in to change notification settings - Fork 0
MS_PhysicalMemoryManagement
- TOP > インフラストラクチャ > メモリ管理
物理メモリのライフサイクルについて説明する。
※ 仮想メモリ管理とは別です。
- システムの起動時には、全てのメモリが未使用ページリスト(Free Page List)に入れられている。
- Windowsではゼロページスレッドが、未使用ページリストをゼロページリスト(Zero Page List)に入れる。
- プロセスは開始時に、ゼロページリストから必要なページのみを取得し、ワーキングセットを作る。
- プロセスの終了時には、ワーキングセットが未使用ページリスト(Free Page List)に戻される。
※ ゼロページスレッドによるゼロページ化はメモリ・スキャベンジ防止のセキュリティ対策のため
(前のプロセスが使っていた内容が、別プロセスから読めてしまわないようにするため)。
プロセスが(仮想記憶上で)メモリ割当を行った場合、
- 可能ならばスタンバイリストのページをワーキングセット中に移動し利用する。
- (恐らく)無ければゼロページリストから必要なページのみを取得し、ワーキングセット中に移動し利用する。
プロセスが(仮想記憶上で)メモリ開放を行った場合、
- ワーキングセット中のメモリページがすぐに破棄されるわけではない。
- この場合、メモリページはワーキングセットからは取り除かれ、スタンバイリストに追加される。
ワーキングセットをスタンバイリストに移動する Windows OS の物理メモリ管理の動作を指す。
各プロセスに割り当てられる物理メモリ。
- 各々のプロセスは、ワーキングセットと呼ばれるメモリページの集合を保持している。
- ワーキングセットは、常に物理メモリ上に割り当てられるメモリページ群である。
- ワーキングセットは、物理メモリのことなので、仮想メモリとは直接関係はない。
- 最小ワーキングセットサイズ ≦ ある瞬間の実際のワーキングセット ≦ 最大ワーキングセットサイズ
- ワーキングセットに含まれるメモリページの数はシステムによって動的に変化するが、
上限と下限が定められている。この上限と下限はSetProcessWorkingSetSize関数によって指定可能である。
※ 内部動作に影響を与え、システム全体の性能に影響するため慎重に使用すること。 - プロセスがメモリ割り当てを行うと、システムはこのワーキングセットから
未使用のページを探し、これをメモリ割り当てに使用する。 - このため、ワーキングセットに関するカウンタは物理メモリのOSによる管理状況を確認するために利用する。
※ アプリケーションによるメモリ使用量(仮想メモリの使用量)を確認する用途に使用するのは適切ではない。
補足: 「アプリのメモリ使用量」を見たい場合は、 ワーキング セット(物理メモリ)ではなく プライベート バイト (
Process(*)\Private Bytes、コミット済みの仮想メモリ)を見るのが定石。 ワーキング セットは OS の都合(他プロセスからの圧力など)で増減するため、 リークの判定には使えない。パフォーマンス カウンタを参照。
ワーキングセットのうち、他のプロセスと共有できない(DLL、MMF を除く)メモリ ページのセット。
システムに割り当てられる物理メモリ。≒ (ファイル)システムキャッシュ
- システムキャッシュとは使用されていないメモリをキャッシュ領域として使用するスタンバイリストの仕組み。
- スタンバイ リスト(変更済みページリストを含む)が実質的にシステムキャッシュとなる
(ソフト ページ フォールトを伴う)。 - システム キャッシュ(システム ワーキングセット)は、次の 5 種類のワーキングセットが
合計されたサイズになる。パフォーマンス ログではMemory\Cache Bytesカウンタを確認する。
| 内訳 | カウンタ |
|---|---|
| システム キャッシュ ページ | Memory\System Cache Resident Bytes |
| ページ プール | Memory\Pool Paged Resident Bytes |
| Ntoskrnl.exe 内のページング可能なコードとデータ | Memory\System Code Resident Bytes |
| デバイス ドライバ内のページング可能なコードとデータ | Memory\System Driver Resident Bytes |
| システム マップドビュー | - |
スタンバイリストは利用可能なページを溜め込んでいるリスト的なもの。
- ワーキングセットのサイズが過剰と判断された場合、トリミングにより、
アイドル時間が最も長いワーキングセットのページがスタンバイリストに移動させられる。 - 長時間プロセスがメモリ割り当てを行わない場合、スタンバイリストのページは自動的に破棄される。
スタンバイリストは、プログラムによって書き換えられていないページ。
変更済みページリストは、プログラムによって書き換えられたページであり、
ページングファイル(ディスク)に書き込まれた後に、
スタンバイ リストを経由してでないとワーキングセットに戻せない。
※ タスク マネージャーの「メモリ」タブに出る
「使用中」「変更済み」「スタンバイ」「空き」は、ここで説明しているリストにそのまま対応する。
「スタンバイ」は実質的に空きに近い(必要になれば即座に再利用される)ため、
「空き」が少ないこと自体はメモリ不足を意味しない。
ワーキングセット中に未使用のメモリページが存在せず、メモリページの個数が上限に達している場合、
ワーキングセットからメモリページを取り除き、取り除いたメモリページを必要に応じて
ページングファイルにスワップアウトし、新たに物理メモリ上のメモリページを割り当て、
ワーキングセットに追加する。
また、利用中のワーキングセットのページがトリミングによりスタンバイリストに移動させられた際に、
プロセスがこれらのページにアクセスした場合、ページはワーキング セットへ
"ソフト ページ フォールト" で戻される。
これは "ハード ページ フォールト" と比べるとディスク アクセスを必要としないので非常に高速である。
※ 性能問題の切り分けでは Memory\Page Reads/sec(ハード) を見る。
Page Faults/sec はソフトを含むため、値が大きくても問題とは限らない。
WinDbg の以下のコマンドで確認できる。
0: kd> !memusage
Zeroed: 173816 (695264 kb)
Free: 0 ( 0 kb)
Standby: 71317 (285268 kb)
Modified: 1387 ( 5548 kb)
ModifiedNoWrite: 561 ( 2244 kb)
Active/Valid: 145881 (583524 kb)
Transition: 16 ( 64 kb)
Unknown: 0 ( 0 kb)
TOTAL: 392978 (1571912 kb)
- tasklist
-
/fo csvや/fo listで取得できる Mem Usage は「ワーキングセット」 - ワーキングセットは、プロセスが現在物理メモリ上に持っているページのサイズを表す。
-
- taskmgr
- 「メモリ」列はデフォルトでは「プライベート ワーキングセット」で、
共有メモリは含まれない。 - 「詳細」タブで「ワーキング セット (メモリ)」列を追加すれば、tasklist と同じ値に近づくが、
合計メモリは差が残る。
- 「メモリ」列はデフォルトでは「プライベート ワーキングセット」で、
※ その他、tasklist では各プロセスに重複して含まれることがあり、
OS やカーネルで使っているメモリが含まれないなどの違いがある。
以下の様なツールも存在する。
- CacheSet(Sysinternals)
(ファイル)システムキャッシュ ≒ システム ワーキングセットのサイズを設定できるアプレット
- Windows のメモリ管理 - Microsoft Learn
- メモリ割り当てから解放までのメモリライフサイクル - TechTargetジャパン
- RAMMap - Sysinternals(各リストの内訳を可視化できる)
Tags: Windows, メモリ管理, 障害対応, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。