前回(キャッシュ・フュージョン(基本動作編) - 忘れかけのIT備忘録)に引き続き、今回はキャッシュ・フュージョンの主な待機イベントについて調査しました。
こちらも参考文献を自分なりに解釈してほとんど写経したものです。
キャッシュ・フュージョンの待機イベントはブロックがローカル・キャッシュ(SQLが実行されたインスタンス)に存在するか否かで変わります。
主な待機イベントとその他の待機イベントに分けて書いてます。
例として、インスタンス1をリクエスター、インスタンス2をリソースマスター/リソースホルダーとしています。
●主な待機イベント
(1). ローカル・キャッシュに存在しない場合の待機イベント
イベント
gc [cr | current] [block | grant] [2-way | 3-way | busy | congested]
説明
gc:Global Cache
cr | current:要求ブロックタイプ
block | grant:サーバーから返されるリソースタイプ(ブロック/権限)
2-way | 3-way | busy | congested:リソースの転送状況
- 2-way | 3-way:リソースマスターやリソースホルダーからブロック競合など遅延することなくブロック転送された
- busy:ブロック競合が発生したため、即時にブロック転送できなかった
→主にpin time(ロック獲得)、build time(CRブロック作成)、flush time(ログフラッシュ)が原因で発生する
- congested:ブロック競合などは発生していないが、混雑が発生したため、即時にブロック転送できなかった
→LMSnプロセスにメッセージが送られてから、処理の開始がしきい値(1ms)を超えた場合に発生する
LMSnプロセスにCPUが割り当てられていない、メッセージ数に対してLMSnプロセスが不足しているなどが原因で発生する
→搭載CPU数によるがGCS_SERVER_PROCESSES初期化パラメータでLMSnプロセスを増やせる
※Fixed-upイベントによってブロックの取得方法が分かる
(2). ローカル・キャッシュに存在する場合の待機イベント
イベント
gc buffer busy acquire
説明
ブロックにアクセスしようとしたが、別セッションがリモート・キャッシュから取得中のため、ブロックにアクセスできないため発生する
図だとサーバープロセス2がインスタンス2から送られたブロックにアクセスしようとしているが、サーバープロセス1が取得中のためアクセスできない
イベント
gc buffer busy release
説明
ブロックにアクセスしようとしたが、別インスタンスからブロック要求されて解放中のため、ブロックにアクセスできないため発生する
図だとサーバープロセス3がインスタンス1に送っているブロックにアクセスしようとしているが、サーバープロセス1が使用中のためアクセスできない
●その他の待機イベント
イベント
gc [cr | current] multi block [request | grant | mixed]
説明
リモート・インスタンスにフルスキャン(マルチブロック)要求した
- request:すべてがブロック転送で満たされた(完結した)
- grant:すべてがLock Grant(ロック獲得)で満たされた(完結した)
- mixed:ブロック転送とLock Grant(ロック獲得)が混在した
イベント
gc [cr | current] block direct read
説明
リモート・ブロックのRDMA(Remote Direct Memory Access。ストレージサーバーのPersistent Memoryアクセス)が発生した ※Exadata 18c以降のみ。Exadata経験ないですけど。
イベント
gc [cr | current] block lost
説明
ブロック損失による待機が発生した(Fixed-upイベント)
■参考資料
・オラクルマスター教科書 Oracle Expert RAC 11gR2
・津島博士のパフォーマンス講座 第79回 Real Application Clustersの待機イベントについて