CPU高負荷の症状

AWRでCPU高負荷を示すサインは複数あります。以下の指標のいずれかが引っかかったら本記事の手順で分析します。

  • Top 5 Eventsの1位が CPU time
  • Time Model Statistics の DB CPU / DB Time が 80%超
  • Load Profile の Hard Parse / Total Parse が高い
  • OS側でCPU使用率がほぼ100%に張り付いている

全体フローは PART 01 — 全体読み方フロー、ヘルスチェック指標は PART 02 — ヘルスチェック を先に確認してください。

Time Model Statistics を確認する

Time Model Statistics(AWRの Time Model セクション)は、DB Timeの内訳を示します。 DB CPU% DB Time がまず最重要です。

Time Model 項目意味高い場合の診断
DB CPUCPUで実際に処理した時間SQL処理・ソート・ハッシュ結合が重い
sql execute elapsed timeSQL実行時間(待機を含む)重いSQLが存在 → PART 05
parse time elapsed解析(パース)時間ハードパースが多い可能性
hard parse elapsed timeハードパースのCPU時間バインド変数未使用の可能性
PL/SQL execution elapsed timePL/SQL実行時間PL/SQLロジックの最適化が必要

Time Model Statisticsの詳細は PART 04 — Wait Events Statistics 詳細(定義書) 内の Time Model セクションを参照。

CPU関連のWait Eventを読む

CPU高負荷の場合、Top 5 Timed Eventsに「CPU time」が高い割合で現れます。 それに加えて以下の待機イベントが見られる場合は要注意です。

Wait Event意味原因
library cache: mutex Xライブラリキャッシュの競合ハードパース過多・カーソル共有不足
latch: library cacheライブラリキャッシュのラッチ競合同上
cursor: pin S wait on Xカーソルの共有競合同一SQLの同時実行
latch: shared pool共有プールのラッチ競合共有プールサイズ不足

待機イベントの詳細分析は PART 04 — Wait Eventドリルダウン を参照。

ハードパース問題を特定する

ハードパースが多いとCPU使用率が上がり、ライブラリキャッシュ競合も引き起こします。 Load ProfileHard ParsesParses の比率を確認します。

⚠️ ハードパース多発の主な原因

① バインド変数を使わずにリテラル値をSQLに直接埋め込んでいる(WHERE id = 123
cursor_sharing = EXACT(デフォルト)のままバインド変数未使用
③ セッションごとにカーソルをキャッシュしていない(session_cached_cursors が小さい)

ハードパースの原因となる重いSQLは SQL Statistics(定義書) のハードパース件数ランキングを参照。

CPU高負荷 診断フロー

1
Time Model Statistics で DB CPU % を確認
80%超 → CPUが主ボトルネック。以下のステップへ進む
2
SQL Ordered by CPU Time で重いSQLを特定
CPU消費TOP SQLを特定し実行計画を確認 → PART 05 SQL特定
3
Load Profile で Hard Parse比率を確認
5%超 → バインド変数の使用状況を調査
4
PL/SQL execution elapsed time が高い場合
PL/SQLストアドプロシージャの最適化を検討