最小化Tomcat“每个连接”内存占用

时间:2012-04-13 07:12:41

标签: java sockets tomcat memory

我在Java中构建了一个自定义消息服务器,它接收消息流并将每条消息传递给其客户端(1:1,如果没有连接则丢弃消息 - 非常简单)。我正在Win7x64上运行Tomcat 7& Java 7和我正在使用NIO连接器(实现了一个Comet servlet)。 它运行良好,但我现在正在考虑扩展该野兽,目前我看到为每个连接的客户端分配了大约85kb的RAM。 10,000个客户端@ 900MB以下并线性扩展。 (我还没有做任何其他事情,只是保持连接)这是我的意见,所以我想知道是否有一些调整使Tomcat或Java用他们的NIO impl节省更多内存。到目前为止,我尝试过的所有Tomcat设置都没有对此产生任何影响。

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

更新: 通过修剪套接字缓冲区和其他一些tomcat内部,我现在已经低于70kb /连接。不确定这现在如何影响吞吐量。我也尝试过在32位/ 64位linux上使用相同的结果。

1 个答案:

答案 0 :(得分:1)

经过一番研究和游戏后,我得出的结论是,Tomcat无法用合理的内存来处理大量的并发连接。 (我仍然很高兴在这里被证明是错的)btw。

然而,有一个救世主:

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

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

我在EC2上运行了一个负载测试,并且只需1.5GB的内存就可以实现700万个连接! (就像tomcat测试一样,我什么也没做但只存储连接,所以一个真正的应用程序当然会消耗更多的内存,但200字节/连接"开销"什么都没有!)它只停在那里因为我将Java VM限制在1.5GB,我相信C10M测试很容易实现。

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