2011年12月15日

SHOW PROCESSLIST を使ったカジュアルなプロファイラを強化しました

はてなブックマークに登録

KLab Advent Calendar 2011 「DSAS for Social を支える技術」の11日目です。

「SHOW FULL PROCESSLIST を使った MySQL のプロファイリング」 で紹介したプロファイラですが、 id:sh2 さんからはてブで

秒間10回叩く例も http://developer.cybozu.co.jp/kazuho/2009/07/mysql-539d.html 。変数ぽい部分をカットする処理はmysqldumpslowのコードを移植するといいかも

というコメントをいただきました。 そろそろネタに困っていたので、 せっかくなので、多くのユースケースで 便利に使えるように改良しました。ぜひご活用ください。

myprofiler.py (gist)
github

解説

クエリのサマライズ

前のバージョンでは = 以降をバッサリとカットしてしまっていたのですが、 例えば "WHERE user_id='xyz' AND enable=1" が "WHERE user_id=" になってしまうので、 問題のクエリを探すのが難しいケースがありました。

mysqldumpslow を参考にクエリのサマライズを改良し、 "WHERE user_id='S' AND enable=N" のような形式で集計できるようにしました。

ini形式のファイルからMySQLの設定を読み込むように

オプション無しで実行した場合、 ~/.my.cnf の [DEFAULT] セクションから user, password, host, port などを読み込みます。 (port はオプション)。

別のファイルから読み込むときは -c 設定ファイルパス でファイルを指定できます。

別のセクションから設定を読み込むときは -s セクション名 でセクション名を指定できます。

行数やインターバルを指定できるように

頻出する順で何件を表示するかを -n オプションで指定できるようにしました。

また、 show full processlist を実行する間隔を -i オプションで指定できます。 秒間10回サンプリングしたい場合は -i 0.1 と指定してください。

加工前のクエリを出力できるように

標準出力に表示しているクエリは、同じ形のクエリをまとめて集計するために 実際のパラメータ等が消えてしまっています。例えば LIMIT 100 でも LIMIT 5 でも LIMIT N と表示されてしまいます。

実際のパラメータを調べたり、 explain を実行するために、元のクエリが見えた 方がいいこともあるので、 -o 出力ファイル名 で、取得したクエリをファイルに 出力できるようにしました。

注意点

Python 2.6 以上で動くようにするつもりで書いていますが、自分の環境も DSAS for Social も Python 2.7 を利用しているので Python 2.6 での動作は 未確認です。 (Python 2.5 以下は窓から投げ捨ててください) (追記: Python 2.5 で使えない機能も避けました。未確認ですが使えるかもしれません)

MySQL への接続に MySQLdb を使っていますが、これは拡張ライブラリなので、 インストールには libmysqlclient のヘッダファイルや Python のヘッダファイルが 必要になります。 手軽にインストールしたい場合は、ピュアPythonの PyMySQL をインストールしてください。


@methane
klab_gijutsu2 at 19:34│Comments(0)TrackBack(0)mysql 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント