2012-04-13 73 views
5

我已经构建了一个Java自定义消息服务器,它接收消息流并将每条消息传递给其客户端(1:1,如果未连接,则非常简单,即丢弃消息)。我在Win7x64 & Java 7上运行Tomcat 7,并使用NIO连接器(实现了Comet servlet)。 它工作的很好,但我现在正在研究缩放这头野兽,目前正在为每个连接的客户端分配大约85kb的RAM。 10.000客户端@ 900MB以下,线性缩放。 (我没有做其他任何事情,但仍然保持连接)这对我的意见非常重要,所以我想知道是否有一些调整让Tomcat或Java使用NIO impl保存更多的内存。到目前为止我尝试过的所有Tomcat设置都没有影响到这一点。尽量减少Tomcat“每个连接”的内存占用量

有没有人有经验如何将Java或Tomcat放在有关套接字连接的内存节食上?

更新: 我现在通过修剪套接字缓冲区和一些其他的tomcat内部在70kb /连接下。不知道这如何影响吞吐量。我也在32位/ 64位Linux上尝试过,结果相同。

+0

您是如何测量每个客户端85kb的? – dash1e 2012-04-13 07:31:23

+0

我做了一个小负载测试并连接了10.000个客户端。在服务器代码中,我在每100个客户端之后完成一个System.gc(),然后将Runtime.totalMemory() - Runtime.freeMemory()打印到控制台。 – Daniel 2012-04-13 17:29:24

+0

嗨。你能分享你最好的Tomcat/JVM设置吗?另外,您是否使用NIO连接器? 10倍 – JRun 2014-05-09 11:30:51

回答

1

经过相当多的研究和玩耍之后,我得出了这样的结论:Tomcat无法用合理的内存处理大量的并发连接。 (我还是很乐意在这里顺便说一句证明是错误的)

然而,有一个救星:

的Netty:http://www.jboss.org/netty/downloads

这是一个Java IO框架,建立在Java的新NIO架构,似乎设计和写得非常好。您可以将一些轻量级模块堆叠在一起并创建一个迷你Web服务器,或者简单地以异步方式自行处理TCP连接。

我在EC2上运行了一次负载测试,并且使它成为令人振奋的7百万个连接@只有1.5GB的RAM! (就像tomcat测试一样,我什么也没做,只是存储连接,所以真正的应用程序当然会消耗更多的mem,但是200字节/连接“开销”不算什么!)它只停留在那里,因为我限制了Java VM到1.5GB,我确信C10M测试很容易实现。

对Netty和Java VM家伙的巨大赞誉!我印象深刻。