Contents
仮想メモリの設定は必須
結論として、仮想メモリの設定は行った方がいい。詳細は後述する検証内容を参照していただきたいが、物理メモリの半分程度までであれば仮想メモリは実用レベルで動作してくれる。
例えば、16GBの物理メモリを搭載しているコンピュータの場合、仮想メモリの設定無しでは16GB以上を処理しようとすると何らかの影響がある(時にはハングアップしてしまうことも・・・)。その状況下で仮想メモリを8GB設定することで、16GB以上のメモリ負荷がかかったとしても、24GBまでの処理であれば仮想メモリの利用を意識しないレベルで動作に影響が生じない場合が多い。
ただし、上記の0.5倍ルールは環境によって変動することを理解していただきたい。実際に Microsoft が提唱しているわけではなく、あくまで私の経験則から導き出した指標でしかない。
仮想メモリは物理メモリの代わりにはならない
そもそも、実際に処理命令を下す CPU は物理メモリ上でしか処理を行わない。これは物理レベルの話で、CPUと直接つながっているのは物理メモリのみである。
仮想メモリの実態は HDD や SSD に作成されるページファイルというファイルだ。仮想メモリは使用頻度の低い(インアクティブな)データを物理メモリから退避させる場所として利用される。
CPU は物理メモリ上でしか処理ができないため、仮想メモリ上に必要なデータがある場合は当該データを物理メモリ上に展開する必要がある。
そのため、データアクセスのランダム性の強い処理や物理メモリのサイズを遥かに超えるメモリ負荷がかかった場合はどれだけ仮想メモリを増やしたところでまったく意味がない。
大容量メモリの場合は必要ない?
仮想メモリの設定は行った方がいいとは言ったものの、最近はクライアントでも32GB、サーバだと96GBメモリといった比較的大容量のメモリも珍しくない。
このような大きなサイズの物理メモリをマシンが保有している場合、「メモリが不足することはないだろう」という想定のもと仮想メモリを設定しないというのは選択肢としてはアリだ。
ただし、注意しなくてはならない点がある。仮想メモリは物理メモリの処理を補う以外にも、ダンプファイルを保持する役割もあるということだ。
仮想メモリはダンプにも使用する
例えば Microsoft のサイトには以下のように記述されている。
64 ビット版の Windows と Windows Server は、32 ビット版よりも多くの物理メモリ (RAM) をサポートしています。 しかし、ページ ファイルのサイズを設定する理由は、どちらも同じです。 つまり、必要に応じてシステム クラッシュ ダンプを格納しなければならないため、または必要に応じてシステムのコミット メモリの制限を拡張しなければならないためです。 たとえば、大量の物理メモリが備わっている場合は、システムのピーク使用時のコミット チャージをページ ファイルで補う必要がないことも考えられます。 つまり、物理メモリだけで、コミット チャージに相当する容量を確保できるわけです。 しかし、この場合でも、システムのクラッシュ ダンプを保持するために、ページ ファイル、または専用ダンプ ファイルを必要とします。
大容量メモリの場合もダンプファイル用に仮想メモリが必要ということだ。
ダンプファイル
ダンプファイルとは、メモリや(CPU内部の)レジスタ、ファイル、ディスクなどのある瞬間の中身を丸ごと記録したファイル。
OSやアプリケーションソフトが異常終了した際、原因特定の手がかりになるように最後の瞬間のメモリやレジスタの内容を記録したダンプファイルが作成されることがある。「メモリダンプ」(memory dump)「クラッシュダンプ」(crash dump)などと呼ばれることもある。Quote:IT用語辞典
Microsoft やサーバベンダのサポートを受ける場合は、障害時のダンプファイルを求められることが多い。ダンプファイルにはシステムクラッシュ時のメモリ内容が保存されているため、その情報をもとにトラブルシューティングを行う(ダンプ解析)。
大容量メモリやダンプファイルを踏まえたうえでサーバ構築を行う場合、大抵の場合は後者のダンプファイルの設定に依存した仮想メモリの容量になることが多い。
完全メモリダンプ
ダンプ設定に依存した仮想メモリ容量とはどういうことだろうか。
Windows のメモリダンプには主に「カーネル メモリ ダンプ」「最小メモリ ダンプ」「完全メモリ ダンプ」の3種類がある。
カーネル メモリ ダンプに関しては、カーネル メモリのみを記録し、ユーザー モードの情報はないため、トラブルの原因を特定できない場合があります。
最小メモリ ダンプ (256 KB) に関しては、停止した原因を判別するのに役立つ有用な情報の最小セットを記録するため、原因追及に至る可能性は低いです。
一方、完全メモリ ダンプはシステム メモリのすべての内容を記録するため、詳細調査に非常に有効です。従いまして、調査の為にメモリ ダンプを取得する場合には、完全メモリ ダンプを取得いただく事を推奨しています。
Quote:完全メモリ ダンプ採取のための設定手順について
上記にあるとおり、サーバであれば完全メモリダンプを設定する場合が多い。クライアントの場合はダンプ解析まで行うケースはサーバに比べて少ないため、ディスクの使用量を優先し完全メモリダンプを設定しない場合が多い。
そして完全メモリダンプを正常に取得するためには、「物理メモリ+1MB」を仮想メモリに設定する必要がある。
ダンプファイルを考慮した結論
ダンプファイルを考慮した場合、仮想メモリのサイズの推奨は最低「物理メモリ+1MB」となる。
これは完全メモリダンプを出力するための最小値のため、私の場合は余裕を持たせて物理メモリサイズの1.5倍を設定することが多い。
仮想メモリの設定方法
ここからは実際に仮想メモリを設定していく。今回の検証環境には Windows Server 2016 を使用する。
なお、ここから先の検証はダンプとは切り離して行う。純粋に物理メモリを補助するという役割の仮想メモリの検証だ。
仮想メモリは「システムのプロパティ」から行うため、ファイル名を指定して実行で「sysdm.cpl」を実行する。
「環境設定」のパフォーマンス欄から「設定」をクリックする。
パフォーマンスオプションの「詳細設定」タブから仮想メモリ欄の「変更」をクリックする。
パフォーマンスオプションに一発でたどり着ける方法
ファイル名を指定して実行で sysdm.cpl ではなく「SystemPropertiesPerformance」と入力するとパフォーマンスオプションが即座に開く。
仮想メモリ欄の「変更」をクリックすると仮想メモリの設定画面が表示される。
デフォルトだと「すべてのドライブのページング ファイルのサイズを自動的に管理する」となっている。
これは文字通り仮想メモリが自動的に管理されている状態で、仮想メモリのサイズが動的に変動する。
下図の場合は1152MBが仮想メモリとして割り当てられている。
システム管理の仮想メモリについて
デフォルトの「すべてのドライブのページング ファイルのサイズを自動的に管理する」のチェックを外すと、「システム管理」という状態になる。
この2つは一体どう違うのだろうか。実は、単一ドライブの場合違いはない。
下図はチェックを外して再起動した後の状態だが、「現在の割り当て」は一切変わっていない。
「すべてのドライブのページング ファイルのサイズを自動的に管理する」は文字通りすべてのドライブを自動的に管理している状態のことだ。
上図ではCドライブしかないため違いが分かり辛いが、例えば下図のようにDドライブが存在した場合、明示的にCドライブだけをシステム管理の状態にすることができる。
また、Tecknet には以下のような記述がある。
ページ ファイルを管理する必要がある場合、複数の物理ディスクがあるときには、Windows システム ファイルが格納されていない高速なドライブにページ ファイルを移動することをお勧めします。また、ディスク コントローラーでは、同時にデータを読み書きする複数の要求を処理できるので、複数のページ ファイルを 2 つか 3 つの物理ディスクに分けると、パフォーマンスがさらに向上します。ただし、単一の物理ディスクにある複数のボリュームを使用して、複数のページ ファイルを作成しないように注意してください。たとえば、ボリューム C、D、および E を含む単一のハード ディスクを使用している場合、このうち 2 つ以上のボリュームにページ ファイルを分割すると、コンピューターのパフォーマンスが低下することがあります。
Quote:仮想メモリ構成を最適化するベスト プラクティス
「すべてのドライブのページング ファイルのサイズを自動的に管理する」設定になっていた場合、上記を考慮したページファイル構成に調整されると思われる。
「Testlimit」を使用した負荷テスト
仮想メモリが有効になっていることを確認したところで、メモリの使用率を上げてみる。
メモリに負荷を与える代表的なツールに Sysinternals の「Testlimit」がある。マイクロソフトのブログでも紹介されるようなメジャーなツールだ。
仮想メモリ有効の場合
今回は物理メモリが2GBのサーバで検証を行う。
仮想メモリは1152MBなので、「コミット済み」には物理メモリ2GB+仮想メモリ約1.1GBの合計3.1GBが記載されている。
Testlimitを実行する。今回は64bit版の「Testlimit64」をCドライブ直下に配置した。
なお、Testlimit は CUI ベースのツールのためアイコンをダブルクリックしても一瞬で終了してしまう。コマンドプロンプトからファイルを実行する必要がある。
testlimit のコマンドは以下のように実行する。
testlimit64 -d -c 2048
-d・・・要求するメモリ容量。
-c・・・-dの値を固定する。-cを省略した場合-dで指定した以上のメモリを際限なく要求する。-cオプションは最後に追記する必要がある。
実際に2048MBのメモリ負荷をかけてみる。
「コミット済み」に注目すると、先ほどの3.1GBから4.2GBに変化している。これは仮想メモリの設定が「すべてのドライブのページング ファイルのサイズを自動的に管理する」になっているからだ。動的に調整されている。
物理メモリ2GBに対して2GBの負荷をかけているため、通常であれば処理が溢れている状態だが、下図のようにアプリケーションも実行できるうえに動作が遅くなったような違和感も発生しない。
仮想メモリ無効の場合
次に仮想メモリを無効にしてみる。
無効にする方法は「ページング ファイルなし」にボタンを移動した後、「設定」をクリックする。
仮想メモリの設定変更を行う場合、必ずこの横にある「設定」ボタンを押さなくてはならない。そうしなければ設定変更を行うことはできない。(なぜか再起動を促すメッセージは出力される)
実際に「設定」をクリックすると下図のような警告が出力されるので、「はい」をクリックする。
「ページング ファイルのサイズ」が「なし」になっていることを確認し「OK」ボタンを押下する。
「設定」ボタンと同じく、「OK」ボタンもきちんとクリックしないと設定が反映されない。
仮想メモリが無効になった状態で先ほどの検証と同じく2GBのメモリ負荷をかけてみる。
結果、メモリが溢れてしまいハングアップしてしまった。(壁紙も無くなってしまった・・・)
こうなると強制終了するしかない。
物理メモリを遥かに超える負荷をかけてみる
冒頭でも解説したが、物理メモリのサイズを遥かに超えるメモリ負荷がかかった場合はいくら仮想メモリを設定しても無駄だ。
物理メモリ2GB、仮想メモリ設定が「すべてのドライブのページング ファイルのサイズを自動的に管理する」の状態で10GBの負荷をかけてみる。
結果、約7GBまではメモリ割り当てに成功しているが、OS がハングアップしたため何もすることができなかった。
ちなみに、今回は「コンピューターのメモリが不足しています」という警告が表示されたが、この警告が表示された時点で何も操作が出来ないのでどうしようもない。
結局のところ強制終了するしかない。
仮想メモリは物理メモリの何倍まで補助してくれるのか
インストール直後の OS で何もアプリケーションが動作していない場合、純粋なメモリ負荷に何GBまで耐えてくれるのか検証してみる。
当然検証は物理メモリ以上の負荷を与えるため、仮想メモリがどうにか頑張らなければ処理が溢れてしまう。
物理メモリ2GBの場合
4GBの負荷に耐えた。
6GBの負荷に耐えた。
8GBの負荷には耐えられなかった。
物理メモリ4GBの場合
8GBの負荷に耐えた。
10GBの負荷に耐えられなかった。
物理メモリ6GBの場合
10GBの負荷に耐えた。
12GBの負荷に耐えられなかった。
単一のドライブに対するシステム管理サイズ上限は5GBまでの可能性が高い
上記の検証結果をまとめると以下のようになる。
- 物理メモリ2GBは6GBのメモリ負荷まで耐えることができた。
- 物理メモリ4GBは8GBのメモリ負荷まで耐えることができた。
- 物理メモリ6GBは10GBのメモリ負荷まで耐えることができた。
これを仮想メモリの観点からまとめると以下のようになる。
- 物理メモリ2GBの場合、仮想メモリは物理メモリの2倍までの処理を補助できた
- 物理メモリ4GBの場合、仮想メモリは物理メモリの等倍までの処理を補助できた
- 物理メモリ6GBの場合、仮想メモリは物理メモリの0.66倍までの処理を補助できた
検証結果から、以下の2つが考えられる。
- メモリサイズが大きければ大きいほど仮想メモリの効果が薄れる
- システム管理メモリはメモリ負荷に応じて際限なく仮想メモリを用意するわけではない
仮想メモリを固定で設定した後、もう一度物理メモリ6GBに12GBのメモリ負荷を与えてみた。
結果、メモリ負荷に耐えることができた。つまり「システム管理メモリはメモリ負荷に応じて際限なく仮想メモリを用意するわけではない」ということになる。システム管理メモリには上限がある。
上限についての判断材料は検証時の結果だ。
- 2GB:7442MB(耐えられたメモリ負荷) – 2048MB(物理メモリ) = 5394MB(仮想メモリ上限)
- 4GB:9751(耐えられたメモリ負荷) – 4096(物理メモリ) = 5655MB(仮想メモリ上限)
- 6GB:11757(耐えられたメモリ負荷) – 6144(物理メモリ) = 5613MB(仮想メモリ上限)
上記の結果から、システム管理されている仮想メモリサイズの上限は4GB~6GBが上限である可能性が高い。
ただし、システム管理されている仮想メモリはダンプ設定の「自動メモリダンプ」と連動している部分がある。
ダンプが出力されるようなエラーが発生した場合、仮想メモリがシステム管理になっていると、次回起動時に仮想メモリが物理メモリと同サイズにまで拡張される。
仮想メモリサイズの固定化(カスタムサイズ)
仮想メモリのサイズを固定にしたい場合は「カスタムサイズ」を選択する。
「初期サイズ」は固定にした場合の最小サイズのことで、仮想メモリサイズはこの値より小さくなることはない。「最大サイズ」は読んで字のごとくだ。
値を入力したら必ず「設定」ボタンをクリックする。
「ページング ファイルのサイズ」が変わったことを確認し「OK」をクリックする。
「最小限」の意味
仮想メモリプロパティ下部に「最小限: 16MB」という項目があるが、これはカスタムサイズに設定できる初期サイズの下限のことだ。
例えば初期サイズに15MBを入力した状態で「設定」ボタンをクリックする。
そうすると16MB以上を入力してくださいという警告が表示される。
再起動後確認してみると、仮想メモリが「初期サイズ」の値になっていることがわかる。
実際に確認しても、物理メモリ2GB+仮想メモリ2GBでコミット済みがきれいに4GBになっていることがわかる。
先述した通り、仮想メモリの値は初期サイズ~最大サイズの間で調整される。
仮想メモリが最大サイズ以上になることはない。
別ドライブに仮想メモリを設定する方法
システムドライブ以外に仮想メモリを設定することも可能だ。設定方法に違いはない。
例えばDドライブのみを仮想メモリにしても仮想メモリは正常に機能する。
ページングファイルは目に見えるのか
例えばDドライブに仮想メモリを設定した場合、何もファイルが入っていないはずのDドライブが仮想メモリ分消費されていることは目に見える形で表示される。
そしてフォルダーオプションで以下の設定を行うとページングファイルはファイルとして表示される。
- 「隠しファイル、隠しフォルダー、および隠しドライブを表示する」を有効化
- 「保護されたオペレーティング システム ファイルを表示しない(推奨)」を無効化
まとめ
- ダンプファイルを考慮して仮想メモリはカスタムメモリで初期サイズ、最大サイズともに物理メモリの1.5倍にするのがおすすめ
- パーティションが複数ある場合仮想メモリの配置に注意が必要
- 仮想メモリ(ページングファイル)の実態は「pagefile.sys」という単一のファイル