Latch free

目次

基本情報

 

プロセスが Willing-to-waitモードで _SPIN_COUNT回スピンを実行してからも latch獲得に失敗して、sleepするということを意味します.

OracleはSGAの構造を保護するためにlatchを使用します。 SGAは、ローカルインスタンス単位で存在するので、ラッチは、そのインスタンスでのみ観察可能です。 Latchの獲得方法は、Willing-to-waitとNo-Wait方式の2つがあります。

Willing-to-wait方式は、ラッチを獲得することができるまで待機するようにSpin方式とPosting方式に分けられます。 Spin方式はlatchを獲得しようとするプロセスがlatchを獲得するのに失敗した場合、適切な回数だけループを回し、ラッチを再取得しようとするこの試みを_SPIN_COUNT(デフォルト2000)パラメータの値に応じて繰り返し(スピン)しlatch獲得を試みます。 Postingように動作するlatchはSpin方式に比べて長時間待機するlatchで先行プロセスがlatchを終了するまで、wait listで待機している方式です。ここで注意する点は、wait listを使用するとしても順序が保証されません。 Posting方式を使用する代表的なlatchはshared pool latchとlibrary cache latchがあります。

ほとんどのラッチ獲得はWilling-to-waitモードを使用しますが、次のような特殊な場合には、No-waitモードを使用します。現在、他のラッチを保有しているプロセスが現在保有しているラッチの中で最も最近獲得したラッチよりも低いか、同じレベルのラッチを獲得しようとするときは、No-waitモードでの獲得を試みます。

Willing-to-waitとNo-Waitの両方を使用する理由は、latchのデッドロックを防止するためです。最近獲得したlatchのlevelと同じか低いレベルのlatchを獲得したときには、No-waitモードに要求して、最新の獲得したlatchのlevelより高いlevelのlatchを獲得しようとするときは、Willing-to-waitモードに要求します。 Latchのデッドロック発生時ORA-600エラーが発生します。

Latchは、基本的にexclusiveモードを使用して、瞬間に1つのプロセスだけがlatchを占有することができますが、特定のlatchはsharedモードで占有することもできます。 9i以上ではcache buffers chains latchの場合、読み取り操作のときにsharedモードを使用します。

9iまではすべてのlatch待機現象がlatch freeで表示されたましたが10gからの重要なlatchは、別の待機イベントで定義されました。 latch名前を直接知ることができないlatch free待機イベントの場合には、P2の値がlatch#なので、この値をV$LATCHNAME.LATCH#と結合するとlatch名前を得ることができます。

10gから分離されたlatchイベントを確認するには、次のクエリで確認することができます。

SQL> select event#, name from v$event_name
         where name like 'latch:%';
EVENT# NAME
---------- ----------------------------------------------------------------
        58 latch: cache buffers chains
       106 latch: redo writing
       107 latch: redo copy
       191 latch: Undo Hint Latch
       193 latch: In memory undo latch
       194 latch: MQL Tracking Latch
       204 latch: row cache objects
       210 latch: shared pool
       211 latch: library cache
       212 latch: library cache lock
......

 

- latch:cache buffers chains
バッファキャッシュ(Buffer cache)で特定のブロックを移動しようとするプロセスは、cache buffers chainsラッチを
獲得しなければなりません。
この過程で競合が発生した場合latch:cache buffers chainsイベントを待機することになります。

 

- latch:cache buffers lru chain
バッファキャッシュ(Buffer cache)でフリーバッファとダーティバッファを移動しようとするプロセスは、
cache buffers lru chainラッチを獲得しなければなりません。
この過程で競合が発生した場合latch:cache buffers lru chainイベントを待機することになります。

 

- latch:shared pool
Shared Poolのヒープ(Heap)領域で、新しいチャンク(Chunk)を割り当てる受けようとするプロセスは、
shared poolラッチを獲得しなければなりません。
この過程で競合が発生した場合latch:shared poolイベントを待機します。

 

- latch:library cache
Library Cache領域を移動しようとするプロセスは、library cacheラッチを獲得しなければなりません。
この過程で競合が発生した場合latch:library cacheイベントを待機します。

 

- latch:redo copy
DMLによる変動を、REDOバッファ(Redo buffer)に記録しようとするプロセスは、作業の全過程の間にredo copyラッチを
獲得しなければなりません。この過程で競合が発生した場合latch:redo copyイベントを待機します。

パラメータと待機時間

 

待機パラメータ

 

latch free待機イベントのパラメータの定義は、以下の通りです。

1.P1:プロセスが待機しているラッチのメモリアドレス。
2.P2:ラッチ番号(V$ LATCHNAME.LATCH#と同じ)ラッチ番号に対応するラッチ人(latch name)
      を見つけるために、以下のSQLステートメントを実行します。
      SELECT* FROM v$ latchname WHERE latch#=&p2_value;
3.P3:試行回数。つまりラッチを獲得するために、プロセスが試行された回数を示します。

 

待機時間

 

イベントの待機時間は指数関数(exponential)的に増加します。

 

チェックポイントと解決策

 

latch freeイベントの発生理由と解決策は、latchの種類に応じて異なります。個別latch freeイベントの説明を参照してください。

Event Tip

 

Latchに関連するDynamic Performance View

 

V $ LATCH:ラッチ(latch)の種類別の統計値
GETS:willing-to-waitモードでスリップする前のラッチ要求の数
MISSES:willing-to-waitモードでスリップする前のラッチ獲得に失敗した回数
SPIN_GETS:willing-to-waitモードでスリップする前のスピンの段階でのラッチ獲得成功回数
SLEEPS:willing-to-waitの両方でのスリップ回数
IMMEDIATE_GETS:no-waitモードでラッチ獲得に成功した回数
IMMEDIATE_MISSES:no-waitモードでラッチ獲得に失敗した回数
SLEEP1〜SLEEP4:1〜3回のスリップ回数と4回以上のスリップの数。オラクル10gR2からV$EVENT_HISTOGRAMビューへ代替
WAITERS_WOKEN:postingによるラッチ獲得方式を使用する場合、セッションが目覚める回数。
        オラクル10gR2以降では使用されません。
WAIT_TIME:ラッチを獲得するために待機した時間(microsecond単位)
 

V$LATCH_PARENT:独立ラッチと親ラッチの統計
V$LATCH_CHILDREN:子ラッチごとの統計値
V$LATCH_HOLDER:ラッチホルダー(holder)に関する情報
V$LATCH_MISSES:ラッチ獲得失敗が発生した、Oracleカーネルコードの位置に関する情報を提供