こんにちは。
Windows テクノロジー サポートの丸山です。
第 1 回、および第 2 回では、リソース不足の問い合わせにおいて、原因となることが多いページプール、非ページプールの不足についてお話をさせていただきました。
今回は、ページプール、非ページプールの上限値の確認方法と、Windows Vista や 64-bit Windows についてお話します。
ページプール、非ページプールの上限値確認方法について
まず、パフォーマンスモニタでは、以下の値が確認可能であることをお話ししました。
- Pool Nonpaged bytes
- Pool paged bytes (この値は、ページアウトされた分も含めた、ページプールの全体サイズを示しています)
- Pool paged resident bytes (この値は、ページプールの中でも、物理メモリ上にあるメモリサイズを示しています)
しかしながら、パフォーマンスモニタでは、これらの最大サイズを確認することができません。
カーネルデバッガを使用して、!vm コマンドを実行することで、値を確認することができます。
ただし、Windows Vista 以降の OS をお使いの場合では、デバッガを接続するためにWindows をデバッグモードで起動する必要があります。ちょっと面倒ですね。
そこで、代わりに今回は Process Explorer ツールを使用した方法についてご紹介します。
Process Explorer では、シンボルの設定を行うことで、現在確保されているプールのサイズや、その上限値を確認することができます。
まず最初に、最新の Debugging Tools for Windows をインストールする必要があります。起動はしなくて結構です。
デバッガをインストールしたら、Process Explorer を起動します。
そして、Symbol Configuration のダイアログを開きます。
Dbghelp.dll path: には、先程インストールしたデバッガの dbghelp.dll を、
Symbols path: には、マイクロソフト シンボル サーバーのパスを設定してください。
一般的な設定は、次のような値になります。
Dbghelp.dll path: C:\Program Files\Debugging Tools for Windows\dbghelp.dll
Symbols path: SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
Symbol は上記のように指定する事で、ローカルの c:\websymbols に必要なシンボルがダウンロードされます。
ダンプファイルの解析やデバッグでも使えますので、メモリダンプを解析するで紹介されているパスと同じ場所を指定する事をお勧めします。
シンボルの設定が終わったら、System Information ダイアログを開きます。
View のメニューから選択するか、Ctrl+I キーを押下してください。
Kernel Memory の項目を見てください。設定が正しければ、ここにページプール、非ページプールの現在値、上限値が表示されています。
2GB 32-bit Windows XP
Windows Vista 以降の 32-bit Windows
次の例を見てください。
2GB 32-bit Windows Server 2008
Windows Vista 以降 (Windows Server 2008 や、Windows 7 も含む) の 32-bit Windows におけるメモリ マネージャでは、システムリソースの割り当てに関する懸念がなくなりました。※Windows Server 2008 R2 には、32-bit バージョンはありません。
Windows Vista 以降の OS では、起動時にメモリ割り当て範囲が決定する静的なメモリ割り当て機構の代わりに、要求に応じて空きメモリの種類を変更できるよう、動的なメモリ割り当て機構が実装されました。
このため、これまでの Windows に比べて非ページプール、ページプールの上限値がずっと緩和されています。
しかしながら、やはり非ページプールの上限値は物理メモリの搭載量に左右されてしまいます。
このため、非ページプールの上限値は、物理メモリ搭載量の 75% 程度となります。ただし、最大で 2GBが上限となります。
ページプールの上限値は、システムに設定されている合計仮想メモリの値となります。ただし、最大で 2GBが上限となります。
最大値が2GBであるというのは、32-bit の Windows では、カーネルのメモリ空間が 2GB に制限されていることによります。
もちろん、2GBのカーネル空間にはほかの用途で使われるメモリもありますので、実際には2GBすべてが割り当て可能となるわけではありません。
64-bit Windows
64-bit Windows では、2GB を超えるメモリが認識されている場合にはより大きなサイズのメモリが使用できます。
2GB 64-bit Windows XP
64-bit バージョンの Windows XP や Windows Server 2003 では、ずっと大きなサイズのページプール、非ページプールが使用できます。
非ページプールの上限値は、物理メモリ搭載量の 40% 程度となります。ただし、最大で128GB が上限となります。
ページプールの上限値は、非ページプールの上限値の 4 倍となります、ただし、最大で128GBが上限となります。
スクリーンショット上でも、ページプールの上限値が、非ページプールの上限値のほぼ4倍となっている様子が確認できますね。
8GB 64-bit Windows 7
64-bit バージョンの Windows Vista 以降では、32-bit バージョンに比べて大容量メモリでのページプール、非ページプール上限値が増えています。
非ページプールの上限値は、物理メモリ搭載量の 75% 程度となります。ただし、最大で128GBが上限となります。
ページプールの上限値は、システムに設定されている合計仮想メモリの値となります。ただし、最大で128GBが上限となります。
それぞれまとめると、以下のようになります。
非ページプール上限値
32-bit
64-bit
Windows XP
Windows Server 2003
最大256MB
物理メモリ搭載量の40% 程度
※ただし最大128GB
Windows Vista
Windows Server 2008
Windows 7
Windows Server 2008 R2
物理メモリ搭載量の75% 程度
※ただし最大 2GB
※ただし最大 128GB
※Windows Server 2008 R2 は 64-bit バージョンのみとなります。
ページプール上限値
Windows XP : 最大491MBWindows Server 2003 :最大 650MB
非ページプール上限値の 4 倍
合計仮想メモリの値まで
※ただし最大2GB
さて、3 回にわたってお送りしたリソース不足シリーズも今回で終了となります。
えっ、もう終わりかって?
だってほら、3 部作ってなんとなく素敵じゃないですか。。。
計画があるともないとも噂されている、新シリーズにご期待ください。
~ おわり ~
- リソース不足について - 第 1 回
- リソース不足について - 第 2 回
- リソース不足について - 第 3 回 (今回)
Windows テクノロジー サポートの永野です。
今日は、「Windows Server 2008 の [警告のタスク] で引数を正常に渡す方法について」です。
パフォーマンス モニタで監視中に一定のしきい値を超えた時に通知する機能があります。
これが [警告のタスク] です。
設定方法
--------
1. [信頼性とパフォーマンス モニタ] を起動し、[データ コレクト セット] - [ユーザー定義] の順に展開します。
2. [ユーザー定義] を右クリックし、[新規作成] - [データ コレクト セット] を選択します。
3. 名前を適切に入力した後、[手動で作成する] を選択し、[次へ] をクリックします。
4. [パフォーマンス カウンタの警告] を選択し、[次へ] をクリックします。
5. 監視するパフォーマンス カウンタを適切に設定し、[次へ]、[完了] の順でクリックします。
6. 作成されたデータ コレクト セットを選択します。
7. 右ペインの [DataCollector01] を右クリックし、[プロパティ] を選択します。
8. [警告のタスク] タブを選択し、実行するタスクとその引数を設定します。
ここまでが、設定方法になります。
次に実行するタスクを作成する必要があります。
タスクの作成
------------
1. [スタート] - [管理ツール] - [タスク スケジューラ] を選択します。
2. [タスク スケジューラ ライブラリ] - [Microsoft] - [Windows] の順に展開します。
3. [Windows] を右クリックし、[タスクの作成] を選択します。
4. セキュリティ オプションを適切に設定し、[操作] タブを選択します。
5. [新規] をクリックします。
6. [プログラム/スクリプト] に実行したいプログラムを設定します。
7. [引数の追加] に $(Arg0) と入力します。
これで、警告のタスクで設定した引数が、実行したいプログラムに渡されます。
ただ、この使い方では引数に特殊な文字を含む場合、スクリプト実行時に問題が発生します。
この問題は、タスクを以下の設定に変更することで、正常に渡すことが出来ます。
実行するプログラム: c:\windows\system32\cmd.exe 引数の追加: /c <バッチファイルのフルパス> $(Arg0)
※ 警告のタスクで、渡したい引数ごとに "" で括る必要があります。
Windows Server 2003 と同様の挙動にするためには [引数の追加] を以下のように変更する必要があります。
/c ""実行するバッチプログラムのフルパス(※)" "$(Arg0)""
※ 警告のタスクで、渡したい引数を "" で括る必要がありません。
Windows Server 2003 から移行の際、ぜひ参考にしてください。