編集可能

mixiがはまったmemcached(or libevent?)の問題を調べる人たち

2010-08にmixiエンジニアのお盆があぼんした件について調べる人たち。
113
Neal Sato @nealsato

二日とも複数台のmemcachedが連続して落ちました。コアは吐かずにストンと落ちるので、原因追及に時間がかかりましたが、memcachedへの接続数が異常に多いと落ちる事は再現できました。 #mixi

2010-08-12 02:33:00
Neal Sato @nealsato

memcachedが大量の接続を受けると突然停止をするので、memcachedへの接続数を減らし安定運用中。外部からの過剰アクセスではなく、サーバ追加→クライアント数増加→停止。

2010-08-12 08:45:50
@kazeburo @kazeburo

ファイルディスクリプタが不足してmemcachedが落ちたとして、そのときには、3万強の接続となってるはず。3万強の接続となるにはアプリケーションサーバ側のmax clientが平均60として500台以上必要。そんなに増えたん?

2010-08-12 17:53:50
@kazeburo @kazeburo

memcachedが落ちると言えばstatsのバッファが足りなくて、セグフォルなんていうことも昔あったね

2010-08-12 19:44:17
mala @bulkneets

memcachedの地雷、キー名の長さに制限がある、特定サイズのデータばかり入れてると他のサイズのデータほとんど入らなくなる、揮発性があることを考慮しないエンジニア…

2010-08-12 20:21:43
Neal Sato @nealsato

今日の調査結果ではmemcachedが使用しているlibeventの中の問題という認識です。継続調査中。アーキテクチャーも大幅に見直しが必要。 #mixi

2010-08-12 21:09:28
Kazuki Ohta @kzk_mover

@nealsato もし可能なら、memcached + libeventのバージョンって分かりますでしょうか?私のところでもlibeventに依存している部分がありまして(evhttpd)、同じ問題が起こりかねないので調査したいです.

2010-08-12 21:53:12
Neal Sato @nealsato

@kzk_mover memcached-1.4.4 + libevent-1.3b、memcachedの接続数30kの設定に対して30k以上投げ続けると、base_event_loopからなぜか抜けてしまいます

2010-08-12 22:05:25
Kazuki Ohta @kzk_mover

ひとまずビルドした. RT @nealsato: @kzk_mover memcached-1.4.4 + libevent-1.3b、memcachedの接続数30kの設定に対して30k以上投げ続けると、base_event_loopからなぜか抜けてしまいます

2010-08-12 22:13:33
Kazuki Ohta @kzk_mover

memcached -c N はsetrlimitでファイルディスクリプタ制限かけてるだけなので、libeventのどこかでsocket作れなくなってエラー => ループ抜けるとかいうシナリオ? まだmemcachedしか見てない.

2010-08-12 22:24:47
Neal Sato @nealsato

@matsuu サクっとconfigureを見ましたがmemcachedのconfigure内でlibeventのバージョンチェックは厳密にやっていなさそうなので、パッケージ管理者が適切なパッケージ選択をしているのでは?

2010-08-12 22:25:24
最速配信研究会 山崎大輔 @yamaz

mixiはまだfedoraを使ってるのならカーネルパラメータの何かがおかしい可能性はありますね。fedoraはCentOS(というかRedhat)とデフォルトのカーネルパラメータが違いすぎてひどい目にあったことがあります。

2010-08-12 22:29:12
Kazuki Ohta @kzk_mover

accept(2) => EMFILEか、確率は低そうだけどmallocかなー RT @frsyuki: mallocが失敗…?

2010-08-12 22:34:33
mala @bulkneets

コネクション3万問題 or コミケ3万ぐらい持ってた方がいい問題

2010-08-12 22:43:01
Kazuki Ohta @kzk_mover

setrlimitを36とかで固定呼び出しするようにしてmemcachedを立ち上げた。memslapでそれ以上の並列数で負荷をかけると、挙動が非常に怪しい... 2並列以上で投げると固まっている様に見える.

2010-08-12 22:54:48
mala @bulkneets

コミケ3万の規模感はよくわからないですが、コネクション3万は一台ではかなり多いですよ

2010-08-12 22:55:19
Kazuki Ohta @kzk_mover

でもデーモンが終了している訳では無いから、 event_base_loop は抜けてないな.

2010-08-12 22:57:16
Neal Sato @nealsato

@kzk_mover そうなんです固まります。そういう時はクライアント側を一度落としてたたき直しです。

2010-08-12 22:59:00
Neal Sato @nealsato

@oinume コネクション数の調整はあまりやっていないので、確信はないですが最大値以上の接続を継続的に繰り返すと発生できます。

2010-08-12 22:59:58
Neal Sato @nealsato

@yamaz そのCentOSでも同様の現象が出たと報告を受けてます(汗

2010-08-12 23:00:45
Kazuki Ohta @kzk_mover

@nealsato なるほど。固まる動作は手元で確認できましたが、event_base_loopを抜ける動作(デーモン自体が終了)は確認出来ていません...。

2010-08-12 23:01:38
Kazuki Ohta @kzk_mover

固まった時も、全スレッドはepoll_wait状態だから正しそう... libevent <-> memcachedの行き来がしんどいなコレ.

2010-08-12 23:23:34
Kazuki Ohta @kzk_mover

accept(2) => EMFILEで呼ばれる、accept_new_conns(false) が怪しいと思って追っている所。コメントアウトしたら挙動が変わるんだよなあ. 固まらなくはなる.

2010-08-12 23:40:09
@kazeburo @kazeburo

memcachedのC30Kともかくとして、なぜそんなにサーバを足さないとならないのかが気になる。効率の悪いプログラム、SQL、複雑な仕様、それらに対して意見をする場の少なさ、あきらめ。そんなんじゃないですか?

2010-08-12 23:54:21
Kazuki Ohta @kzk_mover

ひとまず打てる短期的対策は (1) setrlimit出来るディスクリプタ数を上げる + -c の数を増やす (2) kumo-gwみたいにローカル単位でコネクション集約する. かなあ. ただ悔しいのでプログラム追う.

2010-08-13 00:06:38
残りを読む(149)

コメント

Uchida Masatoshi @S_Ishimaru 2010年8月13日
面白いなー。太田くんの頑張りが熱い!
0
オスマン帝国買うて @4niruddha 2010年8月13日
bulkneetsさんの再現調査のつぶやき追加。
0
みりおんせーじ/じーせんおりみ @millionsage 2010年8月17日
「重複分を削除」機能を利用し、重複分を削除しました。左記のみの編集です。
0
大車甫 dont Sweat @daisuke 2010年8月19日
RT @llamerada: 安直に直すするならば、conn_close内ではaccept再開のフラグだけたてて、メインスレッドのタイマーイベント内でaccept_new_connsを呼び出せばよさそう。
0