java - 最小化 Tomcat "per connection"内存占用

标签 java sockets tomcat memory

我用 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 上尝试过,结果相同。

最佳答案

经过相当多的研究和尝试后,我得出结论,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 伙伴们的伟大荣誉!我印象深刻。

关于java - 最小化 Tomcat "per connection"内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10136681/

相关文章:

maven - tomcat 是如何在我的 war 中找不到库中的类的?

java - Eclipse 服务器位置 - 工作区元数据与安装文件夹

java - 在 Tomcat 6 中部署 Spring Boot 应用程序(传统部署)

java - 从列表中删除重复的 beans

java - 创建一个对读取操作线程安全的 DOM

Java 错误 : method in class cannot be applied to given types

node.js - Socket.io 断开 Ping 超时错误

java - 如何在 Java 中获得正确的 JTextField IP 地址?

python - 两台计算机之间的套接字编程

python - 关闭后直接在代码中再次启动带有 ThreadingMixIn 的 TCPServer。 (给出 `Address already in use` )