抱歉重复发帖。其实我想把我的问题在 StackOverflow 上向 ServerFault 提问,但似乎我做不到。以下是我的问题:
我有一个 Web 应用程序,需要在 Tomcat 中进行负载平衡。我的硬件规格是 5 个 32 GB RAM 四核处理器 64 位操作系统。
我应该
- 5 个 Tomcat,每台机器一个,-Xmx 约为 30GB,maxThreads 更高
- Tomcat 数量较多,-Xmx 较低,例如 25 个 Tomcat,每台机器 5 个,-Xmx 约为 6GB,使用默认 maxThreads
我在 Tomcats 之前使用 mod_proxy_balancer 负载均衡器。假设数据库层没有瓶颈,以简化情况。对于建议 #1,作者http://www.theserverside.com/news/1363681/Scaling-Your-Java-EE-Applications表示 12GB 最大内存会导致 gc 期间出现较长的暂停时间,因此建议仅使用 3GB。他没有分享他的 gc 设置,因此我不确定是否可以进一步微调。
如果您需要更多信息,请告诉我。
谢谢。
答案1
在其他条件相同的情况下,JVM 中较大的堆大小只会推迟由容器和/或代码创建的引用问题的成本。您的暂停可能需要更长时间才能显现,但一旦出现,它们几乎肯定会让世界停止(更长时间)。
只要您以这种方式进行负载平衡,我通常更喜欢将每个 Tomcat 实例绑定到处理器子集,在测试中测量我的应用程序的堆需求,然后留出某种余量。最好持续监控和管理您的内存需求,而不是尝试用最大可能的空间来分解它。