パフォーマンスインサイトは、データベースインスタンスのパフォーマンスチューニング、負荷モニタリング、および関連分析のための主要なツールです。データベースの負荷を視覚的に評価し、リソース待機の原因と関連する SQL 文を特定し、正確なパフォーマンス最適化を実行するのに役立ちます。
機能概要
パフォーマンスインサイトは、データベースインスタンスの負荷とパフォーマンス問題を引き起こす SQL 文を迅速、簡単、かつ直接的に特定するのに役立ちます。主な特徴は次のとおりです:
主要なパフォーマンスメトリックのトレンドチャート: メモリ/CPU 使用率、セッション接続、1 秒あたりのトランザクション数 (TPS)、および 1 秒あたりの入出力操作 (IOPS) のトレンドチャート。
平均アクティブセッション (AAS): インスタンスの負荷をリアルタイムで追跡し、負荷の原因を明確に示します。
多次元の負荷情報: SQL、ユーザー、データベース、待機、ホスト、アプリケーション、セッションタイプなどのディメンションからインスタンスの負荷情報を表示します。
適用範囲
RDS for PostgreSQL は、次の要件を満たしています:
メジャーバージョン: PostgreSQL 13 以降。
製品シリーズ: High-availability Edition および Cluster Edition。
マイナーエンジンバージョン: 20240530 以降。
手順
ステップ 1: パフォーマンスインサイトを有効にする
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[モニタリングとアラート] を選択します。パフォーマンスインサイト タブをクリックします。
[パフォーマンスインサイトを有効にする] ボタンをクリックします。表示されるダイアログボックスで、[OK] をクリックしてこの機能を有効にします。
説明パフォーマンスインサイト機能が不要になった場合は、パフォーマンスインサイト ページの Performance Insight の無効化 をクリックして無効にします。
この機能を有効にした後、しばらく待ちます。その後、パフォーマンスインサイトページにデータが表示され始めます。
ステップ 2: パフォーマンスインサイトを使用して分析する
この機能を有効にすると、[パフォーマンスインサイト] ページで包括的なパフォーマンス分析を実行できます。
パフォーマンスインサイトはパブリックプレビュー中であり、無料です。データは 7 日間保持されます。正式リリースでは、必要に応じてデータ保持期間を延長できます。料金が発生する場合は、事前に通知されます。
パフォーマンス概要の表示 (デフォルトビュー)
パフォーマンスインサイトページで、時間範囲を選択し、[表示] をクリックして、次のコア情報を分析します:
主要なパフォーマンスメトリックのトレンドチャート: これらのチャートは、選択した時間範囲内の CPU/メモリ、接続、TPS、IOPS などのコアメトリックのトレンドを示します。
平均アクティブセッション (AAS): これはパフォーマンス診断のコアチャートです。インスタンスの総負荷 (AAS 値) と、待機イベントや SQL などのディメンション別に分類された負荷構成を示します。AAS チャートのピークは、通常、パフォーマンスボトルネックに対応します。
多次元の負荷情報: AAS チャートの下で、[SQL]、[ユーザー]、[データベース]、[待機] などの複数のディメンションにドリルダウンして、高負荷の原因となっている SQL 文、ユーザー、または待機イベントをすばやく特定できます。

トラブルシューティングケース: 低速 SQL 文の急増によるロック競合
症状
モニタリングデータによると、ある時点で低速 SQL 文の数が急激に増加し、アプリケーションの応答時間が大幅に悪化したことが示されています。
診断分析
ステップ 1: パフォーマンスメトリックのトレンドを分析する
主要なパフォーマンスメトリックのトレンドチャートを確認します。アクティブセッション数は、通常の十数レベルから 00:34 には 1,100 以上に急増しました。これは、PostgreSQL インスタンスの妥当な同時処理能力を超えています。

ステップ 2: 待機イベントを分析する
平均アクティブセッション (AAS) チャートの待機イベント分布は、主なボトルネックが次のイベントによって引き起こされていることを示しています:
Lock/transactionid: トランザクション ID のロック待ち。これは通常、長時間トランザクションまたはデッドロックによって引き起こされます。Lock/tuple: 行レベルのロック待ち。これは、深刻な同時書き込み競合を示します。
アクティブセッション数は、16 コア CPU の理論上の処理限界を超えています。これにより、システムが深刻なロック競合を経験していることが確認されます。

ステップ 3: SQL 文を分析する
Top SQL リストは、上位 2 つのクエリに対して、220 と 119 のセッションがロックリソースの解放を待っていることを示しています。これらの SQL 文がロック待ちチェーンの原因です。

ステップ 4: ソースを追跡する
Top Hosts と Top Databases のデータを使用して、問題の原因を特定します:
ソースクライアント:
140.205.XXX.XXXターゲットデータベース:
perf_test

根本原因の分析
障害タイプ: ロック競合のアバランシェ
技術的原理:
トリガー: クライアントが
perf_testデータベースに対して高同時実行のデータ操作言語 (DML) 操作を開始します。これらの操作には、ホット行の更新や大規模なトランザクション処理が含まれる場合があります。エスカレーションメカニズム: PostgreSQL のロック管理メカニズムでは、複数のトランザクションが同じリソースを競合すると、後続のトランザクションは待機キューに入ります。接続制限やロック待ちタイムアウトの制御がないため、新しい接続が継続的に殺到し、ロック待ちの悪循環が生まれます。
解決策
即時措置:
問題のあるクライアント IP アドレスからの接続数を制限する:
ALTER ROLE target_user CONNECTION LIMIT 10; -- target_user: データベースのユーザー名長時間待機しているセッションを終了させる:
-- まず、終了するセッションの詳細を表示します SELECT pid, -- プロセス ID (セッション識別子) usename, -- データベースのユーザー名 state, -- セッションの状態 (active や idle など) wait_event, -- 特定の待機イベントのタイプ now() - query_start AS query_duration, -- 現在のクエリの実行時間 left(query, 50) AS query_preview -- SQL 文のプレビュー (最初の 50 文字) FROM pg_stat_activity WHERE datname = 'perf_test' -- データベース名を指定します AND client_addr = '140.205.XXX.XXX' -- クライアント IP アドレスを指定します AND state = 'active' -- アクティブなセッションのみをクエリします AND wait_event_type = 'Lock' -- ロックを待機しているセッションのみをクエリします AND pid <> pg_backend_pid() -- 自己終了を防ぐために、このクエリを実行している現在のセッションを除外します AND now() - query_start > interval '5 minutes'; -- クエリが 5 分以上実行されています -- 詳細を確認した後、セッションを終了します SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'perf_test' AND client_addr = '140.205.XXX.XXX' AND state = 'active' AND wait_event_type = 'Lock' AND pid <> pg_backend_pid() AND now() - query_start > interval '5 minutes'; -- ターゲットセッションが終了したかどうかを確認します SELECT pid, usename, state, query FROM pg_stat_activity WHERE datname = 'perf_test' AND client_addr = '140.205.XXX.XXX';
長期的な最適化:
接続プールを設定する: PgBouncer などの接続プールをデプロイして、最大同時接続数を制御します。
タイムアウトパラメーターを調整する:
-- ロック待ちタイムアウトを設定します ALTER DATABASE perf_test SET lock_timeout = '30s'; -- 文の実行タイムアウトを設定します ALTER DATABASE perf_test SET statement_timeout = '60s';アプリケーション層を最適化する:
トランザクションの粒度を減らして、長時間トランザクションを回避します。
オプティミスティックロックまたは分散ロックメカニズムを使用して、ホットスポットデータを処理します。
読み書き分離を実装して、読み取り専用クエリを読み取り専用インスタンスに転送します。
モニタリングとアラートを設定する: アクティブな接続数とロック待ち時間のモニタリングしきい値を設定して、潜在的な障害の早期警告を受け取ります。
この体系的な診断メソッドは、PostgreSQL のパフォーマンス問題の根本原因を迅速に特定し、対象を絞った解決策を開発するのに役立ちます。