gc buffer busy

概要

gc buffer busyイベントは、ローカルプロセスが読み込もうとしているブロックが現在、リモートノードの処理によって使用中であることを示すイベントです。 gc buffer busyイベントは、buffer busy waitsイベントやread by other sessionイベントのグローバルバージョンと言えます。 サーバプロセスが特定のブロックを使用する時、バッファ・ロックの競合が生じると待機が発生します。 バッファ・ロックの競合が発生した場面によって、これらの待機イベントの中から、一つを選択し、使用することになります。

関連資料 – AsterくんがガイドするOracle Event Tour : gc buffer busy

待機パラメータと待機時間

待機パラメータ

gc buffer busyイベントの待機パラメータは次のようになります。

  • P1 : file#
  • P2 : Block#
  • P3 : id

待機時間

チェックポイントとソリューション

gc buffer busyの対策

バッファ・ロックの競合が発生した原因と、それに該当する待機イベントは次になります。

  • 同一インスタンスの別プロセスが、ディスクにてブロックを読み込み中の場合、I/Oの作業が完了するまでread by other sessionイベントで待機します。 I/O作業を処理するプロセスはdb file sequential readのイベントやdb file scattered readイベントで待機します。
  • また、同一インスタンスの別プロセスに、別のインスタンスからブロックが転送されている場合、転送が完了するまでgc buffer busyイベントで待機します。


gc buffer busyイベントの発生原因と解決方法はbuffer busy waitsイベントの発生原因・解決方法と一致します。その内容は次になります。

  • gc buffer busyイベントが発生する原因として最も一般的だと言われるのが、ホット・ブロックです。したがって原因となるホット・ブロックを分散させることによって問題を解決できます。 セグメントレベルのパーティションを適用、索引の右偏り現象の解消、シーケンスのキャッシュサイズ増大、PCTFREEの増加、等の方法があります。
  • フリーリスト管理(FLM)を使用する場合は、セグメントヘッダーブロックがbuffer競合の原因になることがあります。 Oracle 10g R2からは、基本的に自動セグメント領域管理(ASSM)が使用されるためFLMの環境において、性能問題が生じる可能性が低くなります。もしFLMを使用する環境であるなら、 必ずFREELIST GROUPSの属性をノード数に合わせ、セグメントヘッダーブロックの競合を最小限にする必要があります。
  • SQLのチューニングでアクセスするブロック範囲を少なくしましょう。
  • 同じセグメントに対する大量のDML作業が、複数のノードにて同時多発的に発生すると、広い範囲でバッファ・ロックの競合が発生する可能性があります。 この場合は、アプリケーションを適宜に分散させ実行することで解決できます。