Analyze PostgreSQL Slowlog with pgBadger

Created
Aug 7, 2023 6:29 AM
Tags
PostgreSQL
Editor
Wataru Ito
image

こんにちは、エンジニアの伊藤です。

今回は PostgreSQL のクエリ解析の話をします、と一口に言っても範囲がまだ広いので、まずは対象読者の絞り込みをさせていただきます。

本記事の対象読者

  • AWS RDS DB の利用者である
  • 解析対象は、AWS Aurora for PostgreSQL ではない
  • 解析対象は、AWS RDS for PostgreSQL だが、やんごとなき理由で Version 10 ではない

これでわりと絞り込まれたと思います。すべて YES ならば続きをご覧ください。

ちなみに、AWS Aurora for PostgreSQL or AWS RDS for PostgreSQL Version 10 をご利用の方は、Performance Insights をご覧いただくことをオススメします。いい機能です。

事前準備

Parameter Group の設定変更をお忘れなく。

log_statement = ALL にするとクエリにかかった時間が見えなくなりますのでご注意ください(Managed Service で syslog は見れないのはしょうがないですね)。

PostgreSQL のクエリを解析するには

image

我々はどう解析すればよいのでしょう。

幼き頃より慣れ親しんだ Maatkit も今は亡く、後を継いだ Percona Toolkit は PostgreSQL のみならず Memcached のサポートも切っており、遠き山の端の落日を思わせる寂寥感。ここにも小さな秋がありました。mk-query-digest を rpm から取り出し、perl 5.16 を入れ、クエリの正規化部分を直せば動かすことは可能ですが時間の無駄なのでやめましょう。平成最後の夏も過ぎました。後退するものはあれど我々は前進していくのです。

pg_query_analyser というツールもあるのですが、Ubuntu でないと動かしづらいことに加え、そもそも log_line_prefix を変えられない AWS RDS for PostgreSQL ではちゃんと解析ができません。残念です。動かす手順は一応置いておきますが、後述する pgBadger の方が高機能なので、頑張って使うメリットは特にありません。

cd ~/path/to/workdir/
git clone git@github.com:WoLpH/pg_query_analyser.git

cat <<__EOF__> Dockerfile
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y \
  build-essential \
  qt4-dev-tools \
  qt4-qmake \
  libqt4-dev \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
COPY ./your_postgresql.log /tmp/

COPY ./pg_query_analyser /tmp/pg_query_analyser
WORKDIR /tmp/pg_query_analyser/
RUN qmake -makefile
RUN make
RUN make install
__EOF__

# Setup docker
docker build -t pg_query_analyser .
docker run -it pg_query_analyser bash

# Docker login 
cd /tmp/pg_query_analyser
cat /tmp/your_postgresql.log | pg_query_analyser -i -

# 別 terminal で実行
docker cp \
    $(docker ps | awk '{if($2=="pg_query_analyser") print $1}'):/tmp/report.html .\

open ./report.html

pgBadger

AWS 公式情報でも紹介されています。OSX でも Linux でも動かせるのは良いですね!!! make こそが力であります。

OSX で動かす場合のコマンドを紹介します。

Install pgBadger

https://pgbadger.darold.net/

cd ~/path/to
wget https://github.com/darold/pgbadger/archive/v9.2.tar.gz
tar xf v9.2.tar.gz
cd pgbadger-9.2
perl ./Makefile.PL
make

## お好みでどうぞ
# make install

Analyze postgresql.log.YYYY-mm-dd-HH

cd ~/path/to/pgbadger-9.2

./blib/script/pgbadger \
    -p '%t:%r:%u@%d:[%p]:' \
    --outfile your_file_name.html \
    ~/path/to/postgresql.log-YYYY-mm-dd-HH

open ./your_file_name.html

pgBadger view

出来た HTML を開くとこんな画面です。なかなかかっこよい。

画面上部の項目から統計情報が色々と見れるので小一時間は潰せますね。

image

肝心のクエリ解析ですが、Top という項目から見ることができます。

image

この画面内にいかにもといった期待を感じさせるメニューが並んでいます。

Slowest individual queries

単体で最も遅いクエリをランキングで表示

image

Time consuming queries

最もPostgreSQLの時間を消費したクエリをランキング表示

地味にありがたいことに、クエリ部分をダブルクリックすると見やすく indent してくれます。こういう細かい部分に顕れるのがおもてなしの心って奴なんでしょうねぇ。。

image

他には、Most frequent queries (実行回数の多い順)、Normalized slowest queries (正規化した時に遅い順) もあるので、これで当たりをつけて粛々と Analyze できる訳です。

以上、ご紹介した以外にも便利機能のある pgBadger、使う機会に恵まれることはそれほどありませんがオススメできます。

みなさまの快適な Profiling 生活に幸多からんことを。