在 EC2 实例上为 Tomcat 分配 Java 堆
Posted
技术标签:
【中文标题】在 EC2 实例上为 Tomcat 分配 Java 堆【英文标题】:Allocating a Java heap for Tomcat on an EC2 instance 【发布时间】:2012-01-23 19:22:10 【问题描述】:我正在编写一个 Java servlet,我计划使用 Elastic Beanstalk 在 Amazon AWS 上部署它。我的测试表明,使用 Beanstalk 使用的库存 Tomcat AMI 的小型 EC2 实例运行良好。
我正在尝试弄清楚如何为此配置正确分配 Java 堆空间。小型实例有 1.7 GB 的内存,所以我认为 1024MB 的堆可以很好地工作。我意识到其他事情需要内存,即使这个实例的唯一“真正”目的是运行 Tomcat。而且我还知道,在某些情况下,标准 Sun/Oracle JVM 无法真正工作。
这是一种合理的内存分配方式吗?我应该多用还是少用?我可以使用哪些工具来帮助确定最佳配置?
【问题讨论】:
【参考方案1】:1024 似乎还可以,可能有点多。
我不确定您的 servlet 正在做什么,但为了让您了解一下,我有一个电子商务应用程序,每天约有 1000 名用户在 2 个小型 ec2 实例上运行。 Tomcat 负载通过 mod_jk 分发。
我根本没有调整 JVM 并保持默认设置。我也在使用 terracotta 分布式对象缓存,这个过程似乎消耗了大部分内存。
您是部署在基于 linux 的操作系统还是 windows 上? IMO,Linux 在管理可用内存方面做得更好。
至于工具,我建议将您的应用程序按原样部署到一个小型 ec2 实例,并使用 JMeter 之类的工具对应用程序进行压力测试。在压力测试期间,您可以打开 top 实用程序(假设您的应用在 linux 上并安装了 top)。
尝试通过查看它可以处理多少负载来破坏您的应用程序。这就是 ec2 的美妙之处,您可以在几分钟内设置好测试环境,然后立即丢弃。
【讨论】:
感谢您的意见。我不会详细介绍我们的应用程序。它允许用户查看有关不同主题的信息,然后可能向他们添加更多信息。关于主题的一些信息是从数据库动态生成的,而大部分是我们在启动时从文件中读取的静态数据,并保存在堆上我们自己的数据结构中。总之,它的数据价值约为 250-300 MB。我猜当我们真正开始运行时,我们每天会有几万用户。 在我之前的 AWS 项目中,我试图控制一切。对于这个项目,我决定我需要将更多时间花在“真正的”应用程序以及如何推销它而不是简单的 IT 工作上,所以我只是使用股票 Beanstalk。这意味着使用他们的库存 AMI,即 Linux 和 Elastic Load Balancer。您使用 mod_jk 来分配负载而不是 ELB 有什么原因吗?鉴于此,您为什么认为 1024 有点太多了?剩下 700MB 用于其他所有内容,这实际上只是标准操作系统任务。我看对了吗? @SanderSmith 我仍在使用 ELB,但我正在使用它来平衡 2 个小型 apache Web 服务器实例。然后从我的 apache Web 服务器实例中使用 mod_jk 将负载分配到我的 tomcat 实例。 Apache 更擅长提供静态资源并更好地处理 SSL,这就是我使用它们的原因。我想你能做的最好的事情就是测试负载并从那里做出决定。如果您的应用程序预计每天接收 10k 用户,我认为无论您如何调整 JVM,一个小的 ec2 实例都不够【参考方案2】:检查 java 的 newrelic 以确定您的堆使用模式。
【讨论】:
以上是关于在 EC2 实例上为 Tomcat 分配 Java 堆的主要内容,如果未能解决你的问题,请参考以下文章
未在 Aws Ec2 实例上为 PHP 7.2 执行 PHP 代码
具有自动缩放属性的 EC2 实例上的 tomcat 的 Memcached 会话管理器
Java 计划任务是不是在 AWS Auto Scaling 组的所有 EC2 实例上运行?
在 EC2 中部署的 Tomcat Webapp 无法与 Postgres RDS 实例通信