每个websocket连接Tyrus使用多少个线程?

时间:2015-07-10 22:29:16

标签: java multithreading websocket threadpool tyrus

我正在尝试了解Tyrus websocket连接的线程模型。 Tyrus每个websocket连接使用一个线程吗?是否涉及一些线程池机制?

我试图找到一个文档来描述Tyrus实现的内部结构或任何关于线程模型如何工作的websocket实现,但我找不到任何文件。

有关线程模型如何维护websocket连接的任何信息都很有帮助。

我正在尝试优化我的服务器,以便能够支持数千个websocket连接。现在只有1000个websocket连接,JVM正在使用~1800个线程!

更新1:

我在Tomcat 8上使用Tyrus 1.9。

服务器终止大约500个websocket连接,并启动到不同服务器的500个websocket连接。所以我们现在在服务器上有大约1000个websocket连接。

我注意到的一件事是TYRUS-275问题,我想这与我的情况有关。看起来Tyrus客户端默认为每个websocket连接创建3个线程。在我的情况下,我有大约500个连接,所以我最终应该有大约1500个线程只是为了传出websocket连接。

看起来如果我在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创建的线程(BTW,我认为我没有仔细计算Grizzly线程。我认为其中所有三个的计数应该相同)。一个选择器两个工人,对吗?

我认为http-apr-8080-exec-xxx是tomcat创建的线程。这些线程是否负责传入的websocket连接?我更感兴趣了解以下主题:

  • WebSocketServer-localhost -ROOT-xxxx
  • 泰鲁斯-X-螺纹-XX
  • nioEventLoopGroup-x-x
  • Keep-Alive-Timer
  • http-apr-8080-exec-xxx

有谁知道每组线程的作用?那里有任何解释这个的文件吗?

同样看起来我的Tomcat设置为使用APR连接器我想知道在这种情况下使用NIO或NIO2会更好吗?

1 个答案:

答案 0 :(得分:3)

这取决于您的环境。 Tyrus(服务器!)本身不应该创建新线程,它只使用哪些容器(Glassfish,WebLogic,......(在独立服务器模式下运行时为Grizzly))。

此外,它取决于您在端点中所做的事情。如果您经常在每个连接中接收/发送消息,那么必须有一个线程。否则,如果您只是连接并且什么都不做,那么Tyrus本身不应该做任何事情,除非您使用心跳功能或类似功能。

所以,我不知道为什么你的JVM使用那么多线程(BTW它们都是活动的?我怀疑它......) - 如果你想解决这类问题,你需要提供更多信息。您可以从提供代码(可执行文件最佳)开始,以便我们能够重现您所看到的内容;随意将其移至users@tyrus.java.net,它可能最终会出现在一个对话中,这不符合" SO问题/答案"模型。