物理I/O関連統計情報について

AWRレポートでTop 5(最近はTop 10)Wait Eventを見て、User I/Oクラスの待機イベントが上位に来ている場合(特にDB CPUの比率が相対的に低い場合)、次のアクションとしてSegment Statisticsセクション「Segments by Physical ~」あたりを見て物理I/O負荷の高いセグメントを特定し、原因となっている高負荷SQLを特定するという流れはよくあると思う。

ただし、インスタンス全体のI/O傾向を把握するにはInstance Activity Statsセクションにも注目した方がよい。これによりSegment Statisticsセクションの内容もより深く理解できるようになる。

システム統計情報

Instance Activity Statsセクションの情報ソースはV$SYSSTATビューであり、存在するシステム統計情報(の種類)を確認するためには以下のようにV$STATNAMEビューにアクセスする。

ここでは、物理I/O関連の統計情報のみを確認したいので17行目で絞り込んでいる。
すべての統計情報(11gR2は600個程度)を確認するには17行目のWHERE句をコメントアウトして実行する。

SQL> select
  2   decode(CLASS,  1,'User'
  3               ,  2,'REDO'
  4               ,  4,'Enqueue'
  5               ,  8,'Cache'
  6               , 16,'OS'
  7               , 32,'RAC'
  8               , 33,'RAC+User'
  9               , 40,'RAC+Cache'
 10               , 64,'SQL'
 11               , 72,'SQL+Cache'
 12               ,128,'Debug'
 13               ,192,'Debug+SQL') CLASS_NAME
 14  --,STATISTIC#
 15  ,NAME
 16  from v$statname
 17  where NAME like 'physical %'
 18  order by
 19   CLASS
 20  --,STATISTIC#
 21  ,NAME;

CLASS_NAME NAME
---------- ----------------------------------------------------------------
Cache      physical read IO requests
           physical read bytes
           physical read flash cache hits
           physical read requests optimized
           physical read total IO requests
           physical read total bytes
           physical read total multi block requests
           physical reads
           physical reads cache
           physical reads cache prefetch
           physical reads direct
           physical reads direct (lob)
           physical reads direct temporary tablespace
           physical reads for flashback new
           physical reads prefetch warmup
           physical reads retry corrupt
           physical write IO requests
           physical write bytes
           physical write total IO requests
           physical write total bytes
           physical write total multi block requests
           physical writes
           physical writes direct
           physical writes direct (lob)
           physical writes direct temporary tablespace
           physical writes from cache
           physical writes non checkpoint
********** ----------------------------------------------------------------
count                                                                    27

27 rows selected.

物理I/O関連の統計情報は上のように27個存在していることがわかる。(11gR2)
NAME列でソートはしているが、ある統計情報は別の統計情報のサブセットとなっていたりしていて、この一覧を見ても各統計情報の関係を把握するのは難しい。

そこで、各統計情報の順番を並び替えリファレンス・マニュアルの解説を追記した一覧を作成したので、以下のリンクから参照されたい。(イメージしやすいように実際のAWRレポートでの値を「例」カラムに表示してある。)
物理I/O関連統計

薄黄色網掛けの行は、補足欄に示すようにSegment Statisticsセクションと関連している。
従ってアプリケーション(ユーザSQL)か、それともバックアップ等によるもののどちらが物理I/O負荷の主な要因なのかを特定するためには、Segment Statisticsセクションを確認することに加えて、Instance Activity Statsセクションも参照した方がよい。

また、薄青色網掛けの行は理解しやすいように便宜的に設けたもので、他の統計情報値から導出されるものである。(計算式は補足欄に記述してある。)

#16,17はExadata、さらに#18もフラッシュバック・データベースに関する統計情報であり、手元の環境では具体的な数値を取得できていないので「例」は空欄にしてある。

#34のphysical reads retry corruptは再読込された破損ブロック数と推察されるが詳細は不明である。

以下は、物理関連IO各統計情報の関係を把握するためのポイントを簡単にまとめたものである。

    • read/writeの区別
      Physicalの次の単語がreadかwriteかで2分される。

      • read
        単数形のreadは次にIO requestsbytesを伴う。単位はそれぞれ異なる。

        • read requests:読取り要求数
        • read bytes:ディスク読取りの合計サイズ(バイト)
      • reads:読取りブロック数(=バッファ数)
        複数形のreadsはブロック数を表す。説明の中でバッファ数という箇所はブロック数に読み替えられる。
      • write
        writeの分類も基本的にreadと同じである。

        • write requests:書込み要求数
        • write bytes:ディスク書込みの合計サイズ(バイト)
      • writes:書き込みブロック数(=バッファ数)
    • totalの有無
      • total IO requests
        read/writeの後がtotalの場合は2種類のブロック要求の合計であり、それぞれの内訳を持つ。

        • total multi block requests
          マルチ・ブロック要求
        • total single block requests*
          シングル・ブロック要求(この統計情報名は存在しないので、totalとtotal multiの差分として導出する。)
      • IO requests|bytes
        read/writeの後にtotalがない場合は、アプリケーションとアプリケーション以外のIO要求の合計となり、内訳を持つ。

        • IO requests|bytes (with application*)
          アプリケーション(ユーザSQL)による。()内は便宜的に付けた名称
        • IO requests|bytes except application*
          アプリケーション以外のバックアップとリカバリおよびその他のユーティリティによる。(この統計情報名も存在しないので、差分を導出する。)

physical write total multi block requestsとは?

読み込みの場合、Index ScanはSingle Block Read、Full ScanはMulti Block Readとなるが、書き込みの場合も、Single / Multi Blockでの操作が存在する。

これらに関しては以下のマニュアルに記述がある。

Oracle® Database概要 12c リリース1 (12.1) B71299-08
データベース・ライター・プロセス(DBW) 抜粋

「多くの場合、DBWによって書き込まれるブロックは、ディスク内に分散されます。このため、この書込みは、LGWRが実行する順次書込みよりも遅くなる傾向があります。効率を向上させるために、可能であればDBWは、マルチブロック書込みを実行します。マルチブロック書込みで書き込まれるブロックの数は、オペレーティング・システムによって異なります。」

Oracle® Databaseパフォーマンス・チューニング・ガイド 12cリリース1 (12.1) B71276-04
V$ビューを使用したI/Oの問題の識別 抜粋

「単一ブロックと複数ブロックの読取り/書込み操作のI/O統計が含まれます。単一ブロック操作は、128KB以下の小規模なI/Oです。複数ブロック操作は、128KBを超える大規模なI/Oです。」

これ以上の情報は見当たらないのだが、書き込むデータ量により単一ブロック/複数ブロック書き込みを効率的に切り替えているように思われる。
ただし、この「ブロック」がOracleブロックなのか別の単位なのかはよくわからない。

V$IOSTAT_FUNCTION*ビューを確認する

ディスクI/O統計を確認するためにはV$IOSTAT_FUNCTION / V$IOSTAT_FUNCTION_DETAILビューにアクセスする。
ここでは、データ・ファイルに特定して確認するのでV$IOSTAT_FUNCTION_DETAILビューを使用する。(説明ではDBWRやLGWRを「データベース関数」と書いてあるがこれは「機能」のことだろう。)

SQL> SELECT
  2   FILETYPE_NAME
  3  ,FUNCTION_NAME
  4  ,SMALL_READ_REQS        SGL_RD_RQ
  5  ,LARGE_READ_REQS        MLT_RD_RQ
  6  ,SMALL_READ_MEGABYTES   SGL_RD_MB
  7  ,LARGE_READ_MEGABYTES   MLT_RD_MB
  8  ,SMALL_WRITE_REQS       SGL_WR_RQ
  9  ,LARGE_WRITE_REQS       MLT_WR_RQ
 10  ,SMALL_WRITE_MEGABYTES  SGL_WR_MB
 11  ,LARGE_WRITE_MEGABYTES  MLT_WR_MB
 12  ,NUMBER_OF_WAITS        NUM_WAITS
 13  ,WAIT_TIME              WAIT_TIME
 14  FROM
 15   V$IOSTAT_FUNCTION_DETAIL
 16  WHERE FILETYPE_ID = 2    -- 「2」はData File
 17  ORDER BY FUNCTION_ID;

FILETYPE_NAME  FUNCTION_NAME       SGL_RD_RQ  MLT_RD_RQ  SGL_RD_MB  MLT_RD_MB  SGL_WR_RQ  MLT_WR_RQ  SGL_WR_MB  MLT_WR_MB  NUM_WAITS  WAIT_TIME
-------------- ------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
Data File      DBWR                        0          0          0          0    2488687      42582      26074       5323          0          0
Data File      Streams AQ                 86          0          1          0          0          0          0          0         86          0
Data File      Buffer Cache Reads     174148       2668       1616       1167          0          0          0          0     172894      10507
Data File      Direct Reads             4704          0         37          0          0          0          0          0          0          0
Data File      Direct Writes               0          0          0          0       5159       4423        127       1025          0          0
Data File      Others                  22178          0        173          0       5977         33         47         30      28153       1691

6 rows selected.
  • SGL_RD_RQ:シングル・ブロックの読取りリクエスト数
  • MLT_RD_RQ:マルチブロックの読取りリクエスト数
  • SGL_RD_MB:シングル・ブロックの読取り要求により読み取られたMB数
  • MLT_RD_MB:マルチブロックの読取り要求により読み取られたMB数
  • SGL_WR_RQ:シングル・ブロックの書き込みリクエスト数
  • MLT_WR_RQ:マルチブロックの書き込みリクエスト数
  • SGL_WR_MB:シングル・ブロックの書込み要求により書き込まれたMB数
  • MLT_WR_MB:マルチブロックの書込み要求により書き込まれたMB数

データ・ファイルに対するI/Oは(otherを含め)6つの機能が関わっていることがわかる。

さらにDBWRに限定して確認すると以下のようになる。

SQL> SELECT
  2   FILETYPE_NAME
  3  ,FUNCTION_NAME
  4  ,SMALL_READ_REQS        SGL_RD_RQ
  5  ,LARGE_READ_REQS        MLT_RD_RQ
  6  ,SMALL_READ_MEGABYTES   SGL_RD_MB
  7  ,LARGE_READ_MEGABYTES   MLT_RD_MB
  8  ,SMALL_WRITE_REQS       SGL_WR_RQ
  9  ,LARGE_WRITE_REQS       MLT_WR_RQ
 10  ,SMALL_WRITE_MEGABYTES  SGL_WR_MB
 11  ,LARGE_WRITE_MEGABYTES  MLT_WR_MB
 12  ,NUMBER_OF_WAITS        NUM_WAITS
 13  ,WAIT_TIME              WAIT_TIME
 14  FROM
 15   V$IOSTAT_FUNCTION_DETAIL
 16  WHERE FUNCTION_ID = 1  -- 「1」はDBWR
 17  ORDER BY FILETYPE_ID;

FILETYPE_NAME  FUNCTION_NAME       SGL_RD_RQ  MLT_RD_RQ  SGL_RD_MB  MLT_RD_MB  SGL_WR_RQ  MLT_WR_RQ  SGL_WR_MB  MLT_WR_MB  NUM_WAITS  WAIT_TIME
-------------- ------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
Control File   DBWR                       25          0          0          0          0          0          0          0         25          0
Data File      DBWR                        0          0          0          0    2489306      42588      26081       5324          0          0
Other          DBWR                        0          0          0          0          0          0          0          0    2344677     353294

DBWRはデータ・ファイルへの書き込みを行うプロセスなので、読み込み側の数値が0であることは辻褄が合う。

しかし、230万回以上(累積値)の待機が発生している「Other」というのはどんなファイル・タイプなのだろう。謎は深まるばかりだ。

今回はここまで