log buffer space

概要

REDOログ・バッファにREDOレコードを記録するプロセスは、REDOログ・バッファ内に必要なスペースを確保するためにREDOアロケーション・ラッチの獲得が必要とされます。 REDOアロケーション・ラッチを獲得した後、REDOログ・バッファに空き領域がない場合、スペースが確保できるまで待機します。
この時、状況により2種類のイベント待機が発生します。

  • 現在使用中のREDOログ・ファイルがFULLになり空き領域がない状態であればLGWRはログ・スイッチを実行し
    サーバプロセスはlog file switch completionイベントで待機します。
  • それ以外の場合、log buffer spaceイベントで待機することになります。


前者の場合、ログ・スイッチが実行された直後、log buffer spaceの待機が急増する可能性があります。
これはREDOログ・バッファに記録しようとする多数のセッションがログ・スイッチが終了するまで待機し、その後同時に、記録しようとするためです。

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

待機パラメータ

log buffer spaceの待機イベントは待機パラメータを使用しません。

待機時間

一般的には1秒ですが、log file switchが発生した場合は5秒間待機します。

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

REDOログ・バッファを充分な大きさにします

log buffer spaceの待機はトランザクションによって生成されるREDOの量に比べ、REDOログ・バッファのサイズが小さい時に発生します。 従って、log buffer spaceの待機が広い範囲で発生した場合、REDOログ・バッファのサイズを調査し必要に応じてサイズを調整します。 log buffer space 待機と log file switch completion待機が同時に発生した場合はREDOログ・バッファのサイズと同時に、REDOログ・ファイルのサイズも確認する必要があります。 大概の場合、この2つの待機が同時に発生します。 REDOログ・ファイルのサイズがあまりにも小さい場合、log file switch completionの待機が増加し、ログ・スイッチが終了した直後、再びlog buffer spaceの待機が発生します。 log buffer spaceの待機を減らすためにREDOログ・バッファのサイズを大きくした場合、log file syncの待機が増加することがありますが、この現象を解決するためには、REDOログ・バッファのサイズとlog file syncのイベントを参考にしてください。

REDOログ・バッファの大きさによってlog buffer spaceの待機がどのように現れるかについて確認してみましょう
テストのシナリオは次のようになります

  • 13万行程のデータを持ったtestテーブルに対し、UPDATEを実行します
  • ケース1:REDOログ・バッファの大きさを256KBに指定します
  • ケース2:REDOログ・バッファの大きさを5MBに指定します
  • 2つのケースにおいてlog buffer spaceの待機がどのように発生するかを確認します


ケース1:REDOログ・バッファのサイズが256KBと、非常に小さく設定されている場合

SQL> show sga
Total System Global Area  314572800 bytes
Fixed Size                             788692 bytes
Variable Size                    263190316 bytes
Database Buffers                50331648 bytes
Redo Buffers                         262144 bytes
SQL> update test set id = id, name = name; 131079 rows updated.
SQL> select event, total_waits, time_waited from v$session_event where sid = (select sid from v$mystat where rownum = 1) order by 3 desc;
EVENT TOTAL_WAITS TIME_WAITED ------------------------------------ ----------------- ---------------- SQL*Net message from client 19 24819 log buffer space 1582 6234 db file scattered read 616 4297 log file switch completion 89 1210 db file sequential read 1073 1202 log file switch (checkpoint in 4 137 complete)

-- log buffer space 待機にかなり時間がかかっていることが確認できます。 -- log file switch completion 待機も影響しています。これはREDOログ・ファイルのサイズが適切でないことを意味します。


ケース2:REDOログ・バッファのサイズが5MBと、大きく設定されている場合

SQL> alter system set log_buffer=5242880 scope=spfile;
SQL> --再起動
SQL> show sga
Total System Global Area  314572800 bytes
Fixed Size                             788692 bytes
Variable Size                    258209580 bytes
Database Buffers                50331648 bytes
Redo Buffers                        5242880 bytes
SQL> update test set id = id, name = name; 131079 rows updated.
SQL> select event, total_waits, time_waited from v$session_event where sid = (select sid from v$mystat where rownum = 1) order by 3 desc;
EVENT TOTAL_WAITS TIME_WAITED ---------------------------------- ----------------- ----------------- db file scattered read 81 4783 SQL*Net message from client 18 3718 log buffer space 66 3455 log file switch completion 115 2651 db file sequential read 1208 2103 free buffer waits 1160 944 log file sync 2 10 latch: cache buffers lru chain 2 1 latch: cache buffers chains 2 1 latch: redo allocation 1 1 latch: shared pool 1 1

-- log buffer space イベントの待機回数および待機時間が減少されたことが確認できます

テストの結果から、REDOログ・バッファのサイズがlog buffer spaceのイベント待機に大きな影響を与えることがわかりました。

REDOエントリの生成量を最小限にしましょう

log buffer space待機を減らすもう一つの方法として、REDOエントリの生成量を最小限にする方法があります。ダイレクト・ロード機能を適切に活用しつつ、 nologging optionを与える、等の方法もこれに当たります。

詳しい内容はlog file sync#REDOデータ量とlog file sync待機イベントをご参照ください。

LGWRの性能を改善させましょう

log buffer space待機とfree buffer waits待機は特長が似ています。サーバープロセスのFree bufferが要求するスピードに対して、 DBWRプロセスが遅れてしまうことが原因でfree buffer waits待機が発生するように、サーバープロセスのfree redo buffer領域が要求するスピードにLGWRプロセスがついていけないことから、 log buffer spaceが発生します。