如何测试我的 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 是不是已成功处理? (我正在考虑对其进行逆向工程)