私の意見ではありません。両方のモデルがうまく実装されている場合(これは大きな要件です)、私はNIOのコンセプトが勝つはずだと思います。
コンピュータの中心にはコアがあります。あなたが何をしていても、コアを持つ以上にアプリケーションを並列化することはできません。つまり、4コアのマシンを使用している場合は、一度に4つの作業しかできません(ここではいくつかの詳細を説明していますが、これで十分です)。
コアではなくスレッド数が増えれば、あなたは無駄です。その廃棄物には2つの形があります。まず、余分なスレッド自体のオーバーヘッドです。次に、スレッド間の切り替えに費やされた時間です。どちらもおそらくマイナーですが、彼らはそこにいます。
理想的には、コアごとに1つのスレッドがあり、それらのスレッドのそれぞれがコアで100%の処理速度で実行されていることが理想的です。タスクの切り替えは理想的には起こりません。もちろん、OSはありますが、16コアマシンを使用してOS用に2〜3スレッドを残せば、残りの13〜14はあなたのアプリに向かって行きます。これらのスレッドは、入出力要件によってブロックされている場合のように、内で内のアプリケーションを切り替えることはできますが、OSレベルでそのコストを支払う必要はありません。あなたのアプリにすぐ書いてください。
このスケーリングの優れた例は、SEDA http://www.eecs.harvard.edu/~mdw/proj/seda/にあります。これは、標準的な要求ごとのスレッドモデルよりも負荷の方がはるかに優れたスケーリングを示しました。
私の個人的な経験はNettyです。私は単純なアプリを持っていた。 TomcatとNettyの両方でうまく実装しました。それから、100件の同時リクエスト(これは800以上と思われます)で負荷テストを行いました。やがてTomcatは動きが遅くなり、非常にバースト的な/遅れた動作を示しました。一方、Nettyの実装では応答時間が増加しましたが、全体的なスループットは非常に高かったです。
これは、堅実な実装に基づいています。 NIOはまだ時間の経過とともに良くなっています。私たちは、OSの機能をより有効に活用するために、JVMを実装する方法と同様に、よりうまく動作するようにサーバーOSを調整する方法を学習しています。勝者がまだ宣言されているとは思えませんが、NIOは最終的に勝者になると信じています。
これは非常に興味深い現実世界のテストです。多くのアプリケーションでは、800件の同時リクエストがそれほど多くありません。私は、Tomcatの遅れがコンテキスト切り替え(またはGC、@可能性のある示唆)に起因しているかどうか疑問に思います。これは、要求ごとのスレッドモデル自体がTomcatの実装ではなくエラーであることを意味します。 – Graham
公正であるために、これはクラスタではなく、テストされていた単一のサーバーでした。 800件のリクエスト私の経験では、同時に800件がかなり高いです。接続からの同時リクエストを区別することが重要です。その負荷で100msの範囲で応答時間が得られれば、毎秒8kの要求をサポートしています。それは単一の箱にとって悪くない。それを1日中スケーリングし、1台のサーバーで7億件のリクエストを処理します。それほど多くのアプリケーションにはそれほど必要なものはありませ – rfeak