Oracleのデータベースを運用していく中で、性能劣化の原因となるlatch cache baffer chains
の意味を理解する必要があった。
latch cache baffer chains
にたどり着くまで順を追って学習したので記録を残す。
(データベースプロフェッショナルではありません。間違いがあれば最下部のコメントでご指摘をお願いいたします)
はじめに:latch cache baffer chainsとは?
- latch cache baffer chains とは、「待機イベント」の一種である。
- 「待機イベント」とは、データベースの処理がCPUを使わずに待機していた時間のことで、増えると性能劣化の原因となる。
- 待機する理由はさまざまあり、その中でも 「バッファ領域にアクセスするためのラッチを獲得できずに待機」 してしまうものがlatch cache baffer chainsである。
本記事では、順を追って理解していく。
前提:Oracle Databaseの基礎知識
Oracle Databaseの特長
そもそもOracle Databaseとは、有名なリレーショナルデータベース管理システム(RDBMS)。 以下の特長がある。
- 行レベルでロックできる。行ロックが増えてくると表全体をロック(エスカレーション)してしまうDBもあるが、Oracleではそれが無いらしい。
- 検索時点のデータが読み取られることを保証している。(読取り一貫性)
インスタンスとデータベースの違い
データベースは、「インスタンス」と「データベースファイル」のセットになっている。
インスタンスの中身は、以下のようになっている。
- システムグローバル領域(SGA)
- バッファキャッシュ:ディスクから読み込んだデータ・ブロックをキャッシュする。一度問い合わせがあったら、キャッシュしておく。また、データ更新の際には、ある程度まとめてからディスクに書き込むために一時的に保存しておく
- REDOログ・バッファ:REDOログファイルに書き込む前の更新履歴を一時的に取っておく:
- 共有プール:SQL文の情報や、実行計画、データディクショナリが置かれる
- バックグラウンドプロセス
データベースファイルの中には実際のデータが格納されている。
データ検索の仕組み
- 検索されると、サーバプロセスがSQLを解析して共有プールに実行計画を保存する。
- まずはバッファキャッシュから結果を探し、なければデータベースファイルを検索する。そして、結果をバッファキャッシュに展開して返却する。
- AWRレポートの「Buffer Hit %」が低い場合は、データベースファイルへのアクセスが多いことになる。
参考:AWRレポートのイメージ(しばちょう先生の試して納得!DBAへの道 第39回 AWRレポートを読むステップ1:バッファキャッシュ関連の待機イベントと統計情報)
性能を分析するためのレポート
Oracle Databaseの性能を観察、分析するためによく用いられるのが
- AWRレポート(Statspackの進化版)
- OSの統計情報
である。AWRレポートは特にOracleが提供するもので、様々な情報が得られる。
以下3つは特に見たほうが良いとされている。
- Logical Reads:ディスクアクセスを伴う読み書き。ディスクのI/Oが耐えられているのか?Logical Readsの値が高い場合、非効率なSQLである可能性が高い。
- Buffer Hit:データベースのバッファキャッシュヒット率。100%に近づけたい。
- Top 5 Timed Events:待機イベント。インスタンスレベルで、待機率が最も高いイベントの上位5つを示す。1位が「CPU Time」なら問題ない。
本題①:待機イベント
AWRのTop 5 Timed Eventsで確認できる待機イベントとは、プロセスがCPUを使用していない時間のこと。
- Idle待機イベント(SQLのリクエスト待ち)
- その他の待機イベント(バッファ競合、I/O競合、ラッチ競合などによるもの)
の2つが考えられる。
その他の待機イベントが多い場合はデータベースに問題があり、性能劣化につながるおそれがある。
本題②:ラッチ競合
ここで「その他の待機イベント」の可能性の一つにラッチ競合という現象がある。
ラッチとは
- ラッチとは、システムグローバル領域(SGA)のデータ構造を保護するためのメカニズムで、「ロック」のようなもの。
- プロセスがSGA(メモリ)を操作しようとする際に、ラッチを獲得する。すると、その処理でSGAの使用が終了するまでは他の処理がメモリにアクセスできない。このときに 「ラッチ競合による待機」 が起きる。
- ラッチにも種類がある。
- cache buffers chains(バッファキャッシュのチェーンを管理するラッチ。CBCラッチ。)
- cache buffers lru chain(ワーキングセットを管理しているラッチ。)
- shared pool (共有プールラッチ)等。
AWRレポートにおけるラッチ競合の確認の仕方
- ラッチの待機イベントは「latch free」で表される(AWRレポートの「Top 5 Timed Foreground Events」で確認できる)。
- Oracle10以降は、重要なラッチ待機イベントは別の待機イベントとして定義されている。
- latch:cache buffers chains
- latch:cache buffers lru chain
- latch:shared pool
- latch:library cache
- latch:redo copy
- どこでラッチの待機イベントが発生しているかは、AWRレポートの「Latch Statistics」→「Latch Sleep Breakdown(ラッチを獲得できずにスリープした回数)」で確認できる。
latch cache buffers chains
今興味がある問題は、ラッチ競合の中でもlatch cache buffers chainsを獲得できないこと(競合)による待機イベントが増えていることである。
latch cache buffers chains の競合イベントが起きる仕組みは以下のようになっている。
- バッファキャッシュを使うために、ハッシュ・チェーンを探索する場合、セッションはハッシュ・チェーンを管理している cache buffers chainsラッチ(CBCラッチ) を獲得しなければならない。
- ここで競合が発生すると「latch:cache buffers chains」待機イベントとなる。
- Oracle9i以降は、共有モードで獲得することで競合を減らせるようになっているが、現実はSELECT文だけでも競合は起きる。
ハッシュチェーンとは
ハッシュ・チェーンを管理している cache buffers chainsラッチ(CBCラッチ)の「ハッシュチェーン」とは、データ探索の仕組みである。
- Oracleは、バッファキャッシュの効率的管理のために「ハッシュチェーン構造」を使う。
- ハッシュ法・チェイン法に基づいて作られた、データを管理するためのチェーン構造である。
- ハッシュ・チェーン自体は共有プール内に存在する。
ハッシュ法
ハッシュ関数と呼ばれる関数を用いて、「データの格納位置(格納アドレス)」を特定する方法。
例えば、ハッシュ関数が mod (x, 100)
だとすると、「158というデータはmod(158,100)=58の格納アドレスに格納すればよい」とわかる。「58」はハッシュ値と呼ばれる。
この例では、「258」というデータを格納する際に、格納アドレスが「58」となり、「158」と衝突する。これを 「シノニムの発生」 と呼ぶ。
チェイン(チェーン)法
シノニムの発生を解決する方法の一つが チェイン(チェーン)法 である。
チェイン法では、ハッシュ値がすでに利用されていた場合は、連結リストでつないでいく。データ探索の際は、連結リストをたどって検索する。
ラッチ競合による待機イベントが発生する仕組み
ハッシュチェーンに対して、探索中はそのチェーンに対応するラッチを獲得しているため、同じチェーンにあるデータを探索しようとすると、
「待機イベント:latch:cache buffers chains」
が発生する。読取り一貫性ブロック(CRバッファ)について
Oracle Databaseには読取り一貫性を担保する仕組みがある。 そのために、バッファキャッシュには、バッファされた複数のバージョンのデータが保持される。
最新の情報をもったバッファを
カレントブロック
、過去の情報をもったバッファを読取り一貫性ブロック
またはCRブロック
と呼ぶ。(CRバッファと呼んでいる人もいた)latch cache buffers chains待機イベントが起きる原因
主な原因は2つ。
- 非効率なSQL:複数のセッションが、広い範囲を探索しに行く状態。1セッションあたりのラッチの獲得が増え、競合が発生しやすくなる。
- ホットブロックの発生:特定のデータ(ブロック)にアクセスが集中することにより、特定のラッチにアクセスが重なり競合が増える。
どちらが原因かは、特定のラッチ獲得数が多くないかを確認することで見当をつけられる。
SQL>
select * from
(select addr, child#, gets, sleeps from v$latch_children
where name = 'cache buffers chains'
order by sleeps desc
) where rownum <= 20
;
ADDR CHILD# GETS SLEEPS
---------------- ---------- ---------- ----------
C0000000CDFF24F0 569 10500275 11298 <-- ラッチを集中して使用
C0000000CE3ADDF0 827 5250508 8085
C0000000CDF18A98 178 5250192 4781
C0000000CDEDB6E8 68 3786 17
C0000000CE3CBEE0 881 2121 8
C0000000CE359430 675 1768 1
C0000000CDEB6230 1 235 0
※引用:https://www.ex-em.co.jp/blog/latch-cache-buffers-chains/##1.1
latch cache buffers chains待機イベントへの対応
バッファキャッシュをクリアする(一時しのぎ)
SQLを改善する
- 同じ表や索引を複数のセッションが同時にスキャンする場合は、cache buffers chainsラッチの競合が発生する可能性が高い。(ここを見直すのが良い?)
- 一方で、別の表や索引を複数のセッションが同時にスキャンする場合は、 cache buffers lru chainラッチ の競合が発生する可能性が高くなる。(参考)
Oracleのバグが発生していないか調べる(→既知の問題と回避方法)
といった対応が考えられる。
おわりに
本記事では、「cache buffers chains」の待機イベントの仕組みについて理解するため、
- Oracle Databaseの仕組み
- データ検索の仕組み
- 待機イベントの発生する仕組み
- ラッチの仕組み
- ハッシュ・チェーンの仕組み
についてまとめた。
間違いがあればコメントいただければ嬉しいです。
参考文献
- ここからはじめる、Oracle データベース入門・アーキテクチャー編
- 入門! Oracleデータベース・パフォーマンスチューニング
- 0413-1330-oracle-beginner-overview.pdf
- 超入門!Oracleデータベースってなんだ?
- latch cache buffers chains - 日本エクセム株式会社 Oracle待機イベント情報
- ラッチ(Latch)とOracleデータベース - / Grid Thinking /
- 津島博士のパフォーマンス講座 第13回 キャッシュ周りについて
- Oracleメモリ管理機構latch(ラッチ) – データベース研究室
- Oracle 主要な待機イベント - GAGA LIFE.
- AWRレポートを読み解く(6) Buffer Wait・エンキュー・Undo・ラッチ | Tech. N' Oracle
- ハッシュ法とは - ITを分かりやすく解説
- ハッシュ探索①(チェイン法) | Programming Place Plus アルゴリズムとデータ構造編【探索アルゴリズム】 第6章
- V$INSTANCE_CACHE_TRANSFER
- latch:cache buffers lru chain - 日本エクセム株式会社 Oracle待機イベント情報