2018.08.01
Latch free
目次
- 1. 基本情報
- 2. パラメータと待機時間
- 3. チェックポイントと解決策
- 4. Event Tip
基本情報
プロセスが 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カーネルコードの位置に関する情報を提供