連載
» 2004年12月11日 00時00分 公開

Oracleパフォーマンス障害の克服(5):SGAに起因するパフォーマンス障害を発見する (2/3)

[高橋潤,@IT]

データベース・バッファ・キャッシュの見積もり

 まずは、現在のバッファ・キャッシュに空きがあるか確認してみましょう。以下のSQLはX$BHにアクセスするので、SYSユーザーでのログインが必要です。

SQL> SET SERVEROUTPUT ON;
     DECLARE
       cnt_total NUMBER;
       cnt_free NUMBER;
       result NUMBER;
       message VARCHAR2(256);
     BEGIN
       SELECT COUNT(*) INTO cnt_total FROM X$BH;
       SELECT COUNT(*) INTO cnt_free FROM X$BH 
         WHERE STATE = 0;
       result := ROUND((cnt_free / cnt_total), 3) * 100;
       SELECT DECODE(SIGN(result), 1,
           'バッファキャッシュ余裕有り',
           'バッファキャッシュ余裕なし') INTO message
         FROM DUAL;
       DBMS_OUTPUT.PUT_LINE('バッファ空き比率->' || 
           result || '%');
       DBMS_OUTPUT.PUT_LINE(message);
     END;
     /
リスト3 X$BHからバッファ・キャッシュの空き比率を調べる

図3 リスト3の出力結果 図3 リスト3の出力結果(クリックすると拡大します)

 X$BH表とは、Oracleの動的パフォーマンスビューの元表で、データベース・バッファ上にあるオブジェクトを確認できます。X$BH表でSTATE列が0のものはメモリ上の空き領域となります。リスト3のSQLを実行した結果、バッファキャッシュに余裕がない場合にバッファを拡張する必要があり、逆に余裕がある場合は縮小できます。つまり、過負荷時にデータベース全体で確保しているデータベース・バッファサイズのブロック数と空いているブロック数の比率を確認することで、現在のバッファサイズが適切であるかを判断しています。サーバ負荷のピーク時にデータベース・バッファ・キャッシュとして割り当てられたメモリの比率が0以下になってしまうと「バッファ・キャッシュ余裕なし」になってしまいます。平均的に妥当な値を探っていくことになりますが、バーストトラフィックなどを考慮に入れると全体の数%程度の余裕が必要であると考えます。

 拡張するサイズを見積もるために、まず現在のバッファサイズを確認しましょう。V$SGAからも参照できますが、初期化パラメータの設定方法との関連で分かりやすいSHOWPARAMETERで確認してみます。データベース・バッファ・キャッシュの初期化パラメータには、Oracleのバージョンによる大きな違いがありますので注意が必要です。

Oracle9i以降
 初期化パラメータの設定に必要な値は、

データベース・バッファ・キャッシュサイズ=DB_CACHE_SIZE


となります。初期化パラメータとしてはDB_BLOCK_BUFFERSも存在しますが、DB_CACHE_SIZEが設定されている場合この値は無視されます。

SQL> SHOW PARAMETERS DB_CACHE_SIZE

Oracle8i以前
 初期化パラメータの設定に必要なバッファサイズ値は、DB_BLOCK_BUFFERSとDB_BLOCK_SIZEの積で求めることができます。

データベース・バッファ・キャッシュサイズ

          =DB_BLOCK_BUFFERS×DB_BLOCK_SIZE

SQL> SHOW PARAMETERS DB_BLOCK_BUFFERS

SQL> SHOW PARAMETERS DB_BLOCK_SIZE


グラニュル

 Oracle9i以降の動的コンポーネントに関するサイズの指定は、グラニュルという単位で割り当てられるようになりました。グラニュル単位は表1のように、SGA_MAX_SIZEの値によって決定できます。ただし、WindowsNTのような32ビットOSの場合、SGA_MAX_SIZEが128Mbytes以上の場合は8Mbytesとなりますので注意が必要です。

  SGA_MAX_SIZE グラニュル単位
(1) 128Mbytes未満 4Mbytes
(SGA_MAX_SIZEが128Mbytesより少ない場合、グラニュル単位は4Mbytes)
(2) 128Mbytes以上 16Mbytes
(SGA_MAX_SIZEが128Mbytes以上の場合、グラニュル単位は16Mbytes。ただし、32ビットOSは8Mbytes)
表1 SGA_MAX_SIZEとグラニュル単位の関係

 データベース・バッファ・キャッシュのサイズを設定する場合、DB_CACHE_SIZEパラメータを10Mbytesと設定するなら、(1)の場合は12Mbytes、(2)の場合は16Mbytesとなります。現在のグラニュル単位はV$SGA_DYNAMIC_COMPONENTSビューで確認できます。

 取得したバッファ空き比率と現在設定されているバッファサイズの2項目を基に、最適なデータベース・バッファサイズを設定できます。Oracleデータベースサーバ設計時はデータベース・バッファサイズを論理的に見積りますが、今回取得した過負荷時の空きバッファ比率情報を統計的に取得しておくことにより、最適なデータベース・バッファサイズを設定することが可能です。

 バッファサイズは小さくすることにより、OSのページングやスワップが少なくなりパフォーマンスが向上することもありますので、最適なバッファサイズを日々の運用の中から模索することも重要です。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。