稼動統計情報を活用しよう(1)
NTT オープンソースソフトウェアセンタ 笠原 辰仁
稼動統計情報とは、PostgreSQLが独自に収集・記録している情報です。性能やDB内で起こっている問題などを把握する上で、とても重要です。DBMSでの稼動状況を確認・把握するのに非常に便利なので、この情報を活用し、問題の早期発見やチューニング方法の選択に役立てましょう。
稼動統計情報で分かること
稼動統計情報を活用すると、DBMSを運用する上でとても便利な情報が得られます。特に有用なものを紹介します。なお、稼動統計情報の内容はPostgreSQLのバージョンで若干異なり、新しいバージョンほど得られる情報が増えています。詳しくは「有用な情報を持つテーブル/ビュー」を見てください。
DB単位のコミット数やロールバック数
DB毎に、トランザクションのコミット回数やロールバック回数が分かります。それぞれ、スループットとエラー発生数と置き換えることで、マクロなシステム性能やエラー発生状況の把握ができて便利です。(→具体的な方法)
DBやテーブル、インデックス単位のI/O発生状況
各DBやテーブルで、どれくらいのデータ量が共有メモリで処理できているか、あるいは共有メモリ外からデータを読み込んでいるかが分かります。DBMSはI/Oネックになりやすいため、可能なかぎりメモリ上で処理をこなすことが望ましいです。どの程度それができているかがわかります。(→具体的な方法)
DBやテーブルに対して挿入/更新/削除された行数
各DBやテーブルに対して実施された挿入(INSERT)、更新(UPDATE)、削除(DELETE)された行数が分かります。想定どおりの処理数でシステムが稼動しているかのチェックや、逆にどのテーブルにどれくらいの処理がされているかの調査に使えます。また、PostgreSQLの機能の一つであるHOTの効き具合も確認できます。
テーブル単位で実施された表スキャン回数
各テーブルに対して実施された表スキャン(シーケンシャルスキャン)、インデックススキャン回数が確認できます。DBMSにおいて、表スキャンは性能劣化を引き起こしている主要因の一つです。インデックスの張り忘れや、今までインデックススキャンで処理できていたものが、実行計画の変化等で表スキャンになってしまい性能が落ち込む、といったことが良く見られます。表スキャンの多発の確認や適切にインデックスが張れているのかの調査に使えます。(→具体的な方法)
DBやテーブル、インデックス単位でスキャンされた行数
各DB、テーブル、インデックスに対し、表スキャン、インデックススキャンのそれぞれの方法でスキャンされた行数が確認できます。上記で紹介したスキャン回数と組み合わせると、1回の表スキャンあたりで読み取られた行数がおおよそ分かるので、DBMSにとって重たい処理になりがちな、大量の行を読み取る表スキャンがされていないかのチェックができます。(→具体的な方法)
テーブル単位の行数、ガベージ量
各テーブルの行数、及び更新/削除処理により生じたガベージ(不要となった行)数が確認できます。VACUUMやHOTが適切に機能しているかのチェックに使えます。また、不意のDB肥大化時の要因として、ガベージの増大が関わっていないかの問題切り分けにも使えます。また行数も分かるので、テーブル全体のおおよその行数を SELECT count(*) よりもはるかに低コストで把握することもできます。(→具体的な方法)
現在実施中のSQLやメンテナンス処理
現在、どのようなSQLやメンテナンス処理がいつから実施されているかを確認できます。時間のかかっているメンテナンス処理やロングトランザクション処理となっているものを特定できます。特に、VACUUMやHOTのガベージを掃除する処理を妨げてしまうロングトランザクション処理の有無のチェックは、問題の事前防止に有用です。(→具体的な方法)
稼動統計情報関連の設定
まずは、稼動統計情報を収集できるようなパラメータ設定を行いましょう。8.3以降ではデフォルトで収集するようになっていますので、特に変更しなくても良いです。
パラメータ名 | おすすめの値 |
---|---|
stats_start_collector | on (デフォルト) |
stats_block_level | on |
stats_row_level | on |
stats_command_string | on (8.2ではデフォルトでon) |
stats_reset_on_server_start | off |
パラメータ名 | おすすめの値 |
---|---|
track_activities | on (デフォルト) |
track_counts | on (デフォルト) |
stats_start_collector
稼動統計情報の取得を行うかどうかを指定するパラメータです。デフォルトでonになっています。特に変更する必要はありません。8.3以降では無くなり、常にonとして扱われます。
stats_block_level / stats_row_level / track_counts
block_levelはブロックのread、write数など、row_levelはスキャンされた行数などをそれぞれ収集するかを指定するパラメータです。各テーブル/インデックスデータのキャッシュヒット率や、実施された表スキャンやインデックススキャン回数などが把握できるようになるため、是非有効にしておきましょう。
有効にすることで、若干CPU負荷が高くなるかもしれませんが、数%程度であり、気にする程ではありません。なお、8.2以前のバージョンで autovacuum を使用したい場合は、row_levelは有効にしておく必要があります。8.3以降では、block_level と row_level は track_counts というパラメータに統合され、デフォルトで on になっています。
stats_command_string / track_activities
PostgreSQLで実施されているSQL情報を収集するかを指定するパラメータです。実施中のSQLなどが把握できるようになります。8.2ではデフォルトでonになりました。また、8.3以降では track_activities に名前が変わり、デフォルトで on になっています。
stats_reset_on_server_start
PostgreSQLの再起動時に、収集した情報をクリアするかどうかを指定するパラメータです。最近のバージョンではなくなりました。基本的にoffにしておくことをお勧めします。検証時などに過去の情報をクリアしたいケースでは、稼動統計情報をクリアする下記の関数を実施すると良いでしょう。
=# SELECT pg_stat_reset()
次ページでは、稼動統計情報を実際に取得する方法と情報の見方をご紹介します。