【Oracle入門含む】latchを理解する ーlatch cache baffer chainsとかー

2022/11/23

(最終更新: 2022/11/23

アイキャッチ画像

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」なら問題ない。

参考資料:入門! Oracleデータベース・パフォーマンスチューニング

本題①:待機イベント

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の仕組み
  • データ検索の仕組み
  • 待機イベントの発生する仕組み
  • ラッチの仕組み
  • ハッシュ・チェーンの仕組み

についてまとめた。

間違いがあればコメントいただければ嬉しいです。

参考文献



個別連絡はこちらへ→Twitterお問い合わせ

プロフィール

プロフィールイメージ

はち子

事業会社のシステム部門で働きはじめて5年目の会社員。システム企画/要件定義/システムアーキテクチャ等。

Twitter→@bun_sugi

過去の記事について

はてなブログに掲載の記事(主にプログラミングメモ)についてはこちらに掲載しております。(本ブログに移行中)

タグ一覧

関連記事

Copyright© 2023, エンジニアを目指す日常ブログ

お問い合わせ|プライバシーポリシー