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

Dan*_*iel 5 java sockets memory tomcat

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

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

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

Dan*_*iel 2

经过相当多的研究和尝试后,我得出的结论是,Tomcat 根本不可能用合理的内存量来处理大量的并发连接。(顺便说一句,我仍然很高兴在这里被证明是错误的)

然而,有一个救星:

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

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

我在 EC2 上运行了负载测试,并在仅 1.5GB RAM 的情况下达到了令人惊叹的 700 万个连接!(就像 tomcat 测试一样,我除了存储连接之外什么也没做,所以真正的应用程序当然会消耗更多的内存,但 200 字节/连接“开销”不算什么!)它只是停在那里,因为我限制了 Java VM到 1.5GB,我确信 C10M 测试很容易完成。

向 Netty 和 Java VM 人员致以崇高的敬意!我印象深刻。