From nakano.hiroaki @ nttcom.co.jp Thu Jan 16 15:04:01 2014 From: nakano.hiroaki @ nttcom.co.jp (Hiroaki Nakano) Date: Thu, 16 Jan 2014 15:04:01 +0900 Subject: [Ultramonkey-l7-develop 1026] [RFP] using SO_REUSEPORT on UltraMonkey-L7 Message-ID: <52D77651.3040601@nttcom.co.jp> 中野@幕張です。 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)