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 を使用する方がよいのではないかと考えていました。