latch freeとは
latch free待機イベントは獲得しようとしたラッチが他プロセスが掴んでいるなどにより獲得できず待機している場合に発生する待機イベントです。 ORACLEでは様々な種類のラッチが定義されていますが、latch freeの待機が発生するのは一部の固有待機イベントが定義されているラッチ (shared poolラッチでの待機専用のイベントである「latch: shared pool」等)以外のラッチで競合が発生した場合となります。 リリースを重ねるにつれ「latch: xxxx」の待機イベントの種類は増えており基本的に「latch free」での待機は比較的マイナーなラッチの競合のケースが多くなっています。補足情報
- マルチコア環境においてはORACLEは基本的にスピンゲットによるラッチ獲得を試み、一定回数スピンしても獲得できなかった場合一定時間sleepして再度獲得を試みます。 latch free待機イベントが発生するのはsleepに達した場合なので待機イベントでlatch freeがs発生していなくても多少のラッチ競合は発生している場合があります
- sleep時間はラッチ獲得が失敗するたびにスリープ時間が伸長していきます。したがって、競合が増えるほど待機時間は指数関数的に増加していく傾向になります
- sleepの待機にはタイムアウト値が存在しています。v$session_eventにはMAX_WAIT(最大待機時間)列がありますが、 タイムアウトすると値がリセットされ再度増加していく動きになっているので最大待機時間が2秒であってもアプリケーションとしては継続して2秒以上待っている可能性があります
対策
同一ラッチを複数プロセスで取り合っているケースがほとんどなので基本的には同じような処理を同時多重で動かすことをやめて直列処理にすれば解消します。
詳しく調べる場合は①何のラッチで待っているか特定する ②競合しているセッションの特定及び競合セッションがその時点で何をしていたのかを確認する必要があります。
①に関してはV$SESSIONやASH上のevent=latch freeの場合のP2列がラッチ番号となっており、この値がv$latchnameのlatch#に対応しているのでここからラッチを特定するか、 statspackやAWRにてLatch ActivityセクションでWaitTime(s)の長いものからもある程度推測することができます。
②に関しては確実に確認するためには待機が発生している瞬間のV$SESSIONやASH等の情報が必要です。