適用範囲
- ApsaraDB RDS for PostgreSQL
ApsaraDB RDS for PostgreSQLを使用すると、CPU使用率が高い場合や100% 場合があります。 この記事では、CPU使用率が100% する典型的なシナリオを分析して、一般的な原因と解決策について説明します。
以下の点にご注意ください。
CPU使用率が100% 場合は、業務のピーク時にアクティブな接続が急増し、データベースの予約リソースが不足しているかどうかを確認します。 問題が発生したときに、アクティブな接続の数が通常よりもはるかに多いことを確認する必要があります。 ApsaraDB RDS For PostgreSQLインスタンスの場合、ApsaraDB RDSコンソールのモニタリングおよびアラートセクションでデータベースへの接続変更を表示できます。 現在アクティブな接続では、データベースに接続し、次のステートメントを実行してクエリを実行できます。
選択count( * ) from pg_stat_activity where state not like '% idle';
低速SQL文の追跡
アクティブな接続の数が正常な範囲で変化した場合、原因は多数の低速SQL文である可能性があります。 この場合、原因をさらに分析するために、ApsaraDB RDSのスロークエリログを使用して、時間のかかるステートメントを特定できます。 ただし、この問題が発生すると、システム全体が静止し、すべてのSQL文の速度が低下します。 したがって、ログに大量のスロー文が記録されている可能性があるため、問題の原因となっているスロー文を特定することは困難です。 次のセクションでは、低速SQL文を追跡する方法について説明します。
pg_stat_reset() を選択します。pg_stat_statements_reset() を選択します。 select * from pg_stat_statements order by total_time desc limit 5; select * from pg_statements order by shared_blks_hit + shared_blks_read desc limit 5; select datname,
usename,
client_addr,
application_name,
状態、
backend_start,
xact_start,
xact_stay,
query_start,
query_stay,
replace(query, chr(10), ') as query
から
(datnameとしてpgsa.datnameを選択し、
enameをusenameとしてpgsa.usし、
pgsa.client_addr client_addr,
pgsa.application_nameをapplication_nameとして、
pgsa.state as state,
pgsa.backend_startをbackend_startとして、
pgsa.xact_startをxact_startとして、
extract (エポック)
(now() - pgsa.xact_start) からxact_stayとして、
pgsa.query_startをquery_startとして、
extract (エポック)
(now() - pgsa.query_start) からquery_stayとして、
クエリとしてのpgsa.query
pg_stat_activityからpgsaとして
ここでpgsa.state! ='idle'
とpgsa.state! ='idle in transaction'
とpgsa.state! ='idle in transaction (aborted)') idleconnections
query_stay descによる注文
制限5; select * from pg_stat_user_tables where n_live_tup > 100000およびseq_scan > 0 order by seq_tup_read desc limit 10; select * from pg_stat_activity where query ilike '%<table name>%' and query_start - now() > interval '10秒 ';
注: pg_stat_statementsプラグインを使用して、次のステートメントを実行して、テーブルに関連するクエリを見つけることもできます。
select * from pg_statements where query ilike '%<table>%' order by shared_blks_hit + shared_blks_read desc limit 3;
スローSQL文の処理
次の例に示すように、上記の方法を使用して取得した低速SQL文の場合は、それらを終了してビジネスを復元する必要があります。
pg_stat_activityからpg_cancel_backend(pid) を選択し、'%<query text>%' やpid! =pg_backend_pid();
pg_stat_activityからpg_terminate_backend(pid) を選択すると、'%<query text>%' やpid! =pg_backend_pid();
ビジネスにスローSQLステートメントが必要な場合は、次の方法を使用して最適化する必要があります。
ANALYZE [$Table] またはVACUUM ANZLYZE [$Table] ステートメントを実行して、テーブルの統計を更新します。 これにより、クエリ実行プランをより正確にすることができます。 ビジネスへの影響を最小限に抑えるために、ビジネスのオフピーク時にステートメントを実行することをお勧めします。
注: [$Table] は、低速SQLステートメントに関連するテーブルを表します。
explain [$Query_Text]
explain (buffers true, analyze true, verbose true) [$Query_Text]
注: [$Query_Text] はSQLファイルまたはSQL文を表します。