PostgreSQLの動作状況を可視化する「pgcenter」の導入と活用術

pgcenterとは

pgcenterは、PostgreSQLデータベースの障害解析や状態監視を目的として開発されたコマンドラインツールです。Go言語で記述されており、いわゆる「PostgreSQL版のtop」として機能します。データベース内の統計ビュー(pg_stat_activityやpg_stat_databaseなど)と、OS側のリソース情報(CPU、メモリ、I/O)を統合し、1つの画面上でリアルタイムに刷新可能なTUI(Text User Interface)を提供します。

主な5つの機能

  • リアルタイム監視(topモード)
    Linuxのtopコマンドと同様のインターフェースで、インスタンス全体のTPSや接続数、データベースごとのキャッシュヒット率、テーブルやインデックスのI/O統計、セッションごとの実行クエリ、レプリケーションの遅延状況などを確認できます。矢印キーによるタブ切替が可能です。
  • 待機イベントの分析(profileモード)
    特定のプロセスを対象として秒単位でサンプリングを行い、待機イベント(Wait Event)の発生頻度を集計します。ロック競合、I/O待ち、LWLockなど、ボトルネックの特定に役立ちます。
  • 履歴データの記録とレポート作成
    Prometheusのような外部ツールを使わずに、統計情報のスナップショットをローカルファイルに保存可能です。事後にTSVやCSV形式でレポートを出力できるため、エクセルやスプレッドシートでの解析や、時系列での傾向分析に利用できます。
  • 設定ファイルとログの統合操作
    監視画面からショートカットキー一つでpostgresql.confの編集画面へ遷移でき、設定変更後のリロードも容易です。また、別の端末を開くことなく、データベースのログファイルをtail -fのようにリアルタイムで閲覧できます。
  • 低負荷・低侵入型の設計
    デフォルトでは読み取り専用の権限のみで動作し、データベースへの書き込みを行いません。より詳細な統計が必要な場合にのみ、必要な拡張機能やスキーマを導入する運用が可能です。

pgcenterの導入手順

ここでは、CentOS環境およびPostgreSQL環境への導入手順を例示します。

1. バイナリファイルの取得

GitHubリポジトリから静的リンクされたバイナリをダウンロードし、パスが通っているディレクトリに配置します。

# ダウンロードと展開
wget https://github.com/lesovsky/pgcenter/releases/download/v0.9.2/pgcenter_0.9.2_linux_amd64.tar.gz -O /tmp/pkg_center.tar.gz
tar -xzf /tmp/pkg_center.tar.gz -C /usr/local/bin/

# 実行権限の付与とバージョン確認
chmod +x /usr/local/bin/pgcenter
/usr/local/bin/pgcenter --version

2. 監視用ユーザーの作成(推奨)

データベースへの接続に使用する専用の読み取り専用ロールを作成します。PostgreSQL 9.6以降であれば、pg_monitorロールを付与するのが簡便です。

CREATE ROLE db_observer WITH LOGIN PASSWORD 'secure_pwd_2024';
GRANT pg_monitor TO db_observer;

3. topモードの起動

作成したユーザーで接続し、監視画面を起動します。

pgcenter top --host 127.0.0.1 --port 5432 --username db_observer --dbname postgres

起動後、「F1」キーでヘルプを確認でき、「q」キーで終了します。

4. 統計情報の記録

パフォーマンスの問題が発生している時間帯に合わせて統計情報をファイルへ記録し、後から分析します。

# バックグラウンドまたは手動実行で記録を開始(例:60秒間)
pgcenter record --host localhost --dbname target_db --username db_observer --file /var/lib/pgsql/stats_history.dump
# 記録後、CSV形式でレポートを出力
pgcenter report --input /var/lib/pgsql/stats_history.dump --format csv --output /var/lib/pgsql/report.csv

pgcenter topの主要操作コマンド

監視画面(TUI)で使用できる主なキーバインドは以下の通りです。

キー 動作
F1 / h ヘルプ画面の表示
q / Ctrl+C プログラムの終了
z 画面更新頻度の変更(1秒〜300秒)
- (ハイフン) 指定したPIDのクエリをキャンセル(pg_cancel_backend相当)
_ (アンダースコア) 指定したPIDのセッションを強制終了(pg_terminate_backend相当)
B ディスク使用量情報の表示/非表示
L データベースログのリアルタイム表示(tail -f)
~ psqlセッションの一時起動(\qで戻る)
C / E / R 設定の表示/編集/リロード
a / d / f / r アクティビティ/データベース/関数/レプリケーション情報の切り替え
s / t / i テーブルサイズ/テーブル統計/インデックス統計の切り替え

トラブルシューティングのユースケース

  • 接続数の急増: 「Sessions」タブにてclient_addrやstate、query列を確認し、「idle in transaction」状態のセッションや特定のIPアドレスからの大量接続を特定して対処します。
  • レプリケーション遅延: 「Replication」タブでreplay_lagを確認します。遅延が大きい場合、profileモードを使用してreplayプロセスの待機イベントを解析し、原因を究明します。
  • インデックス不足による遅延: 「Tables」タブでseq_scan(シーケンシャルスキャン)数がidx_scan(インデックススキャン)数に比べて極端に多いテーブルを探し、「Statements」タブで該当テーブルへのアクセスを含むクエリを特定します。
  • 一時ファイルの増加: 「Databases」タブでtemp_filesの増加を監視します。急激な増加が見られる場合、「Statements」タブから大量のwork_memを消費しているSQLを特定します。

拡張機能の有効化と前提条件

pgcenterで詳細なクエリ統計(pg_stat_statements)を利用する場合、PostgreSQLの設定で共有ライブラリを事前にロードしておく必要があります。shared_preload_librariesはカンマ区切りのリスト形式で指定します。

例えば、pg_stat_statementsとレプリケーション管理ツールのrepmgrを同時に有効にする場合は、以下のように設定します。

# postgresql.conf
shared_preload_libraries = 'pg_stat_statements, repmgr'

設定変更後、データベースインスタンスの再起動が必要です。再起動後、データベース内で拡張機能を作成します。

CREATE EXTENSION pg_stat_statements;

設定時の注意点

  • 設定ファイル内でshared_preload_librariesを複数行に分けて記述すると、後の行が前の行を上書きしてしまうため、必ず1行にまとめてください。
  • モジュール名のタイプミスや、カンマの代わりに全角カンマを使用すると、インスタンス起動時に「could not access file」エラーが発生し起動に失敗します。
  • クラウドデータベース(RDS等)を利用している場合、パラメータグループの変更適用後にインスタンスの再起動操作が必要になります。

5月20日 21:04 投稿