5分で完了するインストールと実行
PostgreSQLを管理したことがあるなら、原因不明でサーバーのCPU使用率が100%に達した経験があるはずです。pg_stat_activityに対してSELECT文を何度も手入力する代わりに、pg_activityを使いましょう。このツールはhtopコマンドに似ていますが、データベース専用に設計されています。
まずはパッケージマネージャーで素早くインストールできます。ただし、常に最新のアップデート(現在は多くの改善が含まれるバージョン3.x)を受け取るために、pipを使用することをお勧めします。
# Ubuntu/Debianの場合
sudo apt update && sudo apt install pg-activity
# pip経由でのインストール(最新版推奨)
pip install pg_activity
インストール後、スーパーユーザー権限(通常は postgres ユーザー)でデータベースに接続します。この権限があって初めて、システム全体の全プロセスを監視できるようになります。
pg_activity -U postgres -d postgres -h localhost
パスワードを求められたら入力してください。直感的なダッシュボードが表示され、接続数、CPU、RAM、および実行中のクエリ一覧などの詳細な統計情報が表示されます。
ダッシュボード上の「重要」な指標を読み解く
多くの数字に惑わされないでください。システムの動作が重くなったときは、以下の重要な領域に集中しましょう。
- ヘッダー部分:
Load Averageを確認します。この数値がCPUコア数を超えている場合(例:4コアのマシンで10.0など)、サーバーは深刻な過負荷状態にあります。 - PID: プロセス識別子。特定のクエリを強制終了したい場合にこの番号が必要になります。
- STATE: 接続状態。特に
idle in transactionには注意が必要です。これはトランザクションを開始したままコミットもロールバックもされていない接続で、長時間ロックを保持し続ける原因になります。 - TIME: クエリの実行時間。単純なSELECT文で10秒以上かかっている場合は、通常インデックス不足の兆候です。
pg_activityは状態ごとに色分けされているため、非常に素早く状況を判断できます。例えば、active なクエリは目立つ色で表示されるため、数百もの idle 接続の中から簡単に見つけ出すことができます。
フリーズしたSQL(スロークエリ)の迅速な処理
これはこのツールの最も実用的な機能です。実際、アプリケーションのデッドロックや最適化されていないクエリによってリソースが枯渇することがよくあります。
問題のあるクエリを「掃除」する方法:
- 矢印キーを使用して、疑わしいクエリの行に移動します。
- K キー(Kill)を押します。
- 操作を確認します。pg_activityがバックエンドに終了信号を送り、即座にリソースを解放します。
ヒント: Space キーを押すと画面を一時停止できます。これにより、長いSQL文をじっくり確認したり、処理すべきPIDを正確に選んだりでき、リストが頻繁に跳ねて誤ったPIDを選択してしまうのを防げます。
監視を最適化するための高度なショートカット
プロのようにpg_activityを使いこなすには、以下のショートカットを覚えておくと便利です。
- 1、2、3 キー: 表示モードを素早く切り替えます。
1は実行中のクエリ、2は待機中(Waiting)、3は Idle in Transaction の接続を表示します。 - c および m キー: CPUまたはメモリの使用率順にリストをソートします。
- t キー: 実行時間(Duration)順にソートします。システムを遅延させている「遅い クエリ」をあぶり出す最速の方法です。
- r キー: リフレッシュ間隔を変更します(デフォルトは2秒)。データベースが高負荷の場合は、監視プロセス自体の負荷を下げるために5秒や10秒に増やしましょう。
# リソース節約のため、5秒間隔のリフレッシュでpg_activityを実行
pg_activity --refresh 5
実践的なアドバイス:pg_activity かログファイルか?
「プロなら pg_stat_statements を使うべきでは?」という疑問を持つ方もいるでしょう。答えは、使用するタイミングにあります。
ログファイルや分析用の拡張機能は、定期的な最適化に非常に適しています。過去24時間でどのクエリが最も遅かったかを分析できます。しかし、システムが「炎上」しており、顧客から苦情が届き、上司が後ろに立っているような緊急事態では、即座の回答が必要です。
そんな時、pg_activity は救世主となります。直感的でリアルタイムな視点を提供してくれます。どのクエリがCPUの99%を占有しているかが一目で分かり、数回のキー操作でそれを排除できます。
私がよく使うテクニックの一つは、内部ネットワークにあるデータベースに対してSSHトンネルを併用することです。
ssh -t user@jump-host "pg_activity -U postgres -h 10.0.1.5"
この方法は安全であり、データベースのポートをインターネットに公開することなく、リモートでサーバーを監視できます。pg_activityは、PostgreSQLを扱うすべての人にとって、手元に置いておくべき軽量かつ強力なツールです。

