3

Tyrus websocket 接続のスレッド モデルを理解しようとしています。Tyrus は WebSocket 接続ごとに 1 つのスレッドを使用していますか? 関連するスレッドプーリングメカニズムはありますか?

Tyrus 実装または Java 用の Websocket 実装の内部構造について説明しているドキュメントを見つけようとしましたが、スレッド モデルがどのように機能するかについて説明しましたが、見つかりませんでした。

WebSocket 接続を維持するためにスレッド モデルがどのように機能するかについての情報は役に立ちます。

何千もの WebSocket 接続をサポートできるようにサーバーを最適化しようとしています。現在、1000 の Websocket 接続のみで、JVM は最大 1800 のスレッドを使用しています!

更新 1:

Tomcat 8 で Tyrus 1.9 を使用しています。

サーバーは約 500 の Websocket 接続を終了し、別のサーバーへの 500 の Websocket 接続も開始します。そのため、現在、サーバーには約 1000 の Websocket 接続があります。

私が気づいたことの 1 つは、私のケースに関連していると思われる TYRUS-275 の問題です。Tyrus クライアントはデフォルトで WebSocket 接続ごとに 3 つのスレッドを作成するようです。私の場合、約 500 の接続があるため、送信 Websocket 接続のためだけに約 1500 のスレッドを持つことになります。

また、Tyrus で共有コンテナーを有効にすると、SELECTOR および WORKER スレッド プールを使用するメリットが得られるようです。

client.getProperties().put(ClientProperties.SHARED_CONTAINER, true);
client.getProperties().put(GrizzlyClientProperties.SELECTOR_THREAD_POOL_CONFIG, ThreadPoolConfig.defaultConfig().setMaxPoolSize(3));
client.getProperties().put(GrizzlyClientProperties.WORKER_THREAD_POOL_CONFIG, ThreadPoolConfig.defaultConfig().setMaxPoolSize(10));

スレッドプールを最適化する方法を今疑問に思っていますか? 500 の WebSocket 接続に必要な SELECTOR スレッドと WORKER スレッドの数は? 公式はありますか?

更新 2:

JVM に接続すると、次のスレッドが表示されます (興味深いスレッドのみをリストします)。

- 24   x WebSocketServer-localhost-ROOT-xxxx [mostly parked]
- 1    x WebSocket background processing [mostly asleep]
- 10   x tyrus-1-thread-xx [mostly parked]
- 10   x tyrus-2-thread-xx [mostly parked]
- 1    x Tomcat JDBC Pool Cleaner [waiting]
- 1    x Signal Dispatcher [all running]
- 9    x nioEventLoopGroup-x-x [all running]
- 1    x main [all running]
- 177  x Keep-Alive-Timer [sleeping]
- 1    x java-sdk-htttp-connection-reaper [sleeping]
- 1    x http-apr-8080-Sendfile [waiting]
- 1    x http-apr-8080-Poller [running]
- 200  x http-apr-8080-exec-xxx [mostly parked with running slices]
- 1    x http-apr-8080-AsyncTimeout [sleeping]
- 1    x http-apr-8080-Acceptor-0 [running]
- ~630 x Grizzly(1) [mostly parked]
- ~634 x Grizzly(1) SelectorRunner [mostly running]
- ~635 x Grizzly(2) [moslty parked]

Grizzly スレッドは、Tyrus クライアントが WebSocket ごとに作成しているものだと思います (ところで、Grizzly スレッドを慎重に数えていなかったと思います。カウントは 3 つすべてで同じになるはずです)。1 つのセレクターと 2 つのワーカーですよね?

http-apr-8080-exec-xxx は tomcat によって作成されたスレッドだと思います。これらのスレッドは、着信 WebSocket 接続を処理していますか? 次のスレッドについてもっと知りたいです。

  • WebSocketServer-localhost-ROOT-xxxx
  • tyrus-x-スレッド-xx
  • nioEventLoopGroup-xx
  • キープアライブタイマー
  • http-apr-8080-exec-xxx

スレッドの各セットが何をするか知っている人はいますか? これを説明する文書はありますか?

また、Tomcat は APR コネクタを使用するように設定されているようですが、この状況では NIO または NIO2 を使用する方がよいのではないかと考えていました。

4

1 に答える 1

3

それはあなたの環境に依存します。Tyrus (サーバー!) 自体は新しいスレッドを作成するべきではなく、コンテナー (Glassfish、WebLogic、... (スタンドアロン サーバー モードで実行している場合は Grizzly)) が提供するものを使用するだけです。

また、エンドポイントで何をしているかにもよります。各接続で常にメッセージを送受信している場合は、そのためのスレッドが必要です。それ以外の場合は、接続するだけで何もしない場合、ハートビート機能などを使用していない限り、Tyrus 自体は何もしません。

したがって、なぜあなたのJVMがそんなに多くのスレッドを使用しているのかわかりません(ところで、それらはすべてアクティブですか?私はそれを疑っています..)-そのような問題を解決したい場合は、さらに多くの情報を提供する必要があります. 表示されているものを再現できるように、コード (実行可能ファイルが最適) を提供することから始めることができます。これをお気軽に users@tyrus.java.net に移動してください。おそらく「SO の質問/回答」モデルに適合しない会話になってしまうでしょう。

于 2015-07-12T14:52:54.723 に答える