gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

ボトルネック見つけ用メモ

なんか色々と資料散らかってるわ忘れてるわで、散々と面倒だったので。
後で付け足す前提で、手元にある「散らかった資料」を整理してまとめておきます的なmemo。


…あぁ先に。set globalとかは「すげぇ激しいパーミッション」が要求されるのでご注意のほどを。
具体的には「SUPER」っちゅぅのが必要です。GRANTで適当に設定しといてちょ。


まず、ログ系の状況の確認。

show variables like 'log%';


特に「重いクエリ」周りの確認。

show global variables like 'slow_query_log'; -- slow_query_log出す? 出さない?
show global variables like 'long_query_time'; -- 何秒以上を「遅い」とする?
show global variables like 'min_examined_row_limit'; -- 「すんげい大量のレコードを求めるクエリ」の大量っておいくつ?


で、コンソールから動的に設定。

set global slow_query_log_file = 'slow_query_logの吐き出し先を指定';
set global long_query_time = 2; -- とりあえず2秒
set global slow_query_log = 1; -- slow log開始!

ちなみに秒数は、小数点とか使えるようになったぽ by 5.1以降。
とりあえずこれ仕込んで「重いクエリ」を探し出しませう。


ただ、もう一つ「なんか細かいけど鬼のようにクエリ投げてる的な?」っていうボトルネックがあるので。
こんな手順で発見。


まずは「全クエリ」を引っ掛けるために、こんな設定。

set global long_query_time = 0;

次に「重いと思われるPage」にアクセス、クエリログを溜め込む。
てけとうに溜め込んだら

set global long_query_time = 2;

とかで一端元に戻す。


そのあと「mysqldumpslow」を使う。これで「似たようなSQL」をカウントしてくれる!!
実際にはこんな感じ。path切れてなかったらてけとうに探すこと。

mysqldumpslow -s t slowログファイル名
mysqldumpslow -s at slowログファイル名

optionがtなのかatなのかは、なんかよくわからなかった。ドッチでも、とりあえず目的は達成できたので、あんまり気にしてないw
これで「ほんのわずかなPageアクセス」で「驚くほど大量のクエリ」があったら、色々と絞殺ぢゃなくて考察をしてみませう。
memcachedとか、こゆときいいよねぇ。MagicWeaponはmemcachedとの相性が「ある程度」いいと思ってるんだけど、他のFrameWorkってどうなんだべさ?


あとは「index使ってない悪い子」を探すあたり。

show global variables like '%indexes';
set global log_queries_not_using_indexes = on;


ついでに、クエリの「受け入れ長さ」の確認と設定変更。

set max_allowed_packet = 1024*1024*32(計算して変換してね);
show variables like 'max_allowed_packet';


思い出したり掘り出したり発掘したりしたら、追記予定。


追記 2012-02-14

set global long_query_time = 2;

やると、いったん「show global variables like 'slow_query_log';」が、OFFになるらしい。注意。
追記追記。これ、誤認かもしれない。確認して、確認取れた人おしえてたも〜。


あと「現在滞留中」のクエリ状況とかを見るなら

SHOW PROCESSLIST; -- 長いクエリは省略表示
SHOW FULL PROCESSLIST; -- 長いクエリも完全に表示

とか。
ちょっとひねると

SELECT * FROM information_schema.PROCESSLIST WHERE time > 10 AND info LIKE 'SELECT%';

とか(10秒以上のんびりこいてるSELECTを探せ)。
これは、元々

DESC information_schema.PROCESSLIST;

で見て取れるテーブルがあるから。

追記 2012-02-15
しゃれにならないプロセスがあったら、まずはshow processlistでIDを補足。多分一番左にあると思われる、数字。
で、その数字に対して

mysqladmin kill {ID}

で、その対象プロセスをkill。
ド最悪、これで「厄介なSQL プロセス」を殺せます。