【发布时间】:2015-11-30 12:41:48
【问题描述】:
我尝试创建连接到我的 glassfish websocket 服务器的大约 5000 个并发客户端(从服务器到客户端的不间断数据发送)。 (CPU:双核,8 GB RAM)
连接了大约 2500 个客户端后,连接时间约为 67(!)秒,我无法连接更多客户端,原因是 TimeOutException。
一些事实:
- 线程池最大大小设置为 12.000。
- 在第一次出现 TimeoutException 时,我有 2500 个客户端和大约 2450 个线程。因此,我们在这里讨论每个连接一个线程。
- 这不是内存问题!
然后在 Node.js 和 golang 中编写了两个简单的 Websocket 代理服务器来处理 websocket 连接。 Proxy Server 和 glassfish 服务器之间的数据交换通过简单的 Websocket 连接进行。
现在我能够毫无问题地创建超过 5000 个并发客户端。 Wildfly 8 和 Tomcat 8 也有同样的问题。 评价如下:
现在我的问题。
Tyrus 是 glassfish 中 Websocket 协议的实现,并在底层使用 java.nio 库进行非阻塞 I/O。
那么为什么它的可扩展性这么差呢?或者为什么可扩展性如此不同。我的意思是我看到java.nio
附:只是调度开销?
编辑:如何重现问题
用于创建和连接客户端的客户端软件和 Websocket 服务器位于不同的 PC 上。
【问题讨论】:
-
那么您的测量结果是否具有可比性?您的 node.js 和 golang 实现是否有 2450 个线程?
-
@Kayaman 没有,因为代理服务器和真实服务器之间只有一个连接。但是由于 Tyrus 使用非阻塞 IO 并且 node.js 也使用它。为什么可扩展性如此不同。我的意思是我看不到
java.nio的优势 -
由于您实际上没有提供任何可以继续进行的操作,因此我将为您提供“您可能做错了什么”的答案。
-
那么 node.js 和 Go 版本呢。他们是否也产生了多个线程?
-
@StephenC node.js 和 go 版本只产生一些线程:THREAD_COUNT = CPU_COUNT
标签: java node.js multithreading go websocket