box/Anemometer: Box SQL Slow Query Monitor
中身はpt-query-digestの テーブル出力機能 (サマライズした結果をMySQLのテーブルに保存する機能があるのだ)に依存していて、スローログの可視化というよりはpt-query-digestの可視化というのがたぶん正しい。
だけどこのやり方にはちょっと弱点があって、pt-query-digestはクエリーをサマライズする時に発生時間の情報を 「そのダイジェストが最初に現れた時間(ts_min)」と「そのダイジェストが最後に現れた時間(tx_max)」 という値にサマライズしてしまう。よく見る出力結果の中では"Time range"として表示されている。
# Query 14: 0.00 QPS, 0.00x concurrency, ID 0xAF17C328E1020443 at byte 10391443 # This item is included in the report because it matches --outliers. # Scores: V/M = 13.70 # Time range: 2015-11-02 10:55:08 to 2015-12-18 15:20:14 # Attribute pct total min max avg 95% stddev median # ============ === ======= ======= ======= ======= ======= ======= ======= # Count 0 13 # Exec time 0 163s 2s 51s 13s 29s 13s 9s # Lock time 0 5ms 271us 445us 354us 424us 65us 301us # Rows sent 9 544.87k 3.91k 104.73k 41.91k 97.04k 33.62k 46.68k # Rows examine 0 12.00M 238.87k 3.04M 945.00k 1.46M 808.81k 725.01k # Query size 0 24.29k 1.87k 1.87k 1.87k 1.86k 0.00 1.86k
コマンドラインからの出力結果を眺める分には便利なんだけど、グラフ化しようという時にこれはつらい。Anemometerはts_min(最初にスローログに現れた時刻)をグラフにプロットするので、今既にあるスローログをpt-query-digestで食わせてAnemometerで表示させると、チェックサムごとにts_minの時刻に1回だけスパイクしたようなグラフになってしまう。
これは、上手くない(´・ω・`)
pt-query-digest側でこの集約を無効化できればいいんだけど、オプションとしては存在せず、中に手を入れるにしても結構奥まったところにあっていじくりたくない。
定期的にpt-query-digestに--since, --until オプションを使って食わせてもいいんだけど、秒単位とは言わずとも分単位くらいでは見たい…となると、1日ぶんのログファイルを食わせるのに見るかどうかもわからないのに1440回pt-query-digestを起動しなければならない。それも嫌だ。
という訳で乱雑に書いたPerlスクリプト。Anemometer用にスローログを食ってくれるのでanemoeater(どや
yoku0825/anemoeater
$ ./anemoeater.pl --docker path_to_slowlog
シンプル。--dockerを使わなくとも、Anemometerが既に構成されている環境があれば、--hostとか--userで指定してやればいい。--dockerに任せると構成済みの yoku0825/anemometer を起動して、スクリプトで1分ごとに丸めて送る。
パイプでpt-query-digestを呼ぶので結構遅い(11Mのスローログを食わせるのに、pt-query-digestで直接食わせると10秒ちょい、anemoeaterだと24パラにしても1分ちょい)
これで無事、過去のスローログをまとめて食わせても
ちゃんとジグザグしてくれるようになった。
2015/12/01 00:00~2016/01/01 23:59のログを8並列でぶち込むのはこんな感じで書きます。
$ ./anemoeater.pl --since 201512010000 --until 201601012359 --parallel 8 --docker path_to_slowlog real 0m17.471s user 1m47.847s sys 0m11.117s
これでDockerでAnemometerの起動まで終わってるんだから、都度都度パースして突っ込めそう。しめしめ。
【2016/02/03 17:43】
yoku0825/anemoeater として別リポジトリーにしました。