mixiがはまったmemcached(or libevent?)の問題を調べる人たち
二日とも複数台のmemcachedが連続して落ちました。コアは吐かずにストンと落ちるので、原因追及に時間がかかりましたが、memcachedへの接続数が異常に多いと落ちる事は再現できました。 #mixi
2010-08-12 02:33:00memcachedが大量の接続を受けると突然停止をするので、memcachedへの接続数を減らし安定運用中。外部からの過剰アクセスではなく、サーバ追加→クライアント数増加→停止。
2010-08-12 08:45:50ファイルディスクリプタが不足してmemcachedが落ちたとして、そのときには、3万強の接続となってるはず。3万強の接続となるにはアプリケーションサーバ側のmax clientが平均60として500台以上必要。そんなに増えたん?
2010-08-12 17:53:50memcachedの地雷、キー名の長さに制限がある、特定サイズのデータばかり入れてると他のサイズのデータほとんど入らなくなる、揮発性があることを考慮しないエンジニア…
2010-08-12 20:21:43今日の調査結果ではmemcachedが使用しているlibeventの中の問題という認識です。継続調査中。アーキテクチャーも大幅に見直しが必要。 #mixi
2010-08-12 21:09:28@nealsato もし可能なら、memcached + libeventのバージョンって分かりますでしょうか?私のところでもlibeventに依存している部分がありまして(evhttpd)、同じ問題が起こりかねないので調査したいです.
2010-08-12 21:53:12@kzk_mover memcached-1.4.4 + libevent-1.3b、memcachedの接続数30kの設定に対して30k以上投げ続けると、base_event_loopからなぜか抜けてしまいます
2010-08-12 22:05:25ひとまずビルドした. RT @nealsato: @kzk_mover memcached-1.4.4 + libevent-1.3b、memcachedの接続数30kの設定に対して30k以上投げ続けると、base_event_loopからなぜか抜けてしまいます
2010-08-12 22:13:33memcached -c N はsetrlimitでファイルディスクリプタ制限かけてるだけなので、libeventのどこかでsocket作れなくなってエラー => ループ抜けるとかいうシナリオ? まだmemcachedしか見てない.
2010-08-12 22:24:47@matsuu サクっとconfigureを見ましたがmemcachedのconfigure内でlibeventのバージョンチェックは厳密にやっていなさそうなので、パッケージ管理者が適切なパッケージ選択をしているのでは?
2010-08-12 22:25:24mixiはまだfedoraを使ってるのならカーネルパラメータの何かがおかしい可能性はありますね。fedoraはCentOS(というかRedhat)とデフォルトのカーネルパラメータが違いすぎてひどい目にあったことがあります。
2010-08-12 22:29:12accept(2) => EMFILEか、確率は低そうだけどmallocかなー RT @frsyuki: mallocが失敗…?
2010-08-12 22:34:33setrlimitを36とかで固定呼び出しするようにしてmemcachedを立ち上げた。memslapでそれ以上の並列数で負荷をかけると、挙動が非常に怪しい... 2並列以上で投げると固まっている様に見える.
2010-08-12 22:54:48@oinume コネクション数の調整はあまりやっていないので、確信はないですが最大値以上の接続を継続的に繰り返すと発生できます。
2010-08-12 22:59:58@nealsato なるほど。固まる動作は手元で確認できましたが、event_base_loopを抜ける動作(デーモン自体が終了)は確認出来ていません...。
2010-08-12 23:01:38固まった時も、全スレッドはepoll_wait状態だから正しそう... libevent <-> memcachedの行き来がしんどいなコレ.
2010-08-12 23:23:34accept(2) => EMFILEで呼ばれる、accept_new_conns(false) が怪しいと思って追っている所。コメントアウトしたら挙動が変わるんだよなあ. 固まらなくはなる.
2010-08-12 23:40:09memcachedのC30Kともかくとして、なぜそんなにサーバを足さないとならないのかが気になる。効率の悪いプログラム、SQL、複雑な仕様、それらに対して意見をする場の少なさ、あきらめ。そんなんじゃないですか?
2010-08-12 23:54:21ひとまず打てる短期的対策は (1) setrlimit出来るディスクリプタ数を上げる + -c の数を増やす (2) kumo-gwみたいにローカル単位でコネクション集約する. かなあ. ただ悔しいのでプログラム追う.
2010-08-13 00:06:38