- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我尝试创建连接到我的 glassfish websocket 服务器的大约 5000 个并发客户端(不停止从服务器向客户端发送数据)。 (CPU:双核,8 GB 内存)
连接大约 2500 个客户端后,连接时间约为 67(!)秒,由于 TimeOutException
,我无法连接更多客户端。
一些事实:
然后在 Node.js 和 golang 中编写了两个简单的 Websocket 代理服务器来处理 websocket 连接。代理服务器和 glassfish 服务器之间的数据交换发生在简单的 Websocket 连接上。
现在我能够毫无问题地创建超过 5000 个并发客户端。我在 Wildfly 8 和 Tomcat 8 上遇到了同样的问题。这是评价:
现在我的问题。 Tyrus是 glassfish 中 Websocket 协议(protocol)的实现,并在底层使用 java.nio
库实现非阻塞 I/O。
那么为什么它的可扩展性这么差呢?或者为什么可扩展性如此不同。我的意思是我认为 java.nio
附言只是安排开销?
用于创建和连接客户端的客户端软件与 Websocket 服务器位于不同的 PC 上。
最佳答案
这个问题有很多可能的答案包括:
也许 Tyrus 真的不能很好地扩展。
也许您没有正确使用它;也就是说,您的代码正在做一些导致 Tyrus 表现不佳的事情。
也许您正在“比较苹果和橘子”;即您的测试正在比较不同的事物。
可能是内存问题。你有什么证据证明它不是?
可能是多种原因造成的。
遗憾的是,您没有提供任何具体信息来帮助我们区分可能的原因和不太可能的原因。
根据您在更新/评论中报告的内容,Tyrus 似乎为每个 WebSocket 连接使用一个线程,但其他人使用更具可扩展性的方法。
使用 NIO 并不一定意味着非阻塞 I/O。
在documentation对于 WebSocket API 的 Tomcat 7 实现,它是这样说的:
The Java WebSocket 1.0 specification requires that callbacks for asynchronous writes are performed on a different thread to the thread that initiated the write. Since the container thread pool is not exposed via the Servlet API, the WebSocket implementation has to provide its own thread pool. This thread pool is controlled by the following servlet context initialization parameters:
org.apache.tomcat.websocket.executorCoreSize
: The core size of the executor thread pool. If not set, the default of 0 (zero) is used. Note that the maximum permitted size of the executor thread pool is hard coded to Integer.MAX_VALUE which effectively means it is unlimited.org.apache.tomcat.websocket.executorKeepAliveTimeSeconds
: The maximum time an idle thread will remain in the executor thread pool until it is terminated. If not specified, the default of 60 seconds is used.
这暗示了为什么在 Tyrus 中创建线程,并且暗示 Tomcat 可能比 Glassfish 上的 Tyrus 更具可扩展性。 (我也会在 Grizzly 上尝试 Tyrus。)
关于尽管使用了 java.NIO,但 Java Websockets 的可扩展性很差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32396647/
我花了相当多的时间尝试优化文件哈希算法,以尽可能地提高性能。 查看我之前的 SO 主题: Get File Hash Performance/Optimization FileChannel Byte
我不太明白它们之间有什么不同,所以我对这两个包有一些疑问。 在 Google 上浏览了一下之后,似乎 Oracle 决定使用更新和增强的 NIO.2 包来更新 NIO 包,作为 JDK7 版本的一部分
在 Java 1.4 之前,通过在不同的输入流/输出流之间移动字节来处理文件是常见的做法。 自 Java 1.4 起,其中 NIO已添加,建议使用 Channels 执行相同操作。 与 NIO2在 J
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我需要重写一些应该在 Java 6 VM 上运行的 Java 7 文件 IO 代码。 该实现使用了方便的 Java 7 功能,例如自动关闭、Paths 和 Files。 更具体地说,我需要处理像 /t
当我查看java中Scanner的源代码时,我发现一些让我困惑的事情 import java.nio.file.Path; import java.nio.*; 它们之间有什么区别,为什么它们不直接导
我的 Java 代码中几乎所有文件 I/O 操作都使用 java.nio.*。然而,在今天调试一段代码时,我注意到调试器 (Intellij IDEA 14) 显示了以下关于 java.nio.fil
奇怪的是,我无法在 Google 中找到 NIO.2 异步 IO 性能与通过 java.nio.channels.Selector 使用 NIO 的多路复用 IO 的明确答案。 所以,我的问题是:NI
我是初级 Java 程序员。 今天,我练习了如何在 java 中复制文件并尝试按照本教程进行操作 http://www.journaldev.com/861/4-ways-to-copy-file-i
我有一个指向绝对路径的 java.nio.Path: /home/user/project/resources/configuration.xml 我有第二个 java.nio.Path 指向项目的根
我开始使用java.nio.*,现在我想知道:为什么java.nio.Paths.get(..)不使用java.nio.Path 对象作为输入? 现在我总是做这样的事情: final Path bas
我是新手,正在学习 Java。我尝试在 Netbeans 7 中运行以下应用程序。 import java.io.*; import java.nio.file.*; import java.nio.
我的 Java 程序(见下文)有时会在 java.nio.File.move() 方法执行中因 java.nio.file.AccessDeniedException 崩溃。 我不明白为什么会抛出这个
所以我在这里阅读我最喜欢的软件模式书籍之一(面向模式的软件架构 - 并发和网络对象的模式),特别是关于 Proactor/Reactor 异步 IO 模式的部分。我可以看到通过使用可选 channel
我有一个方法如下,它已经正常运行了很长时间: private String loadFromFile(){ RandomAccessFile inFile = null; FileCh
我在 IntellijIDEA Community Edition 2017.3 版本中收到以下错误。该项目使用java版本“1.8.0-ea”。请给我一些解决问题的想法 Error:Internal
一 点睛 在 scatter-and-gather 场景下,可以将数据写入多个 Buffer 中。在 NIO 中,也能够同时操作多个缓冲区。在很多 Channel 实现类中,都提供了多个重载的 rea
I/O简介 在 Java 编程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。流 I/O 用于与外部世界接
一 点睛 给某一个文件加锁,防止并发访问时引起的数据不安全。 在 JUC 中,可以使用 synchronized、Lock 给共享的资源加锁,或者使用 volatile、CAS 算法等防止并发冲突。在
一 点睛 给某一个文件加锁,防止并发访问时引起的数据不安全。 在 JUC 中,可以使用 synchronized、Lock 给共享的资源加锁,或者使用 volatile、CAS 算法等防止并发冲突。在
我是一名优秀的程序员,十分优秀!