なんだ。raceは報告されたけど誤検知ということでメッセージ出力が抑止されている。なんで抑止してもよいのだろう? http://bit.ly/9NtP3H
2010-08-17 00:01:53なんとなく memcached の update_event が怪しいかんじ。頻繁に呼び出されている割には event_del と event_add を呼び出しているので危険な感じがする。
2010-08-17 00:35:43関連しそうな memcached のトピック。 update_event まわりで再現性の低い問題があるのかな? http://bit.ly/cWvyqA
2010-08-17 00:42:29mixi の memcached の問題は memcached が呼び出す event_add / event_del まわりで race condition が多分あるのだと思う。ただ、ざっとみたかんじはあまり問題ないようにみえる。
2010-08-17 00:57:20なんとなくだけど accept_new_conns が怪しいかんじ。でも、ちゃんとmutexでロックとっているなぁ。 do_accept_new_conns から update_event を呼び出した際に戻り値を確認していないけど大丈夫なのかな。
2010-08-17 01:14:55memcached落とすツールについて一応書いておいた http://subtech.g.hatena.ne.jp/mala/20100817/1282049428
2010-08-17 21:55:20mixiのmemcached問題。 event_add の evsel->add に失敗した場合、発生する可能性がある。 この関数の実体はlibeventが使用するライブラリに依存するので、これがOS依存で再現したりしなかったりする原因の1つかも。
2010-08-18 00:24:20結局、 @stanaka さんのパッチはカウンタをスレッドセーフにしただけで、それ以外の処理にレースが有ればおかしくはなるので、完全な原因は他にあると思っています。
2010-08-18 00:26:40@matsuu memcached -vvvとかで起動してサーバー側でtoo many connection出ててクライアント側で接続できないエラー出しながら接続試行しまくってるのが正しく動作してる状態です。クライアント2-3プロセス起動して数分落ちないなら単に落ちない環境かも
2010-08-18 00:41:58@kzk_mover libevent的にはカウンタを更新するような処理をマルチスレッドで呼び出されることは、そもそも考慮していないはずですから、やっぱりmemcached側が怪しそうに思います。
2010-08-18 00:50:26@kzk_mover @llamerada あれから色々見ているんですけど、キュー操作近辺もちゃんとスレッドセーフになっていなくて、手も入れはじめると相当大変になりそう。libeventを完全にスレッドセーフにするよりは、memcached側でなんとかしたほうがよい気もしたり
2010-08-18 00:50:28main の event スレッドの count は基本は3らしい。 connection枯渇がおきるとそれが 1 までへって、その後 connection の close のタイミングで 3 まで復活する。なんで2個づつなんだろう?クライアントのせいかもしれないけど。
2010-08-18 00:51:55@stanaka うーん、そうするとコネクション数が足りている時にも問題が起きそうな気がするのですが、どうでしょう?
2010-08-18 00:59:54@llamerada 3なのは、2つのIFにbindしているからだったかと。のこりの1つはtimeout。クライアントから接続しに来た時に、mainじゃなくて、workerのスレッドでevent_addを呼んでキューの操作をしているので、そこで稀にレースが発生するようです
2010-08-18 01:00:42@kzk_mover 非常に起きそうな気がするんですが、起きないのでまだ理解できていないところがあるんだと思ってます。カウンタ操作をアトミックにすると確かにそこでは落ちなくなるので、少なくともそこが問題の一部ではあると思うのですけどね。
2010-08-18 01:08:57「[err] event_queue_remove」のエラーで落ちるのは、カウンターとは別件でconn_newでevent_addが失敗した場合のエラー処理が問題っぽいのだけど、まだ完全には掴めてない。libeventのバージョンを地道に調べたら1.4.2-rcから発生するみたい
2010-08-18 01:16:12はてなにも再現環境ありますよ!! RT @kzk_mover: memcached busters結成してlivedoorに遊びにいくか
2010-08-18 01:18:15そもそもなんでディスクリプタ上限を越えたときに EPOLL_CTL_ADD をせずに EPOLL_CTL_MOD を発行しているのだろう。
2010-08-18 01:31:40EPOLL_CTL_MODがセットされるのは evread か evwrite がセットされたときのみ。ただ、これらの値がセットされるのはEPOLL_CTL_ADDをセットした後のみのはず。データの再利用になにか抜けがあるのかな。
2010-08-18 01:56:23