Archive for 12月 5th, 2010
あらためて SQL Server と AWE その 6
あらためて SQL Server と AWE の最後の投稿として、AWE を有効にしている場合のメモリ情報の取得についてまとめていきたいと思います。
今まで、DBCC MEMORYSTATUS やパフォーマンスモニタでメモリの情報を取得してきました。
特定のアプリケーションのメモリを取得する際には、タスクマネージャやパフォーマンスモニタの Process でワーキングセットを取得する方法もあるかと思います。
AWE を有効にした状態でタスクマネージャーの [sqlserver.exe] のプライベートワーキングセットを確認してみます。
92 MB となっていますね。
パフォーマンスモニタで [sqlserver.exe] の [Working Set] を確認してみます。
平均が [116,969,472] Byte となっています。
DBCC MEMORYSTATUS で SQL Server から使用しているメモリを確認してみます。
AWE Allocated は [4,235,376] KB となっていますので、4GB 程度のメモリが使用されています。
AWE が有効になっている環境でのメモリ取得に関して、技術文書に以下の記載があります。
SQL Server での AWE メモリの有効化
SQL Server のパフォーマンス モニターの Total Server Memory (KB) カウンターを使用して、AWE モードで実行されている SQL Server のインスタンスによって割り当てられたメモリ量を特定するか、sysperfinfo からメモリの使用量を選択します。
AWE を有効にしている場合はプロセスからではなく、SQL Server のパフォーマンスモニタから情報を取得します。
SQL Server が使用しているメモリの合計は、
- Buffer ManagerTotal pages
- Memory ManagerTotal Server Memry (KB)
の何れかで取得することが可能です。
以下の画像が情報を取得したものになります。
Total pages は 8KB ページの数が表示されますので、サイズにするためには
540,672 ページ × 8KB = 4,325,376 KB となります。
Total Server Memory (KB) に関しては KB 表示そのままですね。
両方とも同じ値となりますのでどちらから値を取得しても問題はありません。
SQL Server の現状を見るときには基本的に SQL Server 用のカウンタから追っていくことになります。
現状のメモリ使用状況だけを軽く見たいといった時でも SQL Server のカウンタを使うことで正確な値を取得することができます。
6 回に分けて AWE についてまとめてみました。
64bit 化が進んでいる中で、32bit の SQL Server を使用する機会はそれほどないかとは思いますが、SQL Server のメモリの使用状況を勉強するということではいい機会だったと思います。
次の投稿では WOW64 の SQL Server についてまとめてみたいと思います。
あらためて SQL Server と AWE その 5
今回は Denali の AWE についてまとめていきたいと思います。
32bit の Denali でも AWE を設定することができます。
DBCC MEMORYSTATUS で Memory Manager を確認すると AWE Allocated によるメモリ割り当てがされていることが確認できます。
それでは、どれくらいのメモリが割り当てられるかを試してみたいと思います。
# /3GB スイッチは無効にしてあります。
このグラフの情報は AWE を有効にしている状態で取得をしているのですが、メモリが 1.4GB 程度で頭打ちになっています。
AWE について SQL Server 2008 R2 の BOL で確認をしてみました。
awe enabled オプション
この機能は、Microsoft SQL Server の次のバージョンで削除されます。
新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください
SQL Server 2008 R2 の段階で、AWE は次バージョンで削除されることになっています。
# SQL Server 2008 ではこの記載はありませんでしたので、2008 R2 になって明記されたものになります。
SQL Server で実行されているクエリのトレースを取得できるツール、SQL Server Prolifer には [Deprecation] というイベント カテゴリが用意されており、このカテゴリに含まれるイベント クラスを取得すると実行されている SQL が次バージョンでサポートされるかを確認することができます。
Deprecation イベント カテゴリ
それでは、SQL Server 2008 R2 で [awe enabled] を有効にするクエリを実行してイベントを取得してみたいと思います。
[sp_configure] で [awe enabled] を設定しようとすると、[Deprecation Announcement] イベントが発生しているのが確認できます。
メッセージンは以下の内容が表示されています。
sp_configure ‘awe enabled’ は、今後のバージョンの SQL Server では削除される予定です。 新しい開発作業ではこの機能の使用を避け、現在この機能を使用しているアプリケーションでは変更を検討してください。 |
SQL Server Plofiler からも、[awe enabled] に関しては削除対象となっていることが確認できます。
それでは、Denali で [awe enabled] を設定するとイベントが発生するかを確認してみたいと思います。
sp_configure ‘awe enabled’ will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. |
Denali でも 、[Deprecation Announcement] が発生しています。
sp_configure で awe enabled は設定ができているので、構文が使用できるかどうかで見るとこのイベントの発生で正常だと思います。
ただし、メモリが使えるかというと簡単に試したところ、通常のユーザーモードの空間内のメモリしか使えていないようですね…。
/3GB スイッチに関しては想定通りの動きとなり、2GB 以上のメモリ空間の利用が可能となります。
現在は CTP 版なので設定できているのかもしれませんが、SQL Server 2008 R2 の BOL に削除されていると記載されている以上、Denali で AWE が使えると思えるのは危険な気がしますね。
検証した感じでは、32bit の Denali のメモリ割り当ては以下のようになりそうです。
ここまでの投稿で、メモリの情報を取得しながら AWE の動作を簡単に確認してきました。
次の投稿では、AWE 有効時のメモリの使用状況の取得についてまとめたいと思います。
あらためて SQL Server と AWE その 4
前回の投稿で、プランキャッシュの上限について少しまとめてみました。
AWE を有効にしても、プランキャッシュはユーザーモードの中に確保がされますので使用できるメモリは増えません。
プランキャッシュの上限を増やすためには AWE ではなく、/3GB スイッチを利用します。
/3GB スイッチを使用した場合のプランキャッシュの利用状況は以下のようになります。
/3GB スイッチを設定する前は、900 MB 程度だったメモリが、スイッチを設定することにより、1,400 MB 程度まで増加しています。
プランキャッシュですが、Visible ターゲットメモリのサイズに応じて上限が設定されます。
Visible ターゲットメモリは通常のメモリ割り当て (AWE 設定なしで割り当てられるユーザーモード空間) の上限になります。
32bit の場合は 2GB または、3GB が上限となります。
/3GB スイッチを設定しても 3GB のプランキャッシュが設定できるわけではないので注意が必要です。
# いろいろと試してみたのですが、2GB:900 MB / 3GB : 1.4 GB 程度が上限になりそうでしたが、。情報を見ている限りは 75% 取れそうな気もするのですが、これは64bit だけなのかもしれないですね。
/3GB スイッチと AWE を併用した場合のメモリ使用状況はこのようになります。
/3GB スイッチを設定していない場合と比較すると、プランキャッシュの使用状況が増加していることが確認できます。
/3GB スイッチの注意ですが、このスイッチは 16GB を超えるメモリでは使用することができない点です。
AWE の使用
コンピューターに 16 GB を超える使用可能な物理メモリがある場合、オペレーティング システムで 2 GB の仮想アドレス空間がシステム用に必要になるため、サポートできるユーザー モード仮想アドレス空間は 2 GB だけになります。
オペレーティング システムで 16 GB を超えるメモリ範囲を使用するには、Boot.ini ファイルから /3gb パラメーターを削除する必要があります。
このパラメーターがあると、システムで 16 GB を超える物理メモリを使用できません。
プランキャッシュの上限を考えるとできるだけ 64bit のSQL Server を使用したいところですね。
今回は SQL Server 2008 R2 で検証をしていました。
Denali でも 32bit の SQL Server は引き続き提供されます。
次の投稿では、Denali で AWE を有効にした際の動作をまとめていきたいと思います。
あらためて SQL Server と AWE その 3
AWE を使用すると AWE によってマッピングされたユーザーモード (2GB) を超える領域はデータキャッシュでしか使用されないということを聞くことがあるかと思います。
今回はデータキャッシュとプラン (クエリ) キャッシュについてまとめていきたいと思います。
AWE を使用すると以下のようにメモリを使用することが可能となります。
SQL Server のパフォーマンスモニタでは以下のメモリの情報を取得することが可能です。
以下は Denali で取得できる情報になります。
# SQL Server のバージョンによっては項目が違うのですが、似たような情報は他の項目から取得することができます。
- Connection Memory
- Database Cache Memory (Database pages)
- Free Memory
- Granted Workspace Memory
- Lock Memory
- Optimizer Memory
- SQL Cache Memory (Cache Pages)
これと上の図をマッチングしてみます。
ユーザーモードの領域を超えて割り当てが可能なのは [Database Cache Memory] となります。
それではこのあたりの動きを確認していきたいと思います。
まずはデータベースキャッシュメモリを確認してみます。
今回は SQL Server 2008 R2 の環境を使用しています。
# Denali を使用していないのには理由があるのですが、これは別の機会にまとめる予定です。
■AWE を設定していない状態のデータベースキャッシュメモリの使用状況
まずは AWE を設定していない状態でのデータベースキャッシュメモリの使用状況を確認してみます。
データベースキャッシュメモリはデータをキャッシュするために使用されます。
今回は 17 GB 近いデータが格納されているテーブルを用意しました。
このテーブルに対して SELECT を実行して、データベースキャッシュの状態を確認していきたいと思います。
SELECT は SSMS で実行しているのですが、SSMS のプロセスで余計なメモリを消費されないように実行結果はファイルとして出力しています。
# グリッドやテキストで SSMS 上に結果を表示すると SSMS でメモリを消費してしまいますので。
以下のグラフはサーバーの空きメモリとデータベースキャッシュの状態をグラフにしたものです。
AWE を有効にしていないため、メモリを最大限使用できていないことが確認できます。
それでは、AWE を有効にして同様のデータを取得してみます。
■AWE を設定しいる状態のデータベースキャッシュメモリの使用状況
AWE を設定している状態では以下のようなメモリ使用状態となります。
先ほどと比較して、データベースキャッシュに使用できるサイズが増加していることが確認できます。
AWE が有効に働いていますね。
それでは、同様の情報をプランキャッシュでも取得してみたいと思います。
■AWE を設定していない状態のプランキャッシュメモリの使用状況
今回は大量のアドホッククエリを動的に生成して EXEC するクエリを実行して、プランキャッシュにアドホッククエリを大量にキャッシュするようにしてテストをしています。
AWE は設定していないので、プランキャッシュとしては 900 MB 程度が上限となっています。
それでは、AWE を設定して情報を取得してみます。
■AWE を設定している状態のプランキャッシュメモリの使用状況
プランキャッシュに関しては AWE の恩恵が受けられない領域となります。
そのため AWE の設定有無によるメモリ使用量の変更はありません。
AWE を設定してもプランキャッシュは通常のユーザーモードのメモリ空間の中でしか確保ができませんので、AWEの有効有無による差が発生しません。
最後に AWE を有効にした状態で、データベースキャッシュとプランキャッシュを最大限使われるようにした際の情報を取得してみたいと思います。
データベースキャッシュが増加した後にプランキャッシュを増やすようにしています。
# サーバーのスペック的に両方を同時に増加させようとすると結構時間がかかりそうだったもので。
途中からプランキャッシュが増えるようにしていますので、プランキャッシュの増加に合わせてデータベースキャッシュのメモリが減っていります。
AWE を有効にしてもプランキャッシュの上限は変わりません。
プランキャッシュの上限を増やすためには、/3GB スイッチを利用します。
次の投稿では、AWE と /3GB スイッチの併用についてまとめていきたいと思います。