RAC環境におけるロックダウンに関する考察 その1

投稿日: 2004年4月07日

<RAC環境におけるロックダウンに関する考察 その1>
ペンネーム ちょびひげ

Oracle 9iのRAC環境では、Write-Writeの競合が発生した場合、書き込みロッ
クを保持していたノードでロック解放(ロックダウン)を行います。

このロック解放でパフォーマンスの問題になるのは:
1.複数ノード間で同一オブジェクトのロックダウン数が多い場合
2.上記1がインデックスの場合の方が影響度は大きい
3.突然カウントが上がったオブジェクトが存在する時間帯

となります。

■全体のロック回数を見る

SQL> l
  1  select count(*) cnt,lru_flag,sum(x_to_null)
  2  from sys.x_$bh
  3* group by lru_flag
SQL> /

       CNT   LRU_FLAG SUM(X_TO_NULL)
---------- ---------- --------------
      4047          0              0
      7694          2              0
      9733          4              0
      5022          6              0
      8586          8           2300

x$bhのLRU_FLAGはブロックの状態を表しています。ここでLRU_FLAG=8は頻繁に
アクセスされるホットブロックを指しています。
上記の状態は:
(1) ホットブロックが8586個ある。
(2) ホットブロックが合計で2300回のロックダウンを経験している
(3) LRU_FLAG!=8のコールドブロックはロックダウンを経験していない

ここで注意しないといけないのは、2300回のロックダウンはデータベースバッ
ファ上に載っているオブジェクトの一部のブロックが複数回ロックダウンを経
験した累積値だという事です。

それでは、これをオブジェクト単位で見てみると:

SQL> select count(*) cnt,lru_flag,sum(x_to_null),obj
  2  from sys.x_$bh
  3  group by lru_flag,obj;

       CNT   LRU_FLAG SUM(X_TO_NULL)        OBJ
---------- ---------- -------------- ----------
       350          0              0          2
         1          0              0          3
         3          0              0          6
        33          0              0          8
         3          0              0         10
         1          0              0         17
        58          0              0         18
....ダァーッ
....
       219          8           1037       7222
       554          8            223       7223
       135          8             44       7224
       175          8            228       7225
         1          8              0       7226
        15          8              0       7227
       133          8              0       7228
        21          8              0       7229
         1          8              0       7230
         1          8              0       7231
         2          8              0       7292
         1          8              0       7372
        16          8              0       7373
         6          8              0       7374
         2          8              0       7375
        25          8              0       7377

これでロックダウンを頻発しているオブジェクトが特定できます。
オブジェクト名は以下のSQLで知ることができます:

select
    o.obj#
    ,o.name
    ,o.subname
    ,o.dataobj#
    ,o.type#
    ,o.owner#
    ,u.name
    ,i.bo#
from sys.obj$ o, sys.ind$ i , sys.user$ u
where u.user#=o.owner#
and   o.obj#=i.obj#(+)
and   o.obj# = xxxx

■しかし、、、、、

重要なのはロックダウンの数は経験値を累計したものだという事です。という
ことは、今ロックダウンが頻発して2300回になったという保証はなく、データ
ベースバッファ上に載っているブロックのロックダウン経験値を合計すると
2300回になったということなのです。

■パフォーマンス面で見ると

繰り返しになりますが、
1.複数ノード間で同一オブジェクトのロックダウン数が多い場合
2.上記1がインデックスの場合の方が影響度は大きい
3.突然カウントが上がったオブジェクトが存在する時間帯

4.上記1,2でロックダウン数が一定期間で上昇しているものが問題発見
    の手がかりになります。
5.それがインデックスであれば重要な問題です。
6.一定期間の上昇が無いのなら「残っているだけの経験値」として無視す
    べきです。
7.その場合は、上記3の突然現れたオブジェクトだけをパフォーマンス劣
    化の手がかりとすべきです。

ということは、ホットオブジェクトとロックダウン数との関係は、、、
次号に続きます。

以上、桜満開の茅ヶ崎にて