私のPostgresqlサーバーは100%cpuを使用しています。私は、個々のクエリが遅いのか、それとも最初からリクエストが多すぎてサーバーをハンマーで打っているのかを理解しようとしています。
私が知ることができる添付できるプロファイラーの種類はありますか?
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
を最大限に活用するには、デバッグシンボルをインストールする必要があります。