2018/04/29

遅いSQLをあぶり出す

犯人は誰だ

DBが遅いという。サーバのスペックや処理内容、開発会社のレベルを考えると、どうも設計やSQLに問題がありそうだ。
「DBアクセスが遅い」と文句を言っても「サーバのスペックをあげてくれ」としか回答してこないレベルなので、ボトルネックになっているSQLを調べることにした。

スロークエリの調べ方

Postgresだと、 スロークエリの分析 | Let's Postgres というページにまとまっている。
しかし、

  • Amazon RDS for PostgreSQL | AWSって、pg_stat_statements使えたっけ?
  • スロークエリって、何秒以上をログ出力するようにすればいい?そのクエリって、頻繁に使われるの?
といった問題があり、今回は保留。

MySQLの場合、 Kazuho@Cybozu Labs: MySQL のボトルネックを統計的に監視・解析する方法で紹介されている、GitHub - kazuho/mprofile: http://developer.cybozu.co.jp/archives/kazuho/2009/07/mysql-539d.htmlが使える。 Postgres向けを探したが、調べ方がよくなかったのか、見つけられなかった。

pg_stat_activityを使う

pg_stat_activityで現在発行中のsqlを見る - メモス\(^o^)/。これを定期的に実行すれば、よく実行されるSQLがあぶり出される。
必要な情報をまとめると、実行するSQLは

SELECT now(),query_start, query FROM pg_stat_activity WHERE state='active';
でOK。cronに書いて出力をファイルにリダイレクトすれば、後でゆっくり分析できる。

どのクエリとどのクエリが同じなのか、判断する必要がある。とりあえずはよく出てくるSQLのうち、query_start - now()が大きな値になっているものを調べるのがよさそう。大体の時間も見えてくるので、スロークエリを設定するときにも役に立つ。

作り逃げに注意

よろしくないSQLも、データ量が少ない頃は問題が見えてこないことが多い。開発を外注して自社で運用なんてスタイルをやっていると、こういう爆弾をつかまされることになりがちだ。



0 件のコメント :

コメントを投稿

Comments on Google+: