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

2010-08にmixiエンジニアのお盆があぼんした件について調べる人たち。
114
前へ 1 ・・ 4 5 7 次へ
llamerada @llamerada

なんだ。raceは報告されたけど誤検知ということでメッセージ出力が抑止されている。なんで抑止してもよいのだろう? http://bit.ly/9NtP3H

2010-08-17 00:01:53
llamerada @llamerada

なんとなく memcached の update_event が怪しいかんじ。頻繁に呼び出されている割には event_del と event_add を呼び出しているので危険な感じがする。

2010-08-17 00:35:43
llamerada @llamerada

関連しそうな memcached のトピック。 update_event まわりで再現性の低い問題があるのかな? http://bit.ly/cWvyqA

2010-08-17 00:42:29
llamerada @llamerada

mixi の memcached の問題は memcached が呼び出す event_add / event_del まわりで race condition が多分あるのだと思う。ただ、ざっとみたかんじはあまり問題ないようにみえる。

2010-08-17 00:57:20
llamerada @llamerada

なんとなくだけど accept_new_conns が怪しいかんじ。でも、ちゃんとmutexでロックとっているなぁ。 do_accept_new_conns から update_event を呼び出した際に戻り値を確認していないけど大丈夫なのかな。

2010-08-17 01:14:55
mala @bulkneets

memcached落とすツールについて一応書いておいた http://subtech.g.hatena.ne.jp/mala/20100817/1282049428

2010-08-17 21:55:20
llamerada @llamerada

mixiのmemcached問題。 event_add の evsel->add に失敗した場合、発生する可能性がある。 この関数の実体はlibeventが使用するライブラリに依存するので、これがOS依存で再現したりしなかったりする原因の1つかも。

2010-08-18 00:24:20
Kazuki Ohta @kzk_mover

@llamerada そこが僕は一番怪しいと思ってるんですよね...

2010-08-18 00:25:33
Kazuki Ohta @kzk_mover

結局、 @stanaka さんのパッチはカウンタをスレッドセーフにしただけで、それ以外の処理にレースが有ればおかしくはなるので、完全な原因は他にあると思っています。

2010-08-18 00:26:40
mala @bulkneets

@matsuu memcached -vvvとかで起動してサーバー側でtoo many connection出ててクライアント側で接続できないエラー出しながら接続試行しまくってるのが正しく動作してる状態です。クライアント2-3プロセス起動して数分落ちないなら単に落ちない環境かも

2010-08-18 00:41:58
llamerada @llamerada

@kzk_mover libevent的にはカウンタを更新するような処理をマルチスレッドで呼び出されることは、そもそも考慮していないはずですから、やっぱりmemcached側が怪しそうに思います。

2010-08-18 00:50:26
Shinji Tanaka @stanaka

@kzk_mover @llamerada あれから色々見ているんですけど、キュー操作近辺もちゃんとスレッドセーフになっていなくて、手も入れはじめると相当大変になりそう。libeventを完全にスレッドセーフにするよりは、memcached側でなんとかしたほうがよい気もしたり

2010-08-18 00:50:28
llamerada @llamerada

main の event スレッドの count は基本は3らしい。 connection枯渇がおきるとそれが 1 までへって、その後 connection の close のタイミングで 3 まで復活する。なんで2個づつなんだろう?クライアントのせいかもしれないけど。

2010-08-18 00:51:55
llamerada @llamerada

環境を再現できないのがつらい。再現可否の境界線はどこなんだろう。

2010-08-18 00:55:03
Kazuki Ohta @kzk_mover

@stanaka うーん、そうするとコネクション数が足りている時にも問題が起きそうな気がするのですが、どうでしょう?

2010-08-18 00:59:54
Shinji Tanaka @stanaka

@llamerada 3なのは、2つのIFにbindしているからだったかと。のこりの1つはtimeout。クライアントから接続しに来た時に、mainじゃなくて、workerのスレッドでevent_addを呼んでキューの操作をしているので、そこで稀にレースが発生するようです

2010-08-18 01:00:42
mala @bulkneets

ライブドア遊びに来てくれればmemcached落とせる再現環境提供しますよ

2010-08-18 01:01:32
Kazuki Ohta @kzk_mover

memcached busters結成してlivedoorに遊びにいくか

2010-08-18 01:02:44
Shinji Tanaka @stanaka

@kzk_mover 非常に起きそうな気がするんですが、起きないのでまだ理解できていないところがあるんだと思ってます。カウンタ操作をアトミックにすると確かにそこでは落ちなくなるので、少なくともそこが問題の一部ではあると思うのですけどね。

2010-08-18 01:08:57
Shinji Tanaka @stanaka

「[err] event_queue_remove」のエラーで落ちるのは、カウンターとは別件でconn_newでevent_addが失敗した場合のエラー処理が問題っぽいのだけど、まだ完全には掴めてない。libeventのバージョンを地道に調べたら1.4.2-rcから発生するみたい

2010-08-18 01:16:12
llamerada @llamerada

@stanaka worker側から event_add を呼んでいるのですか。なるほど。

2010-08-18 01:16:56
Shinji Tanaka @stanaka

はてなにも再現環境ありますよ!! RT @kzk_mover: memcached busters結成してlivedoorに遊びにいくか

2010-08-18 01:18:15
llamerada @llamerada

そもそもなんでディスクリプタ上限を越えたときに EPOLL_CTL_ADD をせずに EPOLL_CTL_MOD を発行しているのだろう。

2010-08-18 01:31:40
llamerada @llamerada

普通の memcached の運用時では EPOLL_CTL_MOD は呼ばないみたい?

2010-08-18 01:48:57
llamerada @llamerada

EPOLL_CTL_MODがセットされるのは evread か evwrite がセットされたときのみ。ただ、これらの値がセットされるのはEPOLL_CTL_ADDをセットした後のみのはず。データの再利用になにか抜けがあるのかな。

2010-08-18 01:56:23
前へ 1 ・・ 4 5 7 次へ