仮想メモリ、Windows Serverのメモリチューニングでページングファイルなし(Paging file)は選択可能か?


最近、物理サーバーのメモリも大容量となり、また64bit化で使用できる物理メモリも増えました。

Windows Server のチューニングで、「ページングファイルなし」という選択肢があるのかどうかを検討しました。
残念ながら、「ページングファイルなし」という選択肢は危険という結論に至りました。

SQL Server 2008 R2 オンライン ブック 仮想メモリの構成 によると以下のようなマイクロソフトの見解になります。
Windows Server はページング ファイルなしで実行できますが、これはお勧めしません。

以下の環境で以下のイベントログが発生しました。
  • ページングファイルなし
  • SQL Serverに物理メモリより低いサイズのメモリ割り当て。
    (SQL Server 「サーバーメモリオプション」の「最大サーバーメモリ」サイズを制限)
  • その他、大量メモリを使用する主要なアプリケーションなし
ログの名前:         System
ソース:           Microsoft-Windows-Resource-Exhaustion-Detector
イベント ID:       2004
タスクのカテゴリ:      リソース消費診断イベント
レベル:           警告
キーワード:         システムのコミット リミット (仮想メモリ) の消費に関連するイベントです。
説明:
Windows は仮想メモリの不足状態を診断しました。仮想メモリを多く消費したのは次のプログラムです: sqlservr.exe (****) は ****** バイトを消費し、Ssms.exe (****) は ****** バイトを消費し、MsDtsSrvr.exe (****) は ******* バイトを消費しました。


そもそも仮想メモリとは?


仮想メモリによって、プログラムはシステムの物理メモリとは別にメモリを使用できるようになります。
プログラムのコードとデータを物理メモリに格納するタイミングと状況、およびそれらをファイルに格納するタイミングは、オペレーティング システムが決定します。
仮想メモリの大きな利点は、物理メモリで処理できる以上のプロセスを、同時に実行できるということです。

各プロセスには、仮想メモリ (アドレス空間と呼ばれる) が割り当てられ、実行するコードと、コードが参照し操作するデータがそこにマップされます。
32 ビットのプロセスでは、32 ビットの仮想メモリ アドレス ポインターが使用されます。
このため、仮想メモリの上限は、32 ビット プロセスで処理が可能な 4 GB (2^32) となります。
ただし、オペレーティング システム自体のコードとデータ、および現在実行中のプロセスのコードとデータを、アドレス空間を変更せずに参照できるようにするために、オペレーティング システムは、すべてのプロセスのアドレス空間でオペレーティング システムの仮想メモリを参照できるようにします。
既定では、32 ビット版 Windows では、システムとアクティブなプロセスとの間でプロセスのアドレス空間が均等に分割されます。
そのため、アドレス空間の上限はそれぞれ 2 GB になります。


「仮想メモリ」という言葉に対し、「各プロセスに割り当てられるアドレス空間」という意味と「物理メモリ+ページングファイル」という意味合いがあり、混同してしまうが、両方仮想的にメモリをプロセスに見せるといった意味では同じになります。

32bit Windows OSで仮想メモリ(物理メモリ+ページングファイル)を4GB以上に設定し意味があるかどうか?


32bit Windows OSでは物理メモリが4GBしか認識できませんが、各プロセスが2GB(もしくは3GB)の(仮想メモリ)アドレス空間を持っているということは、各プロセス全体合計では当然のように物理メモリ4GB以上を越すことがありえる。
逆に言えば、各プロセス全体合計として4GB以上のメモリを動作する必要がある。
このような時にページングファイルが活躍する。

物理メモリと複数の各プロセスのメモリアドレス空間を、ページングファイルを利用し"仮想"メモリとして動作させている。
「仮想メモリ」は、プロセスがアクセスするメモリー空間を、物理メモリー空間とは切り離して、仮想的なメモリー空間として扱う仕組みである。

仮想メモリ(物理メモリ+ページングファイル)は32bit Windows OS上で4GB以上のサイズを持つことに意味があります。
また4GB以上の物理メモリを搭載しているからといって、「ページングファイルなし」は推奨されないのも上記の理由になります。

しかし、結局のところ仮想メモリにも上限があります(設定値)。
サーバーシステム上で動作する数あるプログラム・プロセスに適切な設定を行えば、「ページングファイルなし」といった設定も可能になると思います(Windows Serverはお勧めはしないが、ページングファイルなしで実行ができるとのマイクロソフトの見解)。
ただ、サーバーシステム上に数あるプログラム・プロセスを適切にチューニング・設定するのは難しいため、ページングファイルという予備的な仮想メモリを用意し、メモリ不足によるシステム停止を避けた方がより無難と考えます。

仮想メモリ: コミットサイズ?ワーキングセットサイズ?


仮想メモリの使用量が、システム全体、さらにはアプリケーションの性能で重要な意味を持つのは、以下の 2 つの理由からです。

1. 仮想メモリには上限があります。
プロセスあたりの仮想メモリの制限値は、2GB または 3GB です。
さらに、物理メモリとページングファイルの合計が、システムでの制限値となります。
上記のどちらかの制限値に達した場合、メモリ不足が発生します。

2. 物理メモリに対して仮想メモリの割合が大きい場合、OS がアプリケーションメモリを管理する際に、膨大な割り込み時間が必要となり、物理メモリとディスク上の低速なページングファイルの間でアプリケーション メモリの転送またはページングが発生します。
このようなハードページ フォールトが生じると、アプリケーションの一時停止が頻発します(パフォーマンス劣化)。

仮想メモリ構成: 

Windows のユーザープロセスに対する仮想メモリ構成は、コミット、ワーキングセット、リザーブの 3 種類に分類できます。
仮想メモリの各フラグメントをページといい、サイズは通常 4KB です。

コミット ページ
プロセスに割り当てられた、使用可能なすべての仮想メモリを表します。
各コミットページのコピーがシステムのページングファイルで管理されます。
アプリケーションがコミットページにアクセスすると、オペレーティングシステムはそのページをワーキング セットに指定します。

 ワーキング セットページ
最も頻繁かつ直近にアクセスされた仮想メモリです。
ワーキングセット ページは、常に物理メモリ内にあります。
Windows はワーキングセット ページを、常に最適な数値に調整しています。

リザーブページ
割り当てられたメモリですが、プロセスが直接使用することはできず、将来の使用に備えて確保されています。
リザーブページは、物理メモリやページングファイルを占有しません。




Windows メモリリークテストプログラム、testlimit.exe

testlimit.exe、testlimit64.exe のダウンロードサイト紹介。

Windows Internals Book のBoot Tools コラムのTestlimit リンクからダウンロード出来る。
32bit版プロセスのtestlimit.exe と64bit版プロセスのtestlimit64.exeが含まれている。


usage: testlimit [[-h] | [-p [-n]] | [-t] | [-u [-i]] | [-g [object size]] | [-a|-d|-m|-r|-s [MB]] | [-w]

  -a       Leak Address Windowing Extensions (AWE) memory in
           specified MBs (default is 1)
  -d       Leak and touch memory in specified MBs (default is 1)
  -g       Create GDI handles of specified size (default 1 byte)
           Specify a size of 0 to cause GDI object exhaustion
  -h       Create handles
  -i       Exhaust USER desktop heap
  -m       Leak memory in specified MBs (default is 1)
  -n       Set min working set of processes to smallest
  -p       Create processes
  -r       Reserve memory in specified MBs (default is 1)
  -s       Leak shared memory in specified MBs (default is 1)
  -t       Create threads
  -u       Create USER handles to menus
  -w       Reset working set minimum to highest possible value


サブページ リスト

更新日:2010/03/16
Comments