Re: [Kai-users-ja] quitを送らない場合の後始末
Kai is a distributed key-value datastore
Status: Beta
Brought to you by:
takemaru
From: masahito i. <coo...@gm...> - 2009-02-24 03:04:23
|
> このテストコードのようにものすごい勢いでソケットを廃棄される状況では,再利用までの時間を短くするなどの調整を行わない限り,TCP > は正常に動作しないように思いました. なるほどー。 と言う事で http://www.linux.or.jp/JM/html/LDP_man-pages/man7/socket.7.html を読んで理解しました。 では、今晩あたり trunk にコミットします!お騒がせして申し訳ございませんでした。 2009/2/23 Takeru INOUE <tak...@gm...>: > 2009/2/23 Takeru INOUE <tak...@gm...>: >> 必ず次のようなエラーになりますね (16383 回目の connect に失敗). >> >> Can not connect:16383 at test.pl line 14. >> >> 複数のクライアントを走らせた場合でも,合計の connect 数が 16383 になるとエラーになりました. >> >> Can not connect:7152 at test.pl line 14. >> Can not connect:9231 at test.pl line 14. >> >> どうやら,この magic number でリソースが足りなくなるようです. >> >>>> 今後は、Acceptor Pooling を止めるとどうなるか >>>> 試してみる予定です。 >>> >>> max_connection = 1 で試していた事を忘れていました。 >>> Yaws と Mochiweb の Source を見直してみます。 >> >> max_connection = 2 でも同じでした. >> 本家 ML に聞いてみた方がいいかも. >> 聞いときましょうか. > > と思ったのですが,よく考えたら,TCP ソケットは再利用可能になるまでに一定の時間がかかるので,それまで接続できなくなっているのではないでしょうか. > つまり,gen_tcp:close/1 によってソケットは正常に閉じられているが,再利用できるまで何秒かかかっているということです. > > このテストコードのようにものすごい勢いでソケットを廃棄される状況では,再利用までの時間を短くするなどの調整を行わない限り,TCP > は正常に動作しないように思いました. > >>> 2009/2/23 masahito ikuta <coo...@gm...>: >>>>> コミットされたらこちらでも確認してみますね. >>>> >>>> コミットするか否か迷っておりますので、お知恵を拝借させて下さい。 >>>> >>>> ▼修正後の状況 >>>> クライアントから切断された際 >>>> Active Mode では、メッセージとして {tcp_closed, Socket} が >>>> Passive Mode では、gen_tcp:recv/3 の戻り値として {error, closed} が >>>> それぞれ戻って来るのですが >>>> 両モード共に gen_tcp:close/1 を呼んだとしても >>>> ある一定回数以上 接続・切断を繰り替えすと >>>> 数秒間だけ接続できなくなります。 >>>> >>>> 以前の版と異なるのは、以下の三点です。 >>>> ・Erlang Shell ごと落ちない(そもそもプロセスが落ちなくなった) >>>> ・障害が発生させる為の 接続・切断 の回数が以前より多い(私の環境で 4 倍ほど) >>>> ・数秒経つと、また接続が可能となる >>>> >>>> ▼個人的な希望 >>>> 以前の状態よりは、マシな状態である為 >>>> trunk にコミットさせて頂けないでしょうか? >>>> >>>> ▼現在、調査して解っている箇所 >>>> Erlang Shell から i() で、接続できない状態のプロセスを確認すると >>>> 接続できる状態と同様に prim_inet:accept0/2 で待ち受けており >>>> gen_tcp:accept/2 で失敗しているようでもありませんでした。 >>>> >>>> gen_tcp:close/1 の戻り値を確認しても >>>> ok が戻されている為、正常に終了できているようでした。 >>>> >>>> ※もしかして、gen_tcp:close/1 って非同期で inet 関連のプロセスと通信してる? >>>> >>>> ちなみに、Active、Passive 両モード共に >>>> サーバ側から切断する分には全く問題が発生しません。 >>>> >>>> ※クライアントから切断するなんて、普通に行う事なんだけどなぁ・・・ >>>> >>>> gen_tcp のドキュメントを読み返しているのですが >>>> そもそも、ドキュメント内のサンプルコードでは >>>> {error, closed} を受信しても gen_tcp:close/1 を呼び出してすらいない為 >>>> 完全に手詰まりです。 >>>> >>>> 本メールにテストに必要なファイル一式を添付致しましたので >>>> いろいろお試し頂けると助かります。 >>>> >>>> 今後は、Acceptor Pooling を止めるとどうなるか >>>> 試してみる予定です。 >>>> >>>> 以上です。 >>>> >>>> 2009/2/22 Takeru INOUE <tak...@gm...>: >>>>> 深夜までお疲れ様でした m(_ _)m >>>>> >>>>> コミットされたらこちらでも確認してみますね. >>>>> >>>>> 2009/2/21 masahito ikuta <coo...@gm...>: >>>>>> 幾田です。 >>>>>> 原因が判明しました。 >>>>>> >>>>>> ▼対処 >>>>>> クライアントから切断された際の処理に gen_tcp:close/1 を加え >>>>>> 障害が再現しない事を確認しました。 >>>>>> >>>>>> 後で、コミットしておきます。 >>>>>> >>>>>> ▼障害内容 >>>>>> クライアントから切断されたのだから >>>>>> gen_tcp:close/1 は不要だろうと思い込んでいたのですが >>>>>> gen_tcp:close/1 は、諸々の後始末をしているようで >>>>>> これを呼ばずに、クライアント側で接続・切断を繰り返すと >>>>>> 一定回数後に、 Erlang Shell ごと落ちていました。 >>>>>> >>>>>> ▼検証用のクライアントコード >>>>>> kai_tcp_server で echo server を作り >>>>>> 下記の Perl Script で接続・切断を繰り返すと >>>>>> サーバが落ちます。 >>>>>> (対処済みのサーバは落ちませんでした) >>>>>> >>>>>> #!/usr/bin/env perl >>>>>> >>>>>> use strict; >>>>>> use warnings; >>>>>> >>>>>> use IO::Socket; >>>>>> >>>>>> for (1..10000) { >>>>>> test(); >>>>>> } >>>>>> >>>>>> sub test { >>>>>> my $socket = IO::Socket::INET->new( >>>>>> PeerAddr => 'localhost', >>>>>> PeerPort => 11211, >>>>>> Proto => 'tcp', >>>>>> ) or die 'Can not connect.'; >>>>>> >>>>>> $socket->print('aaa', "\r\n"); >>>>>> $socket->flush(); >>>>>> my $return = <$socket>; >>>>>> $socket->close(); >>>>>> } >>>>>> >>>>>> >>>>>> 以上です。 >>>>>> >>>>>> >>>>>> 2009/2/21 masahito ikuta <coo...@gm...>: >>>>>>> 幾田です。 >>>>>>> >>>>>>> kai-users-ja に参加していなかった事をスッカリ忘れていて >>>>>>> 先ほど、慌てて Subscribe しました。申し訳ございません。 >>>>>>> >>>>>>>>quit なしに TCP を切断すると,kai_tcp_server:acceptor_loop >>>>>>>>のいずれの場合にもマッチしないようです. >>>>>>> >>>>>>> 明日、障害の再現後、修正致します。 >>>>>>> >>>>>>>>> 橋本です。 >>>>>>>>> >>>>>>>>> 以前、"接続が問答無用で切断されるようになった" >>>>>>>>> >>>>>>>>というタイトルで質問させてもらいました。そのときは割り当てるファイルディスクリプタを大きくして解決したと思っていましたが、もしかしたら間違えていたかもしれません。 >>>>>>>>> >>>>>>>>> >>>>>>>>statsの実装を進めていただいているので、ポーリングしてグラフ化するようにcactiのプラグインを動かしてみました。5分おきにstatsをポーリングするだけなのですが、一日ほど動かしただけで先日報告した"接続が問答無用で切断されるようになった" >>>>>>>>> >>>>>>>>と同じ状態になりました。監視のテストをしただけで実際にデータを突っ込んだりはしていません。今回はファイルディスクリプタの数を明示的に増やしたりはしていません。 >>>>>>>>> >>>>>>>>> >>>>>>>>推測なのですが、kaiから切断するときにquitを送らずに、tcpを切断した場合に問題になるようなことはないでしょうか。先日も、今回のcactiのプラグインもkaiへのアクセスにはpeclのmemcache実装を使っています。 >>>>>>>> >>>>>>>>ちょっとテストしてみましたが,その推測通りっぽいです. >>>>>>>>kai_tcp_server モジュールで処理フローが行方不明になっています.. >>>>>>>> >>>>>>>>cooldaemon 様: >>>>>>>>ここ数日ほど出先で mac >>>>>>>>しかなく,十分なチェックができないでいます. >>>>>>>>quit なしに TCP を切断すると,kai_tcp_server:acceptor_loop >>>>>>>>のいずれの場合にもマッチしないようです. >>>>>>>>ただし,mac の netstat >>>>>>>>で確認したところ,サーバ側のソケットは正しく閉じられているように見えました. >>>>>>>>可能なら,Linux でチェックしてみてください. >>>>>>>> >>>>>>>>> http://pecl.php.net/package/memcache >>>>>>>>> >>>>>>>>> >>>>>>>>tcpdumpして確認したのですが、ソースコードで明示的にcloseを行ってもquitコマンドは発行していないようです。以前ご紹介したmcbだとちゃんとquitを送っているようです。そのため、このツールを使って負荷をかけた場合には問題が発生したなかったのではないかと推測しています。 >>>>>>>>> >>>>>>>>> http://www.interdb.jp/techinfo/mcb/index.html >>>>>>>>> >>>>>>>>> いかがでしょうか。 >>>>>>>>> ------------------------------------------------------------------------------ >>>>>>>>> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA >>>>>>>>> -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise >>>>>>>>> -Strategies to boost innovation and cut costs with open source participation >>>>>>>>> -Receive a $600 discount off the registration fee with the source code: SFAD >>>>>>>>> http://p.sf.net/sfu/XcvMzF8H >>>>>>>>> _______________________________________________ >>>>>>>>> Kai-users-ja mailing list >>>>>>>>> Kai-users-ja@li... >>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-users-ja >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>-- >>>>>>>>Takeru INOUE <takeru.inoue@gm...> >>>>>>> >>>>>>> -- >>>>>>> cooldaemon >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> cooldaemon >>>>>> ------------------------------------------------------------------------------ >>>>>> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA >>>>>> -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise >>>>>> -Strategies to boost innovation and cut costs with open source participation >>>>>> -Receive a $600 discount off the registration fee with the source code: SFAD >>>>>> http://p.sf.net/sfu/XcvMzF8H >>>>>> _______________________________________________ >>>>>> Kai-users-ja mailing list >>>>>> Kai...@li... >>>>>> https://lists.sourceforge.net/lists/listinfo/kai-users-ja >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Takeru INOUE <tak...@gm...> >>>>> >>>> >>>> >>>> >>>> -- >>>> cooldaemon >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> ------------------------------------------------------------------------------ >>> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA >>> -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise >>> -Strategies to boost innovation and cut costs with open source participation >>> -Receive a $600 discount off the registration fee with the source code: SFAD >>> http://p.sf.net/sfu/XcvMzF8H >>> _______________________________________________ >>> Kai-users-ja mailing list >>> Kai...@li... >>> https://lists.sourceforge.net/lists/listinfo/kai-users-ja >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |