私は、毎秒50,000を超えるTCP要求を受信、処理、および応答する、非常に高性能なエンタープライズソフトウェアを構築しています。これは多くのAmazonEC2サーバーに分散されますが、1台のサーバーで1秒あたりできるだけ多くのリクエストを処理できるようにしたいと思います(5k /秒で撮影)。私はおそらくAmazonLinuxを実行しているm1.xlargeインスタンスを使用するつもりです。
私はこのソフトウェアをBoostASIOを使用してC++で構築しており、ソケット処理を設計する最も効率的な方法を見つけようとしています。例では( http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html )以来、「HTTPサーバー2」をエミュレートすることに傾倒しています。従業員には複数のvCPUがあります。
誰かがそこで各HTTPサーバーの例の長所/短所を実際に説明でき、この多くの接続を処理して、追加の洞察(ブーストソケットや高スループットEC2構成に関して)を本当に感謝します。
本当にありがとう!
いくつかの提案:
サーバーが何をするのかについては言及していません。 1秒あたり50Kの新しい要求を受け入れて閉じるのでしょうか、それとも確立されたTCP接続)からのメッセージ(要求)を処理するだけでしょうか。したがって、私のアドバイスは少し一般的である必要があります。
C10K問題を読む: http://www.kegel.com/c10k.html
ASIOの代わりにepollをソケット通知ソリューションとして使用することに投資してください。 epollは難しくありません。
固定数のスレッド(2〜8)の使用を検討してください。これらのスレッド間でソケット接続の負荷を分散するか、スレッドのワークプールを使用して、ソケットスレッドから解析された要求メッセージを処理します。複数のスレッド用に設計しますが、最初は1つのスレッドのみを使用します。次に、すべてのパフォーマンスの問題を解決します。シングルスレッドソリューションが正常に機能し、パフォーマンスがピークに達したら、スレッド数を増やして、他のスレッドがブロックされている間に複数の操作を処理できるようにすることを検討してください。
サーバーのパフォーマンスの問題がソケット設計の範囲外になる可能性が非常に高くなります。 valgrindなどのツールを継続的にベンチマークして実行し、コードがほとんどの時間を費やしている場所を理解します。可能性は高いです、それはあなたがそれを最も期待しないところです。たとえば、私のサーバーでは、時間の大部分が小さな一時バッファ用のメモリの割り当てと解放に費やされていることがわかりました。私はそれを推測することはなかったでしょう。次に、サーバーの設計を変更して、事前にメモリを割り当てたり、スタックメモリを使用したりしました。これにより、リクエストを処理するときに、コードでメモリを割り当てる必要がなくなりました。その変更を行ったとき、パフォーマンスは簡単に2倍になりました。
ノンブロッキングソケットを調べて、入力/出力/処理を別々のスレッドに分散させることをお勧めします。 1000接続ごとに3つの新しい入力/出力/処理スレッドを作成しますか?
お役に立てば幸いです。