スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MySQL - sleepプロセスが溜まる2

MySQL4.0系を使っているサーバーでまたsleepプロセスが溜まる現象が発生した。

今回は時間が経過していくと一つ一つのプロセスのメモリ使用量が増えていくのが問題。今までそんなに重くなかったのに急にLAが平均10くらいになったよ・・・orz

またsleepかよとか思って「MySQL sleep」でぐぐったら2番目にこのブログで書いた記事が出てきたorz
その時と同じ方法で解決出来なさそうなので、もうちょっと深いとこまで突っ込んでみた。

sleepプロセスが溜まると、show processlist;を実行した場合やphpMyAdminでプロセスを表示した場合にすぐ分かる。

下記はphpMyAdminでプロセスを表示した例

MySQL-Sleep


sleepばっかりです。というかsleepしかありませんorz。
こういう状況が続くとシステムによっては問題が起きます。(今回がまさにそう)

じゃあこのsleepってなんなのよって感じなわけで、それを調べます。
まず、my.cnfの[mysqld]セクションに

log=/var/lib/mysql/query.log

を追加して再起動します。

上記を追加する事で全てのクエリを/var/lib/mysql/query.logに出力するようになります。
再起動してもsleepはまた溜まり続けると思うので、またプロセスを表示させます。
また、SSHクライアントでログインして

tail -f /var/lib/mysql/query.log

と実行します。

すると、query.logに出力された内容がどんどん表示されます。

その時のIDとプロセスがsleepで溜まっているIDをチェックして、query.log側ではどのSQLが実行されているのかを確認します。

大体のチェックが終わったらmy.cnfでlog=の行をコメントアウトしてまた再起動します。(そのまま放置しておくとquery.logは膨大な容量になってしまいます)

SQL文を見れば、どこで実行されているか大体把握出来るので(システム作ってるなら分からないはずは無いはず)その箇所に絞って調査をします。

と、また解決していない記事になってしまったけど・・・まぁいっか。
スポンサーサイト

この記事のトラックバックURL

http://kgworks.blog47.fc2.com/tb.php/81-1a11075e

コメント

た、単語から既にわかんないですけどがんばってくださいぃ。。
あざーっす!
なかなか解決しなさそうだけど・・・。
土日は用事があるし、今日はこのまま様子見で(ぇ
もう解決したかもしれませんが・・・
はじめまして、派遣プログラマをしているものです。
Googleでこちらに辿り着き、大変参考にさせていただきました。ありがとうございます。
その後更に調査&実験してみまして、sleep 状態のプロセスは、プーリングされているコネクションらしいとわかりました。
新たな接続を生成せず、プールされた接続を使用するようにプログラムを修正したら、
プール接続数の最大値までしかプロセスが増えないことを確認しました。
また、これまで放置されていたsleepプロセスは、webコンテナ兼webサーバーとして使用しているTomcatを再起動したら、すっきり消えました。

私はJavaベースでwebアプリを作成しているので、ちょっと話が違うかもしれませんが、もしも参考になれば、と思い書き込んでみました。

以下はこの件に関する私のメモです。
http://atbb.jp/kurimaru/viewtopic.php?p=39#39
はじめまして、コメントありがとうございます!
sleepプロセスは自分でも色々と調査をしましたが、仰る通りの動作ですね。本来はパフォーマンスを上げるためのものが使い方によっては溜まっていく一方になってしまってパフォーマンスが下がる結果になってしまうというのが今回の結論です。
ちなみに自分も実は派遣ではないですが、アルバイトです(笑)
あと、参考になったとの事ですがどの辺りの記事が参考になりましたでしょうか?もしこの記事でなければ、教えていただければと思います(その記事についてさらに詳しい内容を書きたいと思います)
まとまりませんが・・・
おもに参考にさせていただいたのは、こちらの記事と、
2006年11月21日の「sleepプロセスが溜まる」です。
http://kgworks.blog47.fc2.com/blog-entry-42.html
具体的には、MySQLに wait_timeout なる変数があるとうこと、
phpMyAdmin でプロセス状態を見れて、消すこともできることを始めて知りました。
恥ずかしながら。。

自分の場合は一斉アクセスの負荷試験で「Too many connections」という
エラーメッセージがTomcatのログに出ていたので、
http://dev.mysql.com/doc/refman/4.1/ja/too-many-connections.html
で知ったMySQLの変数 max_connections もチェックしました。

JMeter というツールを使って負荷試験をしながら、Tomcatのログと
show processlist; で地道に現象を観察したところ、sleep プロセスががんがん増えていって max_connections を超えるころエラーになっていることがわかりました。

そこで、Java 関係のDB接続関係の記事を参考にして接続上限数を設定するよう
プログラムを修正、再試験をしたら、sleepプロセスが使いまわされているのを発見し、
プールされている接続をちゃんと使えていなかったのか、とわかりました。
http://www.javaroad.jp/opensource/js_tomcat8.htm
http://www.jajakarta.org/commons/dbcp-1.0/ja/withPrimary/org/apache/commons/dbcp/BasicDataSource.html

こんな感じです。長くなってしまって、すみません。。_(._.)_ 文章ヘタで。
意味わからなかったらまたご質問ください。。

#自分のブログにもコメントしていただいて、ありがとうございました!
#プログラマのアルバイトってあるんですね!?自分も副業でやりたいかも(笑)
いえいえ、文章は大丈夫ですよー!
MySQLの変数はかなり沢山あるので、どういう場合にどの辺りの設定が怪しいかが分かるのと良いです。
そんな自分はまだまだ全然分かってないですけど・・・。
自分はphpMyAdminを先に知ってしまった人間なので、MySQLのシェルから何かを操作する事が殆ど出来ません(汗)
でもウェブ上でプロセスや変数、稼動状況が確認出来るのは便利。

こちらこそ再度のコメント有難う御座います。
プログラマのアルバイトというか、PHPに興味のある人のバイトを募集しますみたいな感じで入ったらプログラムとかサーバー系の道になってた感じです。
こっち系の仕事がしたい!という強い意志があったわけではないんですけど、やってて楽しいのでかれこれ3年くらい続いてます(笑)

コメントする

管理者にだけ表示を許可する

Template Designed by DW99

テクノラティ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。