回答:
pg_stat_activity
システムテーブルを使用して、特定のPostgresバックエンドIDをシステムプロセスIDに一致させることができます。
SELECT pid, datname, usename, query FROM pg_stat_activity;
良い出発点になります。
実行されているクエリがわかったら、さらに調査できます(EXPLAIN
/ EXPLAIN ANALYZE
;ロックのチェックなど)
WHERE
句でそれらを分離できますが、PIDの数が多くない場合は、全出力を簡単に検索できます。Postgresマニュアルにはpg_stat_activity
、他の統計情報収集テーブル(問題がユーザークエリでない場合に役立つ)と同様に、他の統計コレクターテーブルから得られるものに関する追加の詳細があります。
私は同じ問題を抱えていました。postgresqlはAWS RDSでセットアップされ、インスタンスを増やした後でもCPU使用率が100%でした。ここに示す方法でデバッグしましたが、その方法の1つが機能しました。
クエリが最も長く実行されていることを確認すると、特定のクエリがスタックしており、3〜4時間以上実行されていることがわかりました。クエリが実行されている時間を確認するには、次のコマンドを実行します。
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
これが1時間を超える場合は、これが問題です。長時間実行されている接続を強制終了し、アプリケーション側からの接続の最大経過時間を制限します。
postgress
ありpostgres
、あなたはそれを手でコピーしたと思います。