From kt @ wheel.jp Tue Jan 21 06:49:54 2014 From: kt @ wheel.jp (TATEISHI Katsuyuki) Date: Tue, 21 Jan 2014 06:49:54 +0900 Subject: [Ultramonkey-l7-develop 1027] Re: [RFP] using SO_REUSEPORT on UltraMonkey-L7 In-Reply-To: <52D77651.3040601@nttcom.co.jp> References: <52D77651.3040601@nttcom.co.jp> Message-ID: タテイシです。 手伝えそうにないのに口だけ出してしまいますが・・・ 1. SO_REUSEPORT以前にも複数のプロセス(スレッド)がひとつのソケットに 対して accept する(kernel内で待ち合わせる)ことは可能だったけど、あんま り均等に割り振られない(特定のプロセスばかり動く)ことが多かった。 2. そのためaccept専用のプロセスがロードバランスするか、acceptをロックで 保護してひとつのスレッド(プロセス)だけacceptするなど、ユーザランドで の工夫をおこなっていた。 3. SO_REUSEPORTを使えば、何も考えないで同時にacceptしてもうまくやっ てくれるようになった → ユーザランド側の設計をシンプルにできる というものだと理解してます。また、シンプルにできるユーザランド側は v2 のようなIOイベントドリブンタイプが効率的かなと思うので、あるべき姿と いうところでは、中野さんのおっしゃるように v2 ベースでいくのが近道かな と思います。 ちなみにSSLに関してはわかりません・・・w 2014/1/16 Hiroaki Nakano > 中野@幕張です。 > > SO_REUSEPORTの使い方をいろいろ検討してみた > ので、とりあえず提案してみます。 > > [Abstruct] > ・RHEL7よりSO_REUSEPORTというソケットオプションが追加されます。 > これは同じIPアドレス、同じport番号で複数のソケットをlisten状態で > 待ち受けることができ、かつacceptをするときはOSが適宜ランダムに > 一つのソケットを選んでacceptさせる、という機能です。 > kernel3.9から実装されています。概要はLWN.netの以下の記事で。 > > https://lwn.net/Articles/542629/ > > これを使ってUltraMonkey-L7で何か利点がないかなー、と検討しました。 > > [Useage SO_REUSEPORT] > ・使ってみた人がいました。 > > http://umezawa.dyndns.info/wordpress/?p=3944 > > この人のプログラムのように、同じIPアドレス、ポート番号に対して > 一つのプロセス(スレッド)で独立したsocketインスタンスを作って、 > そのプロセス(スレッド)を複数作ることができます。 > 一つのcontext内で、open, bind,listen, accept, closeを > 完結させることができます。 > 該当IPアドレス、ポートにパケットが到着したとき、どのsocket > インスタンスでacceptするかはkernelが良しなに振ってくれます。 > > [Suggesting UltraMonkey-L7 design using SO_REUSEPORT] > ・V3ではopen, bind, listenをvirtualserviceスレッドで、 > accept待ちを1つのセッションスレッドでやって、 > accept以降の処理を並列化している構造。 > これを、上記のようにopenからそれぞれのスレッド内で完結するように > 改造するのは大変そう・・・ > ・同じIP,portに対して完全に独立したsocketを起こせるなら、 > スレッドにしなくても子プロセスでいいんじゃないだろうか。 > 各スレッドがアクセスする大域変数も必要なくなりそうだし、 > 起動コストも事前にpreforkとして起動するようにすれば通信時には問題ない。 > > →ということは、V3ベースに改造するより、V2を子プロセス化したほうが > まだ楽なんじゃないか? > > ・ただし、SSLは実装しなきゃだし、SNMPもないし、バグとかも > V3に比べてまだ残ってそう(X-Forwarded-Forとか)。それらを > 実装、直すのと、V3の構造を作り直すのではどちらが楽だろうか・・・ > 個人的には、V2ベースの方が楽そう。 > > ・あと、子プロセス化して独立したsocketインスタンスを生成するので > あれば、SSL通信が速くなるのではないだろうか。 > →V3でSSLが遅いのはOpenSSLがまともにMultiThread対応してなくて、 > 証明書等スレッド間共有メモリにmutex掛けながら1スレッドずつ > アクセスしなきゃいけないのが原因だし。 > 子プロセス内完結なら、SSLも独立したインスタンスになって、 > SSLを並列化できるんじゃないだろうか。 > > ということで、V2ベースでSO_REUSEPORT使って子プロセス並列化 > というのを考えているのですが、どうでしょうか。 > いや、V3ベースの方が楽じゃね?とか、 > SSL並列化は無理じゃね?とか意見あったらお聞かせください。 > > -- > 中野 宏朗 (NAKANO Hiroaki) > > _______________________________________________ > Ultramonkey-l7-develop mailing list > Ultramonkey-l7-develop @ lists.sourceforge.jp > http://lists.sourceforge.jp/mailman/listinfo/ultramonkey-l7-develop > -- TATEISHI Katsuyuki -------------- next part -------------- HTMLの添付ファイルを保管しました... URL: http://lists.sourceforge.jp/mailman/archives/ultramonkey-l7-develop/attachments/20140121/a2cfcbbe/attachment.htm