Amazon Aurora — Performance Insights による取得とセクション定義
Performance Insights は Aurora 専用のパフォーマンス分析サービスです。 DB ロード(AAS)の時系列グラフ・待機イベント分析・トップ SQL の識別を通じて、 Oracle AWR の Top 5 Timed Events・SQL Statistics に相当する情報をリアルタイムかつ過去に遡って取得できます。 本記事では各セクションの定義と AWS CLI・API を使った取得方法を解説します。
1. Performance Insights の概要と有効化
Performance Insights は Aurora インスタンスに軽量エージェントを組み込み、データベースの負荷を DB ロード(Average Active Sessions: AAS)という指標で1秒粒度で収集します。 無料期間は7日間、それ以降は有料で最大2年間のデータを保持できます。
有効化手順(AWS マネジメントコンソール)
RDS コンソール → インスタンス選択 → 「変更」→「Performance Insights を有効にする」にチェック → 保存期間とマスターキー(KMS)を設定して適用します。 新規クラスター作成時は「Performance Insights を有効化」がデフォルトで ON です。
有効化手順(AWS CLI)
# Performance Insights を有効化して保持期間を 731 日(2年)に設定
aws rds modify-db-instance \
--db-instance-identifier my-aurora-instance \
--enable-performance-insights \
--performance-insights-retention-period 731 \
--apply-immediately
Performance Insights の DB ロード(AAS)は Oracle AWR の DB Time に相当します。 DB ロードが vCPU 数を超えていると CPU ボトルネック、以下でも高いと待機イベントによる競合が疑われます。
2. セクション定義:DB ロード(AAS)
AWR対応 DB Time / Elapsed Time
DB ロードは「特定の時間帯に実際にアクティブだったセッション数の平均」です。 値が vCPU 数を超えると処理が飽和していることを示します。
| 項目名 | 説明 | AWR 対応項目 |
|---|---|---|
| DBLoad | 期間中の平均アクティブセッション数(AAS)。待機イベント別にスタック表示される。 | DB Time / vCPU |
| DBLoadCPU | CPU 上でアクティブだったセッションの平均数。IO 待ちなどを除いた純粋な CPU 使用。 | CPU Time in DB Time |
| DBLoadNonCPU | 待機イベントで待機していたセッションの平均数。DBLoad から DBLoadCPU を引いた値。 | Non-CPU Wait Time |
CloudWatch メトリクスとして取得
# DBLoad メトリクスを直近1時間で取得(1分粒度)
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name DBLoad \
--dimensions Name=DBInstanceIdentifier,Value=my-aurora-instance \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 60 \
--statistics Average
3. セクション定義:待機イベント分析
AWR対応 Top 5 Timed Events / Wait Class Summary
Performance Insights ダッシュボードの「スライスの基準:待機」を選択すると、 DB ロードを待機イベント別に分解したスタックグラフが表示されます。 Oracle AWR の「Top 5 Timed Events」に相当します。
| 待機カテゴリ | 代表的な待機イベント(Aurora MySQL) | Oracle AWR 対応 |
|---|---|---|
| CPU | CPU | CPU Time |
| I/O 待ち | io/aurora_redo_log_flush、io/file/innodb/innodb_data_file | log file sync / db file sequential read |
| ロック待ち | wait/lock/table/sql/handler、synch/rwlock/innodb/dict_table_stats | enq: TX - row lock contention |
| ネットワーク | wait/io/socket/sql/client_connection | SQL*Net message from client |
| コミット待ち | wait/synch/cond/sql/MYSQL_BIN_LOG::update_cond | log file sync |
Performance Insights API で待機イベントを取得
# Performance Insights API でリソースメトリクスを取得
# ResourceARN は RDS インスタンスの ARN を指定
aws pi get-resource-metrics \
--service-type RDS \
--identifier db:INSTANCE_ID \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period-in-seconds 60 \
--metric-queries '[
{
"Metric": "db.load.avg",
"GroupBy": {
"Group": "db.wait_event",
"Dimensions": ["db.wait_event.name", "db.wait_event.type"],
"Limit": 10
}
}
]'
4. セクション定義:トップ SQL
AWR対応 SQL Statistics(Elapsed Time / CPU Time 順)
Performance Insights ダッシュボードの「スライスの基準:SQL」を選択すると、 DB ロードへの寄与が大きい SQL が上位表示されます。 Oracle AWR の「SQL ordered by Elapsed Time」に相当します。
| 項目名 | 説明 | AWR 対応項目 |
|---|---|---|
| db.sql.statement | SQL テキスト(デフォルト1,024文字まで。完全テキストは詳細画面で確認) | SQL Text |
| db.load.avg | 当該 SQL の平均 DB ロード(AAS)への寄与。選択期間の平均値。 | Elapsed Time / DB Time 寄与率 |
| db.sql.calls | 期間内の実行回数 | Executions |
| db.sql.avg_latency_per_call | 1回あたりの平均実行時間(ミリ秒) | Elapsed Time / Executions |
| db.sql_tokenized.id | トークン化(リテラル値を ? に置換)した SQL のダイジェスト ID | SQL ID |
API でトップ SQL を取得
# DB ロードへの寄与が大きい上位 SQL を取得
aws pi get-resource-metrics \
--service-type RDS \
--identifier db:INSTANCE_ID \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period-in-seconds 3600 \
--metric-queries '[
{
"Metric": "db.load.avg",
"GroupBy": {
"Group": "db.sql_tokenized",
"Dimensions": ["db.sql_tokenized.statement"],
"Limit": 20
}
}
]'
describe-dimension-keys API を使うと、特定の SQL ダイジェスト ID に対して
実行ユーザー・ホスト・待機イベント内訳などを追加で取得できます。
5. セクション定義:ディメンション分析(ユーザー・ホスト)
AWR対応 SQL Statistics(By User / By Module)
Performance Insights では DB ロードを「ユーザー」「ホスト」「データベース」「アプリケーション」 などのディメンション別に分解できます。特定のアプリケーションやバッチ処理が高負荷の原因かを特定するのに有効です。
| ディメンション | 説明 | AWR 対応項目 |
|---|---|---|
| db.user | DB ユーザー別の DB ロード寄与 | SQL ordered by User / Wait by User |
| db.host | 接続元ホスト(IP アドレス)別の DB ロード寄与 | SQL ordered by Module(接続元情報) |
| db.application | アプリケーション名別(Aurora PostgreSQL でアプリ名を設定した場合) | SQL ordered by Module |
| db.name | データベース(スキーマ)名別の DB ロード寄与 | —(インスタンス全体で集計するため) |
6. AWS CLI / API による取得
describe-dimension-keys — 上位ディメンションをリスト取得
# 上位待機イベントと各イベントの DB ロード比率を取得
aws pi describe-dimension-keys \
--service-type RDS \
--identifier db:INSTANCE_ID \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--metric db.load.avg \
--group-by '{"Group":"db.wait_event","Limit":10}' \
--period-in-seconds 3600
Python SDK(boto3)による取得例
import boto3
from datetime import datetime, timedelta, timezone
pi = boto3.client('pi', region_name='ap-northeast-1')
end_time = datetime.now(timezone.utc)
start_time = end_time - timedelta(hours=1)
# トップ SQL(DB ロード寄与順)
response = pi.get_resource_metrics(
ServiceType='RDS',
Identifier='db:INSTANCE_ID',
StartTime=start_time,
EndTime=end_time,
PeriodInSeconds=3600,
MetricQueries=[
{
'Metric': 'db.load.avg',
'GroupBy': {
'Group': 'db.sql_tokenized',
'Dimensions': ['db.sql_tokenized.statement'],
'Limit': 20
}
}
]
)
for key in response['MetricList'][0].get('Keys', []):
sql_text = key['Dimensions'].get('db.sql_tokenized.statement', '')
load = key['DataPoints'][0]['Value'] if key['DataPoints'] else 0
print(f"Load: {load:.4f} SQL: {sql_text[:80]}")
Performance Insights API を使用するには
pi:DescribeDimensionKeys・pi:GetResourceMetrics
権限が必要です。マネージドポリシー AmazonRDSFullAccess または
AmazonRDSReadOnlyAccess で付与されています。
7. セクション定義まとめ
| セクション | 主な取得情報 | Oracle AWR 対応 | 取得方法 |
|---|---|---|---|
| DB ロード(AAS) | DBLoad・DBLoadCPU・DBLoadNonCPU | DB Time | CloudWatch / PI API |
| 待機イベント分析 | 待機イベント名・タイプ・ロード寄与 | Top 5 Timed Events | PI ダッシュボード / get-resource-metrics |
| トップ SQL | SQL テキスト・実行回数・平均レイテンシ・ロード寄与 | SQL Statistics | PI ダッシュボード / get-resource-metrics |
| ディメンション分析 | ユーザー・ホスト・DB 名別ロード | SQL by User / Module | describe-dimension-keys |