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

Posted

技术标签:

【中文标题】如何测试我的 java 应用程序是不是可以成功处理 Tomcat 服务器上的低内存/CPU 资源?【英文标题】:How to test if my java application can successfully handle low memory/CPU resources on Tomcat server?如何测试我的 java 应用程序是否可以成功处理 Tomcat 服务器上的低内存/CPU 资源? 【发布时间】:2018-11-29 18:03:48 【问题描述】:

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

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

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

同样的问题是 CPU 资源非常有限。在部署到内存/CPU 有限的 Jelastic 云之前,我想在我的台式电脑上测试我的应用程序。

【问题讨论】:

512M 不算多。老实说,我会寻找更好的托管服务提供商。我认为亚马逊会给你四倍的价格,每月 15 美元。但我认为你现在最好的选择是将你的 JVM 设置为那些内存限制,在你的 PC 上运行一个真实的实例,并运行一个大型功能测试至少 4 到 8 小时,最好是 24 小时,以确保你可以处理大负载。 【参考方案1】:

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

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

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


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

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

Load Testing - 将您的系统置于预期负载下,看看它是否能够处理它 Soak Testing - 与负载测试基本相同,但持续时间较长(即过夜或周末) - 它可以让您识别 memory leaks Stress Testing - 从负载测试开始并逐渐增加负载,直到响应时间开始超过可接受的阈值或开始发生错误(无论先发生什么) - 它会让你知道你的应用程序/配置的限制和愿景是什么以及如何打破

使用诸如YourKit 或JProfiler 之类的分析器工具来微调您的代码也是有益的。

【讨论】:

这不是一个好建议,因为 jada 堆空间 512M 与系统总内存 512M 之间存在很大差异。请记住,操作系统也必须适应 512M 的系统 RAM,并且 Java 虚拟机也使用一堆非堆内存。 我有没有在任何地方提到过 512Mb 的堆? 没有,但是原发帖人特别要求。你提到使用-Xmx 来限制堆only。您可以将我评论中的 512M 替换为任何值,但作为将 JVM 限制为有限总内存(不仅仅是堆内存)的一种方式,它仍然无效。【参考方案2】:

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

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

还有其他更好的方法可以做到这一点,例如使用 Docker 或其他任何东西,但这将完成冒烟测试的工作。

我不建议尝试使用具有大量 RAM 的服务器,然后尝试在不使用虚拟机之类的东西的情况下“合成”低 RAM 情况(顺便说一句,Docker 在内部使用虚拟机)。

【讨论】:

以上是关于如何测试我的 java 应用程序是不是可以成功处理 Tomcat 服务器上的低内存/CPU 资源?的主要内容,如果未能解决你的问题,请参考以下文章

Android:Java:Proguard:如何:验证我的 jar(不同的 jar 项目)/apk 是不是已成功处理? (我正在考虑对其进行逆向工程)

如何测试数据库连接是不是成功关闭?

java 无法启动该应用程序,如何解决?

Java环境变量设置成功后运行cmd时提示错误 不是内部或外部命令,也不是可运行的程序或批处理文件

C++的fstream如何检查一个文件是不是成功打开?

如何确定使用 PHP cURL 发布 JSON 是不是成功?