pg_monzを使ってみる
複数のPostgreSQLサーバから構成されるクラスタの監視対象には、以下のようなものが挙げられます。
- 個々のPostgeSQLサーバの稼働状況
- PostgreSQLサーバ内に作成されたデータベース、テーブル単位の稼働状況
- PostgreSQLサーバ間のストリーミングレプリケーションの稼働状況
- PostgreSQLサーバへの負荷分散を行うpgpool-IIの稼働状況
- クラスタ全体としてのサービス提供状況
以降では、上記の監視対象に対してpg_monzでどのような監視が行えるのかを、実例を交えて紹介します。
PostgreSQLサーバ
PostgreSQLサーバに接続しているコネクション数の遷移を以下のようなグラフで表示できます。コネクションの総数(Connections)だけではなく、SQL実行中のコネクション(Active connections)、アイドル状態(Idle connections)、ロック待ち状態(Lock waiting connections)といった状態別の内訳を併せて表示でき、無駄なコネクションが専有していないかを確認することができます。
また、PostgreSQLサーバが処理したトランザクションのコミット、ロールバック回数は1秒あたりの平均件数(Transactions Per Second:TPS)を収集して以下のようなグラフで表示できます。このグラフからはPostgeSQLサーバに高負荷がかかった時間帯を読み取ることができ、PostgrSQLサーバの性能チューニングに役立てることができるでしょう。
pg_monzでは、この他にもPostgreSQLサーバから以下のような情報を収集できます。詳細はpg_monzのマニュアルサイトにある監視アイテム一覧を参照してください。
- PostgreSQLサーバの死活状態
- サーバログへのエラーメッセージ出力有無
- チェックポイントの実行回数
データベース
PostgreSQLは1つのサーバ(データベースクラスタ)内にデータベースを複数作成できます。pg_monzはサーバ内のデータベースを自動検知し、各データベース単位で情報を収集する監視項目を自動設定します。
デフォルトのpostgresデータベース以外に「testdb」という名前のデータベースをあらかじめ作成すると、testdbデータベースの容量は以下のようなグラフで表示でき、容量の推移を時系列に把握できます。また、データベースの不要領域の割合(Estimate DB Garage ratio)も併せて表示され、不要領域の増加によるデータベースの肥大化状態を確認することができます。不要領域が大きい場合はVACUUM処理で不要領域がうまく回収されていないことが考えられますので、VACUUM関連の設定チューニングを検討するとよいでしょう。
また、データベース容量に対してはトリガーが設定されており、閾値(デフォルト1GB)を超えるとイベントとして通知されます。閾値はテンプレートのマクロ{$PGDBSIZE_THRESHOLD}で定義されていますので、実環境でPostgreSQLデータベースを配置するディスク容量に合わせた値をテンプレートもしくは対象ホストのマクロに設定してください。
pg_monzでは、この他にもPostgreSQLサーバのデータベースから以下のような情報を収集できます。
- 対象データベースのキャッシュヒット率
- 対象データベースの取得/更新行数
- 対象データベースにおいて一時ファイルに書き出されたデータ量
テーブル
pg_monzはデータベース内のテーブルも自動検知し、各テーブル単位で以下のような情報を収集する監視項目を自動設定できます。
- 対象テーブルへのシーケンシャルスキャン/インデックススキャンの回数
- 対象テーブルの不要領域の割合
- 対象テーブルへのVACUUM/ANALYZE実行回数
- 対象テーブルへの挿入/更新/HOT更新/削除行数
- 対象テーブルの容量
テーブル単位で情報を収集することで、性能チューニングをよりピンポイントに実施することができますが、テーブル数が多くなるほど監視自体の負荷が高騰する懸念があるため、デフォルトでは無効化されています。使用する場合はテンプレートTemplate App PostgreSQLのアイテム(キー:pgsql.get.pg.stat_table)を有効にしてください。