首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tyrus每个websocket连接使用多少个线程?

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

Stack Overflow用户
提问于 2015-07-10 22:29:15
回答 1查看 2.3K关注 0票数 3

我试图理解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中启用了共享容器,那么使用选择器和工作线程池也会使我受益。

代码语言:javascript
复制
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连接,我需要多少个选择器和工作线程?有公式吗?

更新2:

当我连接到JVM时,我看到以下线程(只列出有趣的线程):

代码语言:javascript
复制
- 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]

我想灰熊线程是Tyrus客户端为每个websocket创建的线程(BTW,我想我没有仔细计算灰熊线程。我认为这三个人的计数应该是相同的)。一个选择两个工人,对吗?

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

  • WebSocketServer-localhost-ROOT-xxxx
  • 泰勒斯-x线程-xx
  • nioEventLoopGroup-x
  • 保持-活-计时器
  • http-apr-8080-exec-xxx

有人知道每一组线程做什么吗?有任何文件可以解释这一点吗?

另外,我的Tomcat设置为使用APR连接器,我想知道在这种情况下使用NIO或NIO2会更好吗?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-12 14:52:54

这取决于你的环境。泰勒斯(服务器!)它本身不应该创建新线程,它只使用什么样的容器(Glassfish,WebLogic,.(在独立服务器模式下运行时使用灰色)提供。

而且,这取决于您在端点中所做的事情。如果您在每个连接中不断地接收/发送消息,那么必须有一个线程。否则,如果您只需要连接而什么也不做,Tyrus本身就不应该做任何事情,除非您使用的是心跳特性或类似的功能。

所以,我不知道为什么JVM使用这么多线程(BTW它们都是活动的吗?如果你想解决这样的问题,你需要提供更多的信息。您可以从提供代码(可执行文件最好)开始,以便我们能够再现您所看到的内容;可以随意将其移到users@tyrus.java.net中,它可能会在对话中结束,这不符合“这么问/答”模型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31351292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档