2009-06-04 9 views
23

私はサーバーアーキテクチャに関するコメントを読んでいました。このコメントにはイベントループ対マルチスレッドブロックIO

http://news.ycombinator.com/item?id=520077

人は3人の事言う:

  1. イベントループを、再び時間とは、真の低活性接続の数が多いために輝くことが示されています。
  2. 比較すると、スレッドまたはプロセスによるブロックIOモデルは、イベントループと比較してリクエストごとにレイテンシを削減することが時折示されています。
  3. 軽くロードされたシステムでは、その違いは分かりません。負荷の下では、ほとんどのイベントループが減速を選択しますが、ほとんどのブロックモデルは負荷を削減します。

これは本当ですか?

そしてまた、ここ題した別の記事「イベントは悪いアイデアである理由(高同時実行サーバ用)」

http://www.usenix.org/events/hotos03/tech/vonbehren.html

答えて

20

通常、アプリケーションが数百万の接続を処理すると予想される場合は、マルチスレッドのパラダイムをイベントベースと組み合わせることができます。

  1. 最初に、N個のスレッドとして起動します。ここで、N =マシン上のコア/プロセッサの数です。各スレッドには、処理するはずの非同期ソケットのリストがあります。
  2. 次に、アクセプタからの新しい接続ごとに、新しいソケットを最小のソケットを持つスレッドに「負荷分散」します。
  3. 各スレッド内で、すべてのソケットにイベントベースのモデルを使用して、各スレッドが実際に複数のソケットを同時に処理できるようにします。このアプローチで

  1. あなたは万人のスレッドを生成することはありません。あなたはあなたのシステムが扱うことができるだけ多くのものを持っています。
  2. シングルコアではなくマルチコアでイベントベースを使用します。
+0

できるだけ具体的な例を教えてください。ありがとう! – Jeff

+1

そうですね。あなたの実装を教えてください。 –

+1

QThreadPoolとQRunnableで実装するのは簡単です。 http://doc.qt.nokia.com/4.7-snapshot/qthreadpool.htmlを確認してください。 – sivabudh

0

あなたは「低活性」によって何を意味するかわからないが、私は大きな信じていますあなたが実際に各要求を処理するためにどれくらい必要かということになります。シングルスレッドのイベントループを仮定すると、他のクライアントは、現在の要求を処理している間にその要求を処理しません。重要なCPUや時間がかかっていることを意味する「たくさん」という要求を処理するために多くの処理を行う必要がある場合、マシンが実際にマルチタスクを効率的に行うことができると仮定すると(時間がかかっても、単一のCPUマシンなどのリソース)を使用すると、マルチタスキングでより優れたパフォーマンスが得られます。マルチタスキングはマルチスレッドブロッキングモデルですが、着信要求を収集し、それらを順番に(マルチタスキングを介して)処理し、応答をできるだけ早く送信するマルチスレッドワーカファクトリにそれらを送り出すシングルタスクイベントループでもかまいません。

私は、OSがあなたのアプリの外でそれを効率的に処理すると信じているので、クライアントとの接続がそれほど問題ではないとは思っていません。(最初はクライアントとの複数回のラウンドトリップをブロックしないと仮定します。リクエストを開始しました)、私はこれを自分でテストしていません。

+0

この回答は整理する必要があります。 –

関連する問題