2012-05-11 11 views
11

HTTPリクエストのプリ/ポスト処理のためのTCPベースのデーモンを構築しています。クライアントはApache HTTPD(またはIIS)に接続し、カスタムApache/IISモジュールはさらに処理するためにTCPデーモンに要求を転送します。私のデーモンは大量のトラフィックを処理するためにスケールアップする必要がありますが、大部分のリクエストは小さく短命です。デーモンはC++で構築され、クロスプラットフォームでなければなりません。スレッドプールのスケーラビリティとブースト::アシストのTCPサーバー

私は現在、ブーストasioライブラリを見ていますが、それは自然なフィット感のようです。しかし、スタックレスコルーチンとスレッドプールパターンのメリットを理解するのが難しいです。具体的には、私はここでHTTPサーバの例#3とHTTPサーバの例#4を見ています:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html

私のグーグルにもかかわらず、私は完全にスタックレスコルーチンサーバのメリットを理解することはできませんマルチコアシステム上のスレッドプールサーバーに関連して実行します。

どちらが私の要件を考慮すると最も適切なのでしょうか?なぜですか?スタックレスコルーチンのアイデアに関するあなたの答えを「愚かにしてください」と自由に感じてください、私はまだここで不安定な地面にいます。ありがとう!

編集:議論のための別のランダムな思考/懸念: ブーストHTTPサーバの例#4が「スタックレスコルーチンを使用して実装シングルスレッドHTTPサーバ」として記載されています。 OK、それは完全にシングルスレッドです(そうです、親プロセスが子プロセスをフォークした後でも、例#4のserver.cppを参照してください)...シングルスレッドはマルチコアシステム上でボトルネックになりますか?どのブロッキング操作でも、他のすべての要求が実行されないようにしています。これが実際の場合、スループットを最大限にするために、私はコルーチンベースの受信データ非同期イベント、内部のブロックタスク(マルチコアを活用するためのスレッドプール)を考えています。そして、非同期で接続を閉じるメカニズム&を送信します。ここでも、スケーラビリティは非常に重要です。何かご意見は?あなたが原因参照、CPUの命令キャッシュ、スケジュール遅延の局所性の相対的な影響を予測することの難しさに、実際に何が起こるかを特定することの効果を測定する必要が

+0

*クエリ*:「スケールアップする」と思っています。 「スケールアウトする」とは何ですか? –

+0

コールーチンのアプローチは、コードが上から下に読み込まれるため、読み込み/実装が簡単です。入力が途切れた後にもう一度ストリームを消費すると、中断していた箇所を心配する必要がないため、ストリーミング解析に適しています。 – avid

+0

@avid - ありがとう、私は、ブーストHTTPサーバーの例#4で、リクエストパーザでどのようにそれをしたのか分かりました。間違いなく良いですが、コーディング/実装の容易さよりもパフォーマンスに関心があります。これについてあなたの考えは何ですか? – Tom

答えて

9

私は最近、マルチコアマシンでboost.asioのスケーラビリティを検討しました。

:主な結論は、これまでのところ、それは、オーバーヘッドロック競合と(少なくともLinuxの場合)、追加のコンテキストスイッチを導入し、これらのトピックに私のブログの記事のいくつかを見るということです

私はまた、あなたの主な懸念は、パフォーマンスとスケーラビリティのある場合、私はAFRAだhttp://comments.gmane.org/gmane.comp.lib.boost.asio.user/5133

を参照してください、私は明らかに何かを見逃していないことを確認するためのASIOメーリングリストのスレッドを開始しましたidでは、明確な答えがないことを確認してください。プロトタイプを作成してパフォーマンスを確認する必要があります。

ブロッキング操作がある場合は、複数のスレッドを使用することをお勧めします。一方、コンテキスト切り替えとロック競合は、複数のスレッドでパフォーマンスを低下させる可能性があります(少なくとも注意する必要があります)。

編集:ちょうどスタックレスをclariflyするものをコルーチン:それは、非同期APIは、シーケンシャル/ブロック呼び出しのように少し見えるように、本質的にちょうどいくつかの構文糖です。

+0

あなたの専門知識を共有していただきありがとうございます。私は自分のサーバーを構築する際にブログとサンプルコードを詳しく調べています。素晴らしいASIOスレッドも。あたかもいくつかの実装をベンチマークしてそこから進めなければならないかのように見えます。あなたのASIOスレッドの誰かがコルーチン機能を利用しているのかどうか尋ねましたが、応答は見られませんでした。これをプロファイリングする予定ですか?ご協力ありがとうございました! – Tom

+0

ベンチマークとトムの分析はどうしましたか?私もこれで遊んでいるので、あなたがどこに行ったのかが分かりました。 – Homer6

+0

@ Homer6 - 私はブーストの例#4が本当に単一のコアに限定されていることを確認した後、私のアプリケーションを再構築しました。たとえそうでなかったとしても、自分のプールを作成するのではなく、Webサーバーのスレッド内で実行するほうが理にかなっていました。だから少なくとも今のところ、私はそのアイデアを放棄し、それを追求していない。申し訳ありませんが私はより多くの助けになることはできません! – Tom

0

は、

あなたはヒューリスティックな推測をしたいなどの場合スタックサイズがSnスレッドを使用すると、各スレッドが実際に使用するスタック領域の多くは、常にnSバイトになります。それがページ境界を越えてしまうと、パフォーマンスが大幅に低下する可能性があります。

+0

おかげでマイクのために再度、あなたがお勧めとしてそれをプロファイルするために持っているおかげつもりのように見える、私は理論の多くを求めているとし、「スレッドプールよりもパフォーマンスの高いスタックレスコルーチンはあります?」あるいは、2つの別々のコンセプトを間違って組み合わせていますか? – Tom

+0

@TomC:Windowsを使用している場合は、スレッド切り替えが最も少ないオプションを選択してください。慎重に書かれたコルーチンは、私の経験ではキャッシュ・スラッシングが少なくて済みます。あなたが長時間ブロックしている場合、スラッシングはそれほど重要ではありません。 – JimR

+0

@JimR:チップありがとう。私はWindowsと* nixの両方を対象にしていますので、あなたのアドバイスをお待ちしております。 – Tom

関連する問題