【问题标题】:minimize Tomcat "per connection" memory footprint最小化 Tomcat“每个连接”的内存占用
【发布时间】:2012-04-13 07:12:40
【问题描述】:

我用 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/连接。不确定这现在如何影响吞吐量。我也在 32bit / 64bit linux 上尝试过,结果相同。

【问题讨论】:

  • 您是如何测量每个客户端 85kb 的?
  • 我做了一个小负载测试并连接了 10.000 个客户端。在服务器代码中,我每 100 个客户端执行一次 System.gc(),然后将 Runtime.totalMemory()-Runtime.freeMemory() 打印到控制台。
  • 嗨。你能分享你最好的Tomcat / JVM设置吗?另外,你用的是 NIO 连接器吗? 10x

标签: java sockets tomcat memory


【解决方案1】:

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

但是,有一个救星:

网络: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 人员致敬!我印象深刻。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多