如何测试我的 java 应用程序是否可以成功处理 Tomcat 服务器上的低 memory/CPU 资源?

How to test if my java application can successfully handle low memory/CPU resources on Tomcat server?

我想测试我的 java 应用程序在仅具有 512M RAM 的 Tomcat 服务器上的表现。换句话说,我需要进行内存负载测试,以检查我的应用程序是否可以 运行 在这样受限的环境中。

使用哪些工具以及如何实现?

我听说过 APM 软件,包括 Stackify Prefix、New Relic APM、JMeter、JVisualVM、JVM Monitor、JBenchX - 但我不确定我是否需要为我的特定目的继续使用它们中的任何一个。

同样的问题是 CPU 资源非常有限。我想在部署到具有有限 memory/CPU.

的 Jelastic 云之前在我的桌面 PC 上测试我的应用程序

您可以通过修改 -Xmx command-line argument 来人为限制分配给 tomcat 的 JVM 堆,它定义了 Tomcat 服务器将使用的最大堆 space。

如果您只想测试小堆大小 - 这就足够了。

您还可以修改 CPU affinity 以将您的 Tomcat 服务器绑定到单个 CPU 核心(或有限数量的核心)


如果您想更进一步,您可以使用 VirtualBox 创建虚拟机并复制部署后您将拥有的所有预期 hardware/software。

关于测试,我会推荐以下 performance testing techniques

  • Load Testing - 将您的系统置于预期负载下以查看它是否能够处理它
  • Soak Testing - basically the same as Load Testing but for prolonged duration (i.e. overnight or weekend) - it will allow you to identify memory leaks
  • Stress Testing - 从负载测试开始并逐渐增加负载,直到响应时间开始超过可接受的阈值或错误开始发生(无论先发生什么) - 它会让你知道你的限制 application/configuration 和愿景会破坏什么以及如何破坏

使用像 YourKit or JProfiler 这样的分析器工具来微调您的代码也是有益的。

最好的方法是使用虚拟机。您可以选择自己喜欢的技术,但一个简单的选择是使用 Oracle VirtualBox,它可免费用于许多平台。只需在 VM 中安装最小的 OS,然后添加 Java、您的应用程序等,然后 运行 您对其进行负载测试。

网络照常工作,因此您可以使用现有的负载测试框架并将其指向 VM 的 IP 地址。

还有其他更好的方法,例如使用 Docker 或其他方式,但这将完成冒烟测试的工作。

我不建议尝试使用具有大量 RAM 的服务器,然后尝试 "synthesize" 低 RAM 情况而不使用虚拟机(顺便说一句 Docker在内部使用虚拟机)。