Java EE应用程序的性能/压力测试

12

仅使用单元测试很难找出Java应用程序中的所有瓶颈、死锁和内存泄漏。

我想为我的应用程序添加一些压力测试。我想测试应用程序的极限并确定在高负载下其反应如何。

我想衡量以下内容:

  • 在高负载下的可用性
  • 在高负载下的性能
  • 在高负载下的内存/CPU/磁盘使用情况
  • 在高负载下是否崩溃或优雅地反应

还有,测量和对比正常负载下的这些特征也会很有趣。

是否有公认的标准技术来解决压力测试问题。 我希望得到关于如何设置这样一个环境的帮助/指导。 理想情况下,我想定期运行这些测试,以便确定最近的交付是否影响了性能。


2
我会推荐使用Apache JMeter http://jmeter.apache.org/ 作为网页应用程序的优秀压力测试工具。它易于使用,也可以进行扩展。 - Rami
1
我也发现了 Gatling (http://gatling.io) 是一个非常优秀的工具。 - cmd
5个回答

6
我是JMeter的忠实粉丝。你可以像用户一样直接对服务器进行调用。您可以控制用户数量(并发线程)和访问次数。它可以遵循工作流程,从一个页面到另一个页面抓取相关信息。学会它足以提高效率需要1到2天时间。(下载后一个小时内就可以完成基本操作!)
至于如何查看所有这些对服务器的影响,这是一个更棘手的问题。我使用过CA和IBM的专业工具。(我无法想起特定的工具名称-可能是由于创伤后应激障碍!)我使用了开箱即用的JVM分析器。我使用过本机Linux和Windows工具。如果您不太关心分析应用程序的哪些部分会导致问题,那么您可以使用操作系统的本机工具来监视CPU /内存/ IO。

关于“在正常负载下测量和对比这些特征也是很有趣的。”我邀请您查看Metrics:http://metrics.dropwizard.io/3.1.0/。 - corlaez

1

应用程序的性能主要有两种方法:

性能测试和系统测试

它们有什么不同?很简单,它们基于其范围,性能测试的范围有限且高度不现实。例如:测试某个应用程序X上的IncomingMessage处理程序,您将设置一个测试,该测试以X、Y、Z为基础向此处理程序发送消息。这种方法将帮助您确定问题并测量应用程序中个别和有限区域的性能。

那么现在应该问的问题是,我是否需要逐个基准测试和性能测试我的应用程序中的每个组件?如果您认为组件的行为至关重要,并且新版本的更改可能会导致性能损失,则是。但是,如果您想全面了解应用程序,包括相互交互的组件的整体表现,并查看性能如何,那么您需要进行系统测试。

系统测试将始终尽可能地复制任何客户生产环境。在这里,您可以观察到应用程序性能的真实感受,并根据情况进行更正。

因此,总之,在您的应用程序上设置系统测试并测量您想要测量的内容。然后对整个系统进行压力测试,看看它的反应,您会对结果感到惊讶。

最后,对于您已经确定或想要跟踪的任何关键组件,请单独进行性能测试。

通常情况下,在进行性能测试时,您应该始终遵循以下准则: 1.- 获取系统空闲状态的基线。 2.- 获取系统在正常预期负载下的基线。 3.- 获取系统在压力条件下的基线。

请记住,正常负载结果应该被推广到压力条件下,并且良好的系统总是可以实现线性扩展的。

希望这有所帮助。

P.S. 测试、环境设置甚至数据收集都应尽可能地自动化,这将帮助您定期运行测试并花费时间诊断性能问题而不是设置测试。


1

0

正如其他人所提到的,像JMeter(商业工具如LoadRunner等)这样的工具可以帮助您生成并发测试负载。 许多监控工具(一些在JDK中提供,如MissionControl,一些其他开源/免费工具如java Melody和许多商业工具)可以帮助您进行各种系统(内存、CPU、网络带宽)和JVM资源(堆、CPU、GC开销等)的通用监控。
但是,为了真正快速轻松地识别代码中的瓶颈以及应用程序的其他依赖项(例如调用的外部服务、DB查询/更新等),我建议考虑使用良好的APM即应用程序性能监控工具,如AppDynamics / DynaTrace等。它们可以帮助您针对特定请求级别确定瓶颈,突出应用程序的较慢部分,在单个服务端点或组件/方法级别生成百分位数指标等。如果处理非常高的并发用户和严格的响应时间NFR,则它们可以非常有用。它们有助于揭示应用程序各层面上的许多瓶颈。许多人甚至在生产中配置这些工具(预计会导致2-3%的开销;但根据我的经验,这是值得的,因为它们提供了很多好处)-因为生产日志默认情况下不是调试级别;因此,一旦观察到某些错误或缓慢,通常很难在较低的环境中重现或在特定过去的时间段内没有调试级别日志的情况下进行调试。


0

据我所知,目前没有一种工具可以解决这个问题。因此,建立自己的环境。

  • 负载注入和脚本:JMeter、SOAP UI、LoadUI
  • 测试调度和自动化:Jenkins、Rundeck
  • 交易数据、资源、应用程序性能日志分析:AppDynamics、ElasticSearch、Splunk
  • 分析:AppDynamics、YouKit、Java Mission Control、VisualVm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接