前回の投稿では AWE の設定と設定後の確認について投稿しました。
今回は [動的メモリ] についてまとめていきたいと思います。
SQL Server では [min server memory] と [max server memory] を使用した動的なメモリ割り当てを行うことができます。
この 2 つの値設定することで、SQL Server がどの範囲でメモリを使用するかを指定することができます。
# min server memory はメモリ割り当て後の解放をどの程度まで許容するかの設定で、起動時に確実に確保する設定ではありませんが。
AWE の動的なメモリ割り当てについてですが、以下の技術情報が掲載されています。
SQL Server での AWE メモリの有効化
この中に、以下の記載があります。
Windows 2000 オペレーティング システム上で実行される SQL Server では、AWE マップ メモリの動的割り当てがサポートされていないため、インスタンスごとに max server memory オプションを設定することをお勧めします。
Windows Server 2003 上の SQL Server では、AWE メモリの動的割り当てがサポートされます。
AWE の動的メモリ割り当てに関しては、OS によってサポートの有無が変わってきます。
Windows 2000 Server では動的メモリがサポートされていないため、SQL Server が起動時に可能な限りのメモリを Committed にします。
そのため、[max server memory] を指定することで SQL Server が使用するメモリの条件を設定しておきます。
Windows Server 2003 では動的メモリがサポートされ、SQL Server の起動時には、必要最小限のメモリのみを Committed にして、後は必要に応じて動的にメモリを割り当てます。
動的メモリがサポートされていますので、[min server memory] と [max server memory] を指定しなくても最小限のメモリから必要となるメモリのみを確保していく設定となります。
動的メモリがサポートされていても、サーバー上で稼働しているアプリケーションに影響を及ぼさないように [max server memory] は設定をしていた方が良いとは思います。
書籍によっては、[min server memory] と [max server memory] を同一値に設定して、固定メモリ設定とすると書かれているものがありますので、固定メモリ化するのが良いのかもしれないですね。
それでは、AWE の動的メモリ設定についてみていきたいと思います。
今回は SQL Server のバージョンではなく、OS のバージョンによって差が出るということを確認したいため、Windows 2000 Server と Windows Server 2008 上に SQL Server 2005 SP3 の環境を構築しています。
どちらの SQL Server も min server memory = 0 / max server memory =4096 に設定しています。
■Windows 2000 Server の AWE
まずは、Windows 2000 Server の AWE 有効時のメモリ割り当てについて見ていきたいと思います。
SQL Server 2005 でも DBCC MEMORYSTATUS は使用できますので AWE Allocated の値を確認してみます。
起動直後の状態なのですが、3,326,920 KB のメモリが割り当てられているのが確認できます。
今回の環境ではメモリは 4GB 割り当てています。
# 物理メモリ 4GB に対して、SQL Server の割り当てメモリが 4GB なのでこのような割り当て状況になっています。
この環境では、AWE を使用しても 3GB と少しが SQL Server のメモリ割り当ての上限のようですね。
この状態では、物理メモリを確保していますが SQL Server 上では大半のメモリは [Free Pages] として認識されています。
以下の画像はパフォーマンスモニタで [Buffer ManagerFree Pages] を取得した内容になります。
平均して [414,107] ページの空きがあります。
414,107 ページ = 414,107 × 8 KB = 3,312,856 KB
となりますので、メモリを確保していても大半が Free Page として認識されています。
■ Windows Server 2008 の AWE
それでは、Windows Server 2008 の SQL Server 2005 でも同様の確認をしてみたいと思います。
Windows Server 2008 の場合は、Windows Server 2003 と同様に動的メモリがサポートされています。
そのため、SQL Server の起動時には必要最小限のメモリのみを確保した状態で起動がされます。
Windows 2000 Server と同様に、Free Page の状態を確認してみます。
Free Page のサイズは、
73 ページ = 73 × 8 KB = 592 KB
となりますので、確保しているメモリの大半は Free Page ではなく起動に必要な領域となっていることが確認できます。
■SQL Server 2000 で AWE を確認
先ほどは AWE を SQL Server 2005 で確認をしてみましたが SQL Server 2000 SP4 (8.00.2039) でも確認をしてみたいと思います。
SQL Server 2000 でも DBCC MEMORY STATUS は使用できます。
表示形式が SQL Server 2005 とは異なるのですが、[Buffer Distribution] からメモリを確認することができます。
今回は Windows 2000 Server 上に SQL Server 2000 をインストールしていますので、サービスの起動時は可能な限りのメモリが割り当てられます。
SQL Server 2000 の場合は KB ではなく、ページ数で表示がされます。
250,755 ページ = 250.755 × 8KB = 2,006,040 KB
となります。
SQL Serve 2000 では、Free Pages からはうまく値を取得できなかったので、[Memory ManagerTotal Server Memory (KB)] から情報を取得しています。
平均して、[2,021,680 KB] となっています。
4 GB のメモリを搭載した環境で、AWE を有効にして 2GB のメモリ割り当てというのは少し気になりますよね。
SQL Server 2000 SP4 用に以下の修正プログラムが提供されています。
[FIX] 32 ビット版の SQL Server 2000 SP4 を実行するコンピュータで AWE を有効にすると使用できないメモリ領域がある
SP4 では AWE を有効にしても物理メモリの半分までしかメモリが使用できないという不具合があります。
修正プログラムを実行して再度メモリの使用状況を確認してみます。
421,092 ページ = 421,092 × 8KB = 3,368,736
になりますので、先ほどの SQL Server 2005 の時と同程度のメモリが割り当てられています。
修正プログラムを適用すると Free Page の状況も正常に取得することができました。
421,083 ページ = 421,083 ページ × 8 KB = 3,368,664 KB
になりますので、大半が Free Page となっているのが修正プログラムを適用すると確認ができます。
AWE を有効にすると AWE によってマッピングされた 2GB を超える領域はデータキャッシュのみで使用でき、クエリキャッシュはユーザーモードの空間 (2GB の空間) でしか使用できないという話をよく聞くことがあると思います。
次の投稿では AWE で有効にしたメモリの使用状況についてまとめたいと思います。