2015.08.15
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作業が、複数のノードにて同時多発的に発生すると、広い範囲でバッファ・ロックの競合が発生する可能性があります。
この場合は、アプリケーションを適宜に分散させ実行することで解決できます。