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

投稿日: 2004年5月12日

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

前回は、v$segment_statisticsを見て、書込みが行なわれたオブジェクトの
統計情報を取得する方法を考えました。これは、RACでは書込みの競合での負
荷が高いため、その原因となるオブジェクトを特定する為です。

では実際に書込みの競合を発生させた環境で情報を取得してみましょう。

Oracle10g の環境は以下の通りです。
————————————————–
◆環境
Linux 2.4.9-e.24enterprise
Oracle10g EE Release 10.1.0.2.0
————————————————–

このSQL文自体が負荷を掛けないようにもう少し工夫する必要がありますが、
今回は分かりやすいように単純に記述しています。

SQL> l
  1  select object_name, statistic_name , value
  2  from v$segment_statistics
  3  where statistic_name like 'gc current blocks received'
  4  and value > 0
  5  and obj#   in
  6                    (select obj                            |
  7                    from x$bh x , obj$ o                   |
  8                    where bitand(flag,2097185) > 0         |-
  9                    and x.obj = o.dataobj#                 |  |
 10                    group by obj                           |  |
 11                    )                                         |
 12* order by 3 desc                                             |
SQL> /                                     書込みオブジェク --

OBJECT_NAME    STATISTIC_NAME                      VALUE
-------------- ------------------------------ ----------
ORDERS_I1      gc current blocks received         286201
ORDERS_I2      gc current blocks received         286176
NEW_ORDER_I1   gc current blocks received         276446
ORDER_LINE_I1  gc current blocks received         267995
NEW_ORDER_I2   gc current blocks received         229234
HISTORY_I1     gc current blocks received         131412
CUSTOMER       gc current blocks received         114743
DISTRICT       gc current blocks received          86628
WAREHOUSE      gc current blocks received          73724
HISTORY        gc current blocks received          69672
NEW_ORDER      gc current blocks received          57633
・
・

ORDERSのインデックス(ORDERS_I1、ORDERS_I2)で大量のロックダウンが発
生しています。これは問題ですね。

これを時系列の差分情報で見れば、どの時間帯に、どのオブジェクトでWrite
/Writeの競合が発生したかが分かるわけです。

ただし、
上記のやり方には1つ大きな欠点があります。一旦、バッファ上から追出しが
行なわれた場合は、その時間帯の情報が取得出来ません。つまり、差分が取
れなくなります。部分的に情報が抜けた、連続しない統計情報になるわけです。

このような問題を解決するには、”Writeの多いオブジェクト一覧”といった
テーブルをマスタとして作成し、マスタにあるオブジェクトの統計のみv$seg
ment_statistics から取得する必要があります。さすがにここまでやるには、
ちょっと骨が折れますが。。

この手順で発見したWrite/Writeの競合が発生しているオブジェクトに対して
チューニングを行なっていきます。チューニング方法は色々考えられますが、
RACの場合はアプリケーションの修正が必要なケースが多くなります。

この辺はぜひバックナンバー(Oracle Real Application Clusterの検証)
をみてください。

以上、わさび煎餅が意外と鼻につーんときて驚き!茅ヶ崎にて