plprofiler プラグインを使用して、 または PolarDB for PostgreSQL (Compatible with Oracle) クラスターのパフォーマンス分析を実行できます。
背景情報
PostgreSQL サーバーでプログラミングを行う場合、PL/pgSQL はブラックボックス環境であるため、内部の問題がパフォーマンスボトルネックになることがあります。 一般的な例は次のとおりです。
-
問題のあるステートメントが、最初は高速に実行されても、複数回呼び出されると低速になります。
-
パフォーマンスボトルネックが不定期に発生します。
-
本番システムでパフォーマンスの問題が発生します。
通常、前述のパフォーマンスの問題は、手動分析 (スキーマ、統計、SQL ステートメントの分析) またはブレークポイント (pldebugger) によってのみトラブルシューティングできます。 トラブルシューティングは時間がかかり、直感的ではありません。また、パフォーマンスの問題は断続的に発生する可能性があります (前述の最初の問題では、根本原因さえ特定できない場合があります)。 したがって、パフォーマンスボトルネックの特定に役立つ、より優れたトラブルシューティング方法が必要です。
plprofiler は、PL/pgSQL のパフォーマンスデータを収集し、パフォーマンスボトルネックを特定するための簡潔な方法を提供します。これにより、関数、ストアドプロシージャ、スキーマのパフォーマンスを的を絞って最適化できます。 このプラグインの詳細については、plprofiler をご参照ください。
前提条件
以下の操作例は、Linux および macOS にのみ適用されます。
-
GitHub から plprofiler のソースコードを取得します。
-
環境変数をエクスポートします。
export PGHOST=<polardb_host> export PGPORT=<polardb_port> export PGUSER=<polardb_user> export PGPASSWORD=<polardb_password> export PGDATABASE=pgbench_plprofiler export PLPROFILER_PATH=<path-to-plprofiler> export USE_PGXS=1 export PATH=<path-to-plprofiler>/bin:$PATH説明例の接続文字列情報を、実際の接続文字列情報に置き換えてください。 エンドポイントの表示方法については、「エンドポイントの表示または申請」をご参照ください。
-
ソースコードのディレクトリに移動し、クライアントソフトウェアをインストールします。 操作例は次のとおりです。
cd $PLPROFILER_PATH/python-plprofiler python setup.py install # sudo python setup.py install、または 'pip install plprofiler' を使用します -
または PolarDB for PostgreSQL (Compatible with Oracle) データベースにログインし、データベースと拡張機能を作成します。 操作例は次のとおりです。
> CREATE DATABASE pgbench_plprofiler; > \c pgbench_plprofiler > CREATE EXTENSION plprofiler; -
テスト用のテーブル、データ、関数を準備します。
cd $PLPROFILER_PATH/examples bash prepdb.sh
パフォーマンス分析
-
plprofiler コマンドを実行して、パフォーマンス分析を行います。 コマンドは次のとおりです。
plprofiler run --command "SELECT tpcb(1, 2, 3, -42)" --output tpcb-test1.html説明tpcb-test1.html は、出力されるパフォーマンス分析ページのファイル名です。
-
コマンドが完了するとエディターが開き、出力 Web ページのタイトル、幅、高さ、説明、その他の情報を編集できます。 何も変更する必要はなく、そのまま終了できます。
[current] title = PL Profiler Report for current tabstop = 8 svg_width = 1200 table_width = 80% desc = <h1>PL Profiler Report for current</h1> <p> <!-- ここに説明を入力 --> </p> -
ブラウザーで tpcb-test1.html を開きます。
フレームグラフから、パフォーマンスに最も影響を与える関数が
tpcb_fetch_abalanceであることがわかります。 分析の結果、インデックスがないことがパフォーマンス低下の原因であるとわかります。tpcb_upd_accountsのパフォーマンスも低いですが、この関数は子関数の影響を受けている可能性があります。 まず子関数を最適化してから、パフォーマンスが正常かどうかを確認する必要があります。 -
インデックスを作成して最適化を行います。 操作例は次のとおりです。
psql > CREATE INDEX pgbench_accounts_aid_idx ON pgbench_accounts (aid); -
plprofiler コマンドを再度実行して、パフォーマンス分析を行います。
フレームグラフから、
tpcb_fetch_abalanceがもはやパフォーマンスボトルネックではないことがわかります。tpcb_fetch_abalanceが最適化されたため、tpcb_upd_accountsの実行時間も短縮されます。結果が期待どおりの場合、最適化は完了です。 結果が期待どおりでない場合は、新しいフレームグラフから引き続きパフォーマンスボトルネックを特定し、最適化できます。