web-dev-qa-db-ja.com

Postgresqlインスタンスのプロファイル方法は?

私のPostgresqlサーバーは100%cpuを使用しています。私は、個々のクエリが遅いのか、それとも最初からリクエストが多すぎてサーバーをハンマーで打っているのかを理解しようとしています。

私が知ることができる添付できるプロファイラーの種類はありますか?

  1. 複数の接続にわたって、どのクエリがCPU時間のほとんどをトリガーしますか?
  2. 上記のクエリの場合、クエリあたりの平均実行時間はどれくらいですか?
6
Gili

Linuxまたは親戚を使用している場合は、topを使用してトッププロセスを確認できます。上部で「c」を押すと、プロセスのタイトルが表示され、選択、更新、挿入があるかどうか、またはCPUを使用している他のメンテナンスタスクであるかどうか(ハッキングされて今は誰かのために暗号通貨をマイニングすることは最近一般的であるようです)。また、それぞれが約1つのCPUを使用しているプロセスの数が少ないか、多数のプロセスがCPUのスライスをめぐって争っているのかを確認することもできます。

pg_stat_statements を使用して、各クエリが実行された回数と実行にかかった時間を追跡できます。これは、CPU時間ではなく、実時間を報告します。 track_io_timingをオンにすると、ディスクからの読み取りに費やされた時間も取得できます。これは知っておくと便利ですが、ロックの待機やスライスの待機に時間がかかるため、CPU時間は得られません。 CPU時間の。

問題がより断続的で、行為を把握するのが難しい場合は、 auto_explain および log_min_duration_statement が役立ちます。

より高度なプロファイリングについては、perf topまたはstrace -y -p <pid>などのシステムツールを使用できます。場合によってはgdbを使用することもできます。これらは通常、それらを解釈するためにPostgreSQLの内臓についてのかなりの知識を必要とします。これらは通常、PostgreSQL自体を改善する方法(つまり、将来のバージョン)を調査するために使用されますが、チューニングの問題の診断にも役立つことがよくあります。 perfまたはgdbを最大限に活用するには、デバッグシンボルをインストールする必要があります。

3
jjanes