2012-06-14 53 views
45

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

  1. クライアントが接続されたクライアント

  2. へ 利用可能なデータがあるまで、サーブレットは、接続に上にハング

  3. サーブレットに接続するような会話が行く私が読んだものから、

  4. データが準備されると、サーバーはhttpResponseに書き込みを行い、 はそれをフラッシュします。これは実際に接続を切断しますか?

  5. クライアントは、サーバーが再びこれが起こって保持する際に使用されているどのように多くのスレッド..

上にハングアップする別の要求を送信しますか?

+0

?この種の動作は、Tomcat 7とTomcat 8のそれ以降のバージョンで変更されています。 –

答えて

45

NIOとCometは完全に無関係です。それらを混在させることができます。

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は、特別に書かれたサーブレット(およびオプションのフィルタ)にメッセージを配信することによって全く異なる働きをします。スレッドは、送信するメッセージまたは書き込むデータがある場合にのみ使用されます。

UPDATE 2016年8月19日

のTomcat 8.5と9.0は完全にBIOコネクタを落としています。これは、新しいAPIや技術(Websocketなど)の多くにノンブロッキングセマンティクスが必要であり、ブロッキングAPIの上にノンブロッキングサービスを構築することは非常に難しいためです。仕事を完成させるために必要なコードは、Tomcatコードの残りの部分を非常に醜いものにしていたため、BIOコネクタを完全に落とすという決定が下されました。したがって、Tomcat 8.5以降では、NIO、NIO2、およびAPRベースのコネクタのみが使用可能です。

Tomcat 8.5および9.0でも、コメットのサポートが無効になっていることに注意してください。 Cometの使用はすべて、より標準的なプロトコルであるWebsocketに置き換えてください。

+3

NIOはwin-winなので、APRが利用できない場合、なぜBIOがデフォルトですか? – Jayen

+3

@Jayen BIOは、7.0.xまでのTomcatのデフォルトコネクタです。 Tomcat 8では、NIOは[デフォルトのコネクタ](http://tomcat.apache.org/migration-8.html#Default_connector_implementation)です。 –

+0

Tomcat 6または7(Java 7の場合)のデフォルトではなかったのは何ですか? – Jayen

5

NIOはスレッド数を減らすので、tcp/ipポートの使用量が少なくなります。

私は同じ、同じWebプロジェクトでプロトコル:HTTP/1.1org.apache.coyote.http11.Http11NioProtocol の両方をテストしますが、ポートが65534から1知っているので、我々はNIOがBIO

よりも高いTPS(秒あたりのトランザクション)に達することができると言うことができますホスト、および同じserver.xmlではなくプロトコルです。

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

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

org.apache.coyote.http11.Http11NioProtocolの場合、最大使用ポート数は決して3000を超えず、tpsは1200を超えません!

+2

あなたの記事を読んでください、それは非常に理解することは難しいです。私はそれを少しクリアするのに役立ついくつかの編集をしました。新しい段落を開始する場合は、2桁の改行が必要です。 –

+0

@Joshua Wilsonありがとう! – toby941

+0

もしあなたがそれを更新したら、別のコメントを投稿してください。修正したらもう一度レビューしupvoteします。 :) –

3

この議論の後半に追加 - IOと非同期NIOのブロック間のパフォーマンス比較のこのコンテキストでは、優れた読み取りは "Old way of writing servers is new"です。要約すると、接続モデルあたりのスレッドは、普及している信念に反して、NIOバージョン と比較して、パフォーマンスが向上し、書きやすくなりました。

0

これは、TomcatのBIIO(リクエスト処理はスレッドを受け入れるようにバインドされています)& NIO(リクエスト処理は別のワーカースレッドに渡されます)との違いを考えるのに役立つ2つのNIOコネクタです。あなたがTomcatのバージョンを参照してくださいするには

+0

tomcat-expertの記事では、httpコネクタではなくNIO AJPコネクタを参照しています – avmohan

関連する問題