57

tomcat NIO コネクタの内部構造を知りたいです。CometProcessor を実装するサーブレットを作成するとき、スレッドはどのくらい正確に使用されますか?それは接続ごとに 1 つのスレッドですか?

私が読んだところによると、会話は次のようになります

  1. クライアントがサーブレットに接続する

  2. 接続されたクライアントがデータを利用できるようになるまで、サーブレットは接続を維持します。

  3. データの準備ができたら、サーバーは httpResponse に書き込み、それをフラッシュします。これは実際に接続を切断しますか?

  4. クライアントは、サーバーが再びハングアップする別の要求を送信します..

これが何度も発生する場合、スレッドはいくつ使用されますか?

4

4 に答える 4

60

NIO とコメットはまったく無関係です。それらを組み合わせて使用​​できます。

NIO (または APR) コネクタを使用すると、スレッド モデルにより、より少ないスレッドでより多くのリクエストを処理できます。コネクタ間の比較については、http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Connector_Comparisonを参照してください。

Comet (および Websocket) には、まったく異なるディスパッチ モデルがあり、異なるアプリケーション アーキテクチャを必要とし、異なる方法でより高いスループットを実現します。

あなたが質問で提示するシナリオは、典型的なリクエストごとに 1 つのスレッドをブロックするモデルです。ステップ 4 では、Java BIO コネクタ (Tomcat 7 までのデフォルト) は、既存のコネクタで追加のリクエスト (キープアライブ HTTP リクエスト) を待ち続けます。クライアントがConnection:close前の要求を設定せず、接続を閉じない場合、スレッドはキープアライブ タイムアウトに達するまでハングします。NIO コネクタを使用すると、応答が送信された直後にスレッドがスレッド プールに戻され、到着しない可能性のあるキープアライブ リクエストでスレッドが「無駄」になることはありません。

Comet/Websocket は、特別に作成されたサーブレット (およびオプションのフィルター) にメッセージを配信することにより、まったく異なる動作をします。スレッドは、送信するメッセージまたは書き込むデータがある場合にのみ使用されます。

更新 2016-08-19

Tomcat 8.5 および 9.0 では、BIO コネクタが完全に削除されました。これは、新しい API とテクノロジ (Websocket など) の多くがノンブロッキング セマンティクスを必要とし、ブロッキング API の上にノンブロッキング サービスを構築することが非常に難しいためです。ジョブを完了するために必要なコードは、Tomcat コードの残りの部分を非常に見苦しくしていました。そのため、BIO コネクタを完全に削除する決定が下されました。そのため、Tomcat 8.5 以降では、NIO、NIO2、および APR ベースのコネクタのみが利用可能です。

また、Tomcat 8.5 および 9.0 では、Cometのサポートが廃止されたことに注意してください。Comet の使用はすべて、より標準的なプロトコルである Websocket に置き換える必要があります。

于 2012-06-14T13:31:25.160 に答える
4

NIO はより少ないスレッドを使用します。これは、tcp/ip ポートの使用がより少ないことを意味します。

ポートが 1 ~ 65534 であることはわかっているので、NIO は BIO よりも高い TPS (1 秒あたりのトランザクション数) に達することができると言えます。

私は両方のプロトコルをテスト:HTTP/1.1org.apache.coyote.http11.Http11NioProtocol 、同じ web プロジェクト、同じホスト、同じ server.xml でプロトコルをテストしました。

テストには jmeter を使用します。

リクエストを実行するために 1000 スレッドを設定しました。数分で HTTP/1.1 が使用される場合、ホストの使用ポートは 30000 を超え、TPS は 300 のみです。

org.apache.coyote.http11.Http11NioProtocol の場合、使用ポートの最大数は 3000 を超えず、tps は 1200 を超えています。

于 2013-12-03T06:39:40.283 に答える
4

この議論に遅れて追加 - このブロッキング IO と非同期 NIO のパフォーマンス比較のコンテキストでは、 「サーバーの古い書き方は新しい」という優れた読み物があります。以下の要約では、接続モデルごとのスレッドは、NIO バージョンと比較してパフォーマンスが向上し、書き込みが容易であることがわかりました。これは、一般に信じられていることとは異なります。

于 2016-05-25T12:16:53.683 に答える
1

Tomcat での BIO (リクエスト処理はスレッドを受け入れるようにバインドされている) と NIO (リクエスト処理は別のワーカー スレッドに渡される) の違いを検討するのに役立つ場合に備えて、NIO コネクタに関する 2 つの優れた記事を次に示します。

于 2016-07-13T18:23:00.133 に答える