負荷試験や本番稼働中のデータベースサーバでは、通常さまざまな種類のSQLが実行されています。
昨日紹介したpg_stat_statmentsシステムビューは、PostgreSQLの内部でSQLの実行状況を積算することのできるモジュールでしたが、「pg_stat_statementsを使うには制約が・・・」というケースもあるでしょう。
PostgreSQLには実行しているSQL文をサーバログに出力する機能があります。SQL文だけでなく実行時間なども出力することができるため、このサーバログを集計することによって、どのようなSQLがどれくらい実行されていて、どのSQLにパフォーマンス上の問題がありそうなのか、といったことを絞り込んでいくことができます。
■SQLログ解析ツール「pgBadger」
サーバログを集計するツールとしてはいくつかあるのですが、今日は「pgBadger」というツールを紹介します。
pgBadger
http://dalibo.github.com/pgbadger/
pgBadgerはPerlで作成されたスクリプトで、一昔前にPHPスクリプトで開発されていたpgFouineというプログラムと同様の機能を持っています。コマンドラインでサーバログを指定して実行すると、サーバログを分析したレポートをHTMLファイルで作成してくれます。
また、SQLだけではなく、サーバログに出ているエラーログなども集計してくれます。
■pgBadgerのインストール
それでは、pgBadgerをインストールしてみます。
「インストール」とは言うものの、単一のPerlスクリプトですので、ソースコードのtar.gzアーカイブを取得して展開するだけです。
[snaga@devsv02 pgsql]$ tar zxf pgbadger-2.2-1.tar.gz [snaga@devsv02 pgsql]$ cd pgbadger-2.2 [snaga@devsv02 pgbadger-2.2]$ ls ChangeLog doc/ LICENSE Makefile.PL MANIFEST META.yml pgbadger* README [snaga@devsv02 pgbadger-2.2]$
■サーバログの設定
PostgreSQLはサーバログの設定によって出力される内容や形式が変わってきます。pgBadgerを使うためには、分析に必要な内容がサーバログに出力されている必要がありますので、まずはサーバログの設定を確認します。
pgBadgerでは以下の設定を推奨しています。(出力先にstderrを使う場合)
log_line_prefix = '%t [%p]: [%l-1] ' log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u 'また、サーバログの出力にsyslogを使う場合には、以下のいずれかの設定が推奨されています。
log_line_prefix = 'user=%u,db=%d ' log_line_prefix = 'db=%d,user=%u 'この辺りの詳細についてはpgBadgerのマニュアルを参照してください。
今回のログ関連の設定は以下の通りです。
testdb1=# SELECT name,setting FROM pg_settings WHERE name LIKE 'log%'; name | setting -----------------------------+---------------------- log_autovacuum_min_duration | -1 log_checkpoints | off log_connections | on log_destination | stderr log_directory | pg_log log_disconnections | on log_duration | off log_error_verbosity | default log_executor_stats | off log_file_mode | 0600 log_filename | postgresql-%Y-%m.log log_hostname | off log_line_prefix | %t [%p]: [%l-1] db=%d,user=%u log_lock_waits | off log_min_duration_statement | 0 log_min_error_statement | error log_min_messages | warning log_parser_stats | off log_planner_stats | off log_rotation_age | 1440 log_rotation_size | 0 log_statement | none log_statement_stats | off log_temp_files | 0 log_timezone | Japan log_truncate_on_rotation | on logging_collector | on (27 rows) testdb1=#
■サーバログ解析の実施
それでは、実際にSQLログの解析をしてみます。
pgbadgerコマンドを実行する際、log_line_prefixの値を--prefixオプションで指定し、サーバログのファイル(ここでは/tmp/postgresql-2012-11.log)を引数として与えます。
[snaga@devsv02 pgbadger-2.2]$ ./pgbadger --prefix '%t [%p]: [%l-1] db=%d,user=%u ' /tmp/postgresql-2012-11.log [========================>] Parsed 100810441 bytes of 100810441 (100.00%), queries: 486277, events: 1 [snaga@devsv02 pgbadger-2.2]$ ls ChangeLog LICENSE MANIFEST out.html postgresql-2012-11.log doc/ Makefile.PL META.yml pgbadger* README [snaga@devsv02 pgbadger-2.2]$ログの集計が完了すると、上記のように out.html というレポートファイルが作成されます。 今回のレポートのサンプルは以下の通りです。
pgBadgerサンプルレポート
■レポートの読み方
レポートには、以下のセクションがあります。
- Overall statistics (概要)
- Hourly statistics (日付/時間帯別統計)
- Queries by type (クエリ種別統計)
- Sessions per database (データベース別セッション統計)
- Sessions per user (ユーザ別セッション統計)
- Sessions per host (接続元ホスト別セッション統計)
- Connections per database (データベース別接続統計)
- Connections per user (ユーザ別接続統計)
- Connections per host (接続元ホスト別接続統計)
- Slowest queries (遅いクエリランキング)
- Queries that took up the most time (N) (総実行時間が長いクエリランキング)
- Most frequent queries (N) (実行回数の多いクエリランキング)
- Slowest queries (N) (平均実行時間が長いクエリランキング)
- Most frequent events (N) (もっともよく発生したエラーランキング)
- Logs per type (サーバログ種別統計)
・突出して遅いクエリを探す場合
Slowest queries を確認しましょう。実行時間が特に遅かったクエリを表示してくれます。
Slowest queriesには(N)が付いている統計と付いていない統計がありますが、ここで見るのは(N)が付いていない統計です。
・全体的に実行時間の遅いクエリを探す場合
Slowest queries(N) を見ましょう。こちらは(N)の付いている統計です。
(N)というのは、Day3のpg_stat_statementsシステムビューの時にも出てきたように、クエリのパラメータの値を「?」で置き換えた "normalize" した集計、という意味です。("normanlize" の詳細ついては、Day3のエントリを参照ください。)
・実行回数の多いクエリを探す場合
Most frequent queries(N) を見ましょう。似たようなクエリが何回実行されているか、多い順にランキングされます。
■まとめ
今日は、PostgreSQLのサーバログを集計してパフォーマンス分析をするツール「pgBadger」の使い方を紹介しました。
pgBadgerのようなツールは、あくまでもパフォーマンス分析を支援してくれる、楽にしてくれるツールです。作成されたレポートをどのように読むか、どのように解釈して改善につなげるかがDBAの腕の見せ所になります。
こういったツールを使って手間を省きつつ、ピンポイントで素早くパフォーマンスのボトルネックを特定して改善できるように、日頃から腕を磨いておきましょう。
ではまた。
0 件のコメント:
コメントを投稿