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

投稿日: 2004年4月21日

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

今回からOracle 10g のロックダウン統計を見ていきます。

■10g ではx$bh 表からx_to_null のカラムが廃止されています。
実際にSQL文を実行してみるとエラーとして返ってきます。

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

行1でエラーが発生しました。:
ORA-00904: "X_TO_NULL": 無効な識別子です。

■10g でのロックダウンの見方
それでは、10g の場合にはどのようにロックダウンの統計を見るのでしょうか。

実は9i release 2から以下の新しいパフォーマンスビューが追加されています。

v$segstat
v$segment_statistics

2つの違いはv$segment_statistics はv$segstatに、
・オーナ名
・オブジェクト名
・テーブルスペース名
が追加されている点で、基本的な内容に違いはありません。

■ロックダウンに関連する情報
実際に内容を見てみると以下のような統計情報が取得出来ます。
これらの情報はv$sysstat でも見ることが可能ですが、v$segstatではオブジ
ェクト単位に情報の参照が出来る部分がすごいところです。オブジェクト単
位に見られなければチューニングが出来ませんから全く無意味です。

SQL> l
  1  select statistic_name , sum(value)
  2  from v$segment_statistics
  3* group by statistic_name
SQL> /

STATISTIC_NAME              SUM(VALUE)
--------------------------- ----------
ITL waits                            0
buffer busy waits                 3900
db block changes               1668608
gc buffer busy                     180
gc cr blocks received             8711
gc current blocks received       12012
logical reads                  7632208
physical reads                   44455
physical reads direct                1
physical writes                  42898
physical writes direct             108
row lock waits                     310
segment scans                       81
space allocated                7864320
space used                     5272976

注意する点は、
この表にはインスタンス起動時からの全てのオブジェクトの統計情報が累積
値で格納されています。X$BH のX_TO_NULLはデータベースバッファに載って
からの累積値でした。

この中で、Write/Write の競合を表す統計情報は
“gc current blocks received”(カレントブロック受取り回数)です。

これは、文字通り他のインスタンスからカレント・モードでブロックを取得
した際にカウントアップされます。

???

ちょっと混乱して来た読者の方もいると思いますが、もう一度ロックダウン
とは何かを考えると、

(1)Write-Writeの競合が発生

(2)書き込みでロックを保持していたノードでロックダウン(ロック解放)

(3)書き込みでブロックを要求しているノードにブロックを送信

(4)書き込みでブロックを要求したノードの"gc current blocks received"
  (カレントブロック受取り回数)がカウントアップ

つまり、”gc current blocks received”はロックダウンが発生した統計情報
ではなく、ロックダウンを発生させた数で、X_TO_NULL とは逆の意味となる
ので注意する必要があります。

■オブジェクト毎のロックダウンをさせた数

SQL> l
  1  select object_name, statistic_name , value
  2  from v$segment_statistics
  3  where statistic_name like 'gc %'
SQL> /

OBJECT_NAME    STATISTIC_NAME                 SUM(VALUE)
-------------- ------------------------------ ----------
ITEM           gc buffer busy                          0
ITEM           gc cr blocks received                   0
ITEM           gc current blocks received             81
TEST           gc buffer busy                          0
TEST           gc cr blocks received                   0
TEST           gc current blocks received              0
STOCK          gc buffer busy                          1
STOCK          gc cr blocks received                 602
STOCK          gc current blocks received            603
ORDERS         gc buffer busy                          8
ORDERS         gc cr blocks received                   1
ORDERS         gc current blocks received            146
・
・
・
・

インスタンス起動時からの全てのオブジェクトの統計値が累積値として見る
ことが出来ます。ただし、環境によってはトンでもない量のレコードが検索
されるので、このビューにアクセスするにはちょっとした工夫が必要になり
ます。次回はちょっとした工夫を行ってv$segment_statisticsを見ていきま
す。

——
補足1
——
“gc cr blocks received”は読取一貫性ブロック、つまりCRブロックを取得し
ているので、Write/Read の競合になります。また、”gc buffer busy”に関し
ては別の機会に検証します。
——
補足2
——
今回出てきた”gc ~” のgc はglobal cacheの略ですが、
Oracle9iR2 のv$segment_statistics の統計情報は以下のように”gc”とは略さ
れずに”global cache” となっています。


global cache cr blocks served
global cache current blocks served

以上、つけまいがウィルスを蒔き散らす茅ヶ崎にて