JPOUG Advent Calendar 2016 の5日目のエントリーです。
昨日は id:knopp さんの Oracle RAC on Docker - KNOPP’s blog でした。
2012年から始った JPOUG Advent Calendar も今年で 6 年目になりました。
今年は私が AWRレポート*1と OS Watcher を使って Oracle Database の性能分析をどのようにしているかを紹介します。
このエントリが抽象的で分かりにくいと感じる方は 運用ヘルスチェックでトラブルを予防しよう! を見てみてください。
追記(2017/03/05): スライド作ったのでリンクしました
まとめ
- パフォーマンス分析の3軸
- ベースライン
- 時間ベース
- 3-Circle Analysis
- パフォーマンスチューニングの3原則*2
- 仕事量を減らす
- 並列化
- 高速化
3つのポイント
時間単価ベース分析
- 「単価 = DB Time / 仕事量(SQL実行回数など)」の式でベースラインと比較します。
- DB Time はプロジェクトでいう総工数、ベースラインと比較して増えた場合はシンプルに仕事量が増えたか、単価が高くなったかのどちらかになります。
- 業務量が増えた場合は、CPUなどのリソース使用量を確認し、必要に応じてリソース増強を検討します。
- 例)日銀の黒田砲でオンライン証券システムの取引量が急増した。
- 単価が高くなっている場合は何らかの異常がある可能性があるので、深堀調査します。
- 例)db file sequential/scattered read などの平均が 1ms 程度から 10ms 超に増加、iostat の svctm が 1ms から 10ms 超に増加、原因はストレージキャッシュのバッテリー切れだった。
- 業務量が増えた場合は、CPUなどのリソース使用量を確認し、必要に応じてリソース増強を検討します。
分析手順
- AWRレポートをまとめて抽出
- Mac De Oracle: AWRレポート、AWR SQLレポート一括取得スクリプトを作ったよ。 のようなスクリプトで一括出力します。
- CSVに変換
- EXCELのピボットテーブルでグラフ化
- CSVをピボットテーブルを使ってグラフ化して分析します。
- グラフの軸の作り方がポイントになります。機会があれば別エントリで書こうと思います。
定常的な情報収集
- AWR(スナップショット取得間隔:10分間/保持期限:31日間)
- OS Watcher(Doc ID: 301137.1)
分析レポート目次
分析項目例
"チェック内容"はあくまで一例です。監視閾値などに合わせて変更します。
OS*5
- CPU
項目 | チェック内容 | 分析対象項目 | |
---|---|---|---|
CPU使用率 | 100%に達している時間帯がないか sys が 40% を超えていないか |
OSWatcher | [vmstat]-[usr + sys + st] |
ランキュー | CPU数*2を超えていないか | OSWatcher | [vmstat]-[r] |
CPU別使用率 | 特定のCPUで100%で張り付いている時間帯がないか sys が 40% を超えていないか |
OSWatcher | [mpstat]-[user + system + steal + intr + soft] |
- メモリ
項目 | チェック内容 | 分析対象項目 | |
---|---|---|---|
メモリ使用率 | 実質使用量が80%を超えていないか | OSWatcher | [meminfo]-[(MemTotal-(MemFree+Active(file)+Inactive(file)))/MemTotal] |
メモリ使用率内訳 | ページテーブル、スラブキャッシュなどのサイズが想定外に大きくないか | OSWatcher | [meminfo]-[PageTables,Slab] |
ページイン/ページアウトが発生していないか | OSWatcher | [vmstat]-[si, so] | |
スワップ領域使用率 | スワップが発生していないか | OSWatcher | [vmstat]-[swpd] |
- ストレージ*6
項目 | チェック内容 | 分析対象項目 | ||
---|---|---|---|---|
I/Oレスポンス | 20ms を上回っていないか | OSWatcher | [iostat]-[await] | |
I/Oサービスタイム | 10ms を上回っていないか | OSWatcher | [iostat]-[svctm] | |
ディスクビジー率 | 80%を上回っていないか | OSWatcher | [iostat]-[%util] | |
IOPS | カタログスペックを超えていないか*7 | OSWatcher | [iostat]-[r/s. w/s] |
DBインスタンス
- 仕事量
項目 | チェック内容 | 分析対象データ | 分析対象項目 |
---|---|---|---|
SQL実行回数 | なし*8 | AWR Report | [Load Profile]-[Executes] |
トランザクション数 | なし | AWR Report | [Load Profile]-[Transactions] |
ログオンユーザー数 | なし | AWR Report | [Key Instance Activity Stats]-[logons cumulative] |
REDO生成量 | なし | AWR Report | [Load Profile]-[Redo size (bytes)] |
ハードパース回数 | なし | AWR Report | [Load Profile]-[Hard parses] |
物理読込量 | なし | AWR Report | [Load Profile]-[Physical read ] |
論理読込量 | なし | AWR Report | [Load Profile]-[Logical read] |
なし | AWR Report | [Load Profile]-[Global Cache blocks received] / [Global Cache blocks served] |
- DB処理時間
項目 | チェック内容 | 分析対象項目 | |
---|---|---|---|
アクティブセッション数 | アクティブセッション数がCPU_COUNTを超えていないか | AWR Report | [Wait Classes by Total Wait Time]-[Avg Active Sessions] |
時間モデル統計 | なし | AWR Report | [Time Model Statistics] |
待機クラス | なし | AWR Report | [Foreground Wait Class] |
Top N 待機イベント | enqueue、latch、mutex等の割合が高い場合は深堀調査を行う 平均待機時間が長い待機イベントがないか |
AWR Report | [Top 10 Foreground Events by Total Wait Time] |
I/Oレスポンス | db file sequential read db file scattered read direct path read log file sync log file parallel write などが 20ms を上回っていないか |
AWR Report | [Foreground Wait Events] [Wait Event Histogra] [Wait Event Histogram Detai] |
キャッシュフュージョン平均ブロック転送時間 | 10ms を上回っていないか | AWR Report | [Global Cache and Enqueue Services - Workload Characteristics]-[Avg global cache cr/current block receive time (ms)] |
- メモリ使用状況
項目 | チェック内容 | 分析対象データ | 分析対象項目 |
---|---|---|---|
共有プール内訳 | 特定コンポーネントが大きくないか | AWR Report | [SGA Breakdown Difference] |
ラージプール内訳 | 特定コンポーネントが大きくないか | AWR Report | [SGA Breakdown Difference] |
共有プール・ラージプールの immediate 拡張有無 | immediate 拡張が発生していないか | AWR Report | [Memory Dynamic Components] |
バッファキャッシュヒット率 | なし | AWR Report | [Instance Efficiency Percentages] |
RACバッファキャッシュヒット率 | なし | AWR Report | [Global Cache Efficiency Percentages (Target local+remote 100%) ] |
ライブラリキャッシュヒット率 | なし | AWR Report | [Instance Efficiency Percentages] |
BufferPoolAdvisory | バッファキャッシュ拡張によりI/O量削減の可能性が高いか | AWR Report | [Buffer Pool Advisory] |
PGA使用量 | PGA_AGGREGATE_TARGET を超えていないか | AWR Report | [PGA Aggr Target Stats] |
PGA Advisory | PGA拡張によるSQL実行時間短縮の可能性が高いか | AWR Report | [PGA Memory Advisory] |
高負荷SQL
項目 | チェック内容 | 分析対象項目 | |
---|---|---|---|
実行回数の多いSQL(総計) | ベースラインおよび他の期間との比較 | AWR Report | [SQL ordered by Executions] |
物理読込量の多いSQL(総計/1回当り) | 時系列で右肩上がりで増えているSQLがないか | AWR Report | [SQL ordered by Reads] |
論理読込量の多いSQL(総計/1回当り) | 時系列で右肩上がりで増えているSQLがないか | AWR Report | [SQL ordered by Gets] |
CPU時間の長いSQL(総計/1回当り) | 時系列で右肩上がりで増えているSQLがないか | AWR Report | [SQL ordered by CPU Time] |
クラスタ待機時間の長いSQL(総計/1回当り) | 時系列で右肩上がりで増えているSQLがないか | AWR Report | [SQL ordered by Cluster Wait Time] |
共有メモリ使用量の多いSQL(総計) | 共有メモリ使用量が 100MBを超えているSQLがないか | AWR Report | [SQL ordered by Sharable Memory] |
Version Count の多いSQL(総計) | 時系列で右肩上がりで増えているSQLがないか | AWR Report | [SQL ordered by Version Count] |
実行時間の長いSQL(総計/1回当り) | elapsed が undo_retention を超えてい るSQLがないか(1回当たり) | AWR Report | [SQL ordered by Elapsed Time] |
私が見るポイントを一部紹介
DBが遅延しているか?
- システムが遅延していても DB Time が短い場合は、DB は遅延していません。アプリケーションやネットワークなどDBより前のレイヤーで遅延しています。
DBが使った時間の内訳は?
DB Time と DB CPU + Wait Time の比較
- Awr1page - ablog の観点。
- DB Time > CPU Time + Wait Time になるのは以下の4ケース
- ランキュー待ち
- ページング(メジャーフォルト)
- AIX on Power7 SMT のケース
- トレース出力に時間がかかっている
補足
DB Time について
- DB Time はスナップショット間隔より長くなることがあります。例えば、AWRのスナップショットを1時間間隔で取得していて、2セッションがずっとアクティブで実行されていた場合、1時間のスナップショットでも DB Time は2時間になります。
AWRについて
ベースラインなしで評価できる項目
- ベースラインがなくても絶対的な評価ができるものは評価します。例えば、平均I/Oレイテンシが 20ms を超えているなど*9。
参考情報など
参考資料
- https://www.amazon.com/Oracle-Performance-Firefighting-Craig-Shallahamer/dp/0984102302
- http://www.orapub.com/ppts-2015-ausoug-stop-guessing-use-oracle-time-based-analysis
- http://www.orapub.com/tools-firefighting-diagnostic-xls-toolkit
- Exadata X5: AWRレポートにストレージサーバーの情報が追加 | Oracle INOUE Katsumi @ Tokyo Blog
- What's New in Oracle Exadata Database Machine
- http://www.oracle.com/webfolder/technetwork/jp/ondemand/yobohoshu/yobohoshu-no4.pdf
- http://www.oracle.com/webfolder/technetwork/jp/ondemand/ddd2014/A1-4.pdf
過去の JPOUG Advent Calendar 記事
過去の JPOUG Advent Calendar
*1:もしくはStatspackレポート
*2:第四にあらかじめやっておくというのがある。バッチ処理でのデータマート作成、MVIEW や Golden Gate みたいなリアルタイム差分更新など。
*3:例えば、CPU使用率
*4:CPU使用率とCPU時間の換算が必要。スナップショット間隔 *
*6:以下は HDD を想定しています
*7:RACの場合は、全ノードからの IOPS の合計値になります
*8:初回はベースラインとして使用、2回目以降はベースラインと比較
*9:20msは例で、ストレージの基本性能によって変わります。HDDでも 5〜10ms 程度なので、20ms までのびるとサチっていないか、ストレージに異常がないか確認したほうがよいです。ストレージによってはワークロードが