ちょうどよい機会なので、AWEの設定方法について触れておきましょう。「Enterprise Manager」で「SQL Server 2000のプロパティ」を開くことができますが、実はこのプロパティは「sp_configure」環境設定オプションと連動しています。ただし、このプロパティ画面には「AWEを指定する」というチェックボックスがありません(図4)。従って「awe enabled」を有効にしようとすると、やはり「sp_configure」から設定するしかないのです。面倒と感じるかもしれませんが、これができないと、いくら4Gbytes以上の物理メモリを積んでも、SQL Server 2000は通常の動的なメモリ割り当てモードで動作し、4Gbytesまでしかメモリを使用できないのです。
リスト2にAWEを有効にする設定を載せておきましょう。「awe enabled」を「1」に設定するとAWEが有効になり、SQL Server 2000 Enterprise Editionはアドレス空間のサイズを動的に管理しなくなって4Gbytesを超えるメモリを利用できるようになります。
sp_configure 'awe enabled', 1 RECONFIGURE GO
ちなみに、SQL Server 2005のプロパティ画面では、AWEを設定できるようになっています(図5)。
ここで、さらに詳しくAWEの仕組みを見てみましょう。図6に示した「AWEのアドレス空間」の中で、「Buffer Cache」だけが4Gbytesの仮想アドレス空間を超えてメモリを使用しています。これは「Buffer Cache」のみに仮想アドレス空間の4Gbytes制限を超えて使える機能があることを示しています。これを可能にするのがAWEを設定する目的となります。「Buffer Cache」が4Gbytesの仮想アドレス空間外に逃げることで、結果的にほかのオブジェクトは限られた仮想アドレス空間を有効に使えることになり、パフォーマンスが向上します。
そもそもSQL Server 2000には、6種類のメモリ上のオブジェクトがあります。これらのオブジェクトに割り当てられたメモリの合計を設定するのが「sp_configure」環境設定オプションの「max server memory」です。図7ではこれが「4019」(4Gbytes)になっているにもかかわらず、「awe enabled」が「0」のままです。つまり「使える上限は4Gbytes」といいながら、一方で「AWEは使うな」といっているわけですね。これが「メモリはあるのに使えていない」原因です。
上で触れた「6種類のメモリ上のオブジェクト」とは
ですが、この中で最も重要なのが「Buffer Cache」です。ここにはインデックスページやデータページといった重要なキャッシュが格納されています。メモリ上のオブジェクトをモニタした図8で「Buffer Cache」の数値の高低差に注目すると、合計で1.61Gbytes利用できる合計メモリのうち、多いときは1.4Gbytes近くを使っていますが、ほかのオブジェクトにメモリを食われると最低では0.75Gbytes程度まで落ち込んでしまいます。メモリを取り合った結果生じたこの落差が、SQL Serverのパフォーマンスに大きな悪影響を及ぼすのです。
メモリ不足によるオブジェクト間の競合が発生して「Buffer Cache」が少なくなってくると、LRUというアルゴリズム(第1回参照)が、収まり切らなくなったキャッシュを古いものから順に吐き出していきます。これは少ないメモリを有効に使おうとする機能ですが、吐き出されてしまったキャッシュの中にアクセス頻度の高いデータがあると、次のアクセスではSQL Serverはディスクへそのデータを読み込みにいきます。この結果、メモリに余裕があれば必要なかったはずのCPU負荷やディスクI/Oが繰り返し発生する悪循環が起こり、SQL Serverのパフォーマンスを悪化させます。これがいわゆる「メモリプレッシャー」と呼ばれる現象です。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.