关注软件性能之压力负载[1] 性能测试工具
压力测试及为项目选择正确的工具所要考虑的因素
级别:初级
优化大师 Jack Shirazi 和 Kirk Pepperdine 分别是 JavaPerformanceTuning.com 的董事和首席技术官,他们从事全球 Internet 上的性能问题讨论。在 TheServerSide.com 留言板上最近提出了一些关于压力测试和负载测试的问题。Jack 和 Kirk 详细探讨了这一主题,并讨论了正确的工具如何导致结果产生巨大的差别。
TheServerSide.com 讨论板通常是相当活跃的,所以这个月我们驻步于此以了解在性能世界中发生了什么事情。讨论板的名字就是 TheServerSide,所以在这里讨论的性能集中于 J2EE 系统是很正常的。当然,这是一个相当广泛的题目,因为它包含了 Java 平台中的几乎所有内容——连 J2ME 系统常常也是 J2EE 系统的客户机,所以有时您甚至可以遇到关于优化 J2ME 系统的问题。
压力测试和负载测试
在性能列表中最常问的问题是:“是否有一种工具可以帮助我对 J2EE 应用程序进行压力测试?” 在回答这个问题之前,让我们问一问自己:压力测试是什么,为什么这些开发人员需要它?(我相信你们中相当一部分人曾经遇到一定要在昨天完成测试这种让您感到压力的情况,但是我们在这里说的不是这个)。压力测试是为了发现在什么条件下您的应用程序的性能会变得不可接受。这通过改变应用程序的输入以对应用程序施加越来越大的负载并测量在这些不同的输入时性能的改变来实现的。这种操作也称为负载测试,但是负载测试通常描述一种特定类型的压力测试——增加用户数量以对应用程序进行压力测试。
对应用程序进行压力测试最简单的方法是手工改变输入(客户机数量、需求大小、请求的频率、请求的混合程度,等等)并描绘性能的变化。对于一些应用程序,您需要做的就是这些。但是如果有许多输入,或者需要在大的范围内改变输入,那么就可能需要一个自动化的工具。另外,在手工测试中,如果想在进行一些改变后重新测试应用程序,可能很难精确地重复一组测试。如果是让多个用户测试您的应用程序,那么几乎不可能一致性地运行手工测试,除非您有很多失业的朋友,否则扩大测试应用程序的用户数量是非常困难的。
没有一刀切的方案 软件测试
不幸的是,没有一种通用的压力测试工具,因为每一个应用程序所接受的输入以及对它们进行处理的方式都是不同的。但是对于许多 J2EE 应用程序来说,从客户机到达服务器的通信使用的是 HTTP 协议。幸运的是,有许多负载测试工具可以以一种可控制和重复的方式模拟 HTTP 上的用户活动。它们包括免费工具如 Apache JMeter、The Grinder 以及 PushToText,和相当昂贵的工具如 Mercury Astraload。一般来说一分钱一分货——工具越贵,它能做的事情就越多。为了了解它们的差别,我们首先来看最基本的负载测试工具能做些什么。
如果您想构建自己的负载测试工具,那么您会首先编写一个对每一个模拟客户机运行一个线程的程序。每一个线程需要与服务器通信,可能使用 java.net.URL 类。这种方法使您得到基本的 HTTP 客户机模拟,它可以执行 GET 和 PUT。每个线程需要做的就是发送 HTTP 请求、收集回复、等待一些时间(模拟“考虑时间”),再重复。这一组行动可以相当容易地抽象到一个单独的配置文件中。很快,您就得到一个基本的负载测试工具。您可能需要增加一些配置选项以确定运行多少个线程(模拟的客户机)以及它们是同时开始还是慢慢增加负载。当然,您需要对与服务器的交互计时,因为这是您要测试的核心内容。
如果这么简单……
那么,对于处理扩展的交互(即一个请求取决于上一个请求的结果)如何呢?对于处理 cookies 如何呢?cookies 对于许多面向会话的 J2EE 系统是必不可少的。改变数据输入呢?如果 J2EE 应用程序客户机需要处理一些 javascript 以进入下一次通信呢?在收集了响应时间数据后,如何对它进行分析?其他类型的监视,如 CPU 时间、网络使用、堆大小、分页活动或者数据库活动呢?
像这样和其他的功能,如用于记录浏览器会话并将它们加入到测试脚本中的工具,是高端负载测试工具与基本工具的差别所在。如何为自己选择正确的工具呢?当然,这取决于您的需要、您的计划和您的预算。最重要的是,您需要使用可以正确地模拟您的应用程序要求的客户浏览器功能的工具。具备了基本功能后,可以考虑工具的生产率。一般来说,包含的分析工具越多,可以记录的性能数据类型越多,您可以达到的生产率就越高——您愿意付的钱也就越多。顶级的负载测试程序可以模拟多个浏览器,与大多数应用服务器集成,收集多个服务器主机的性能数据(包括操作系统、JVM 和数据库统计数字),生成可以在以后用高级的分析工具分析的数据集。另一方面,低端负载测试程序是免费的。在那些预算有限的日子里,“免费”的意义是不言自明的。
图 1 展示了免费的负载测试程序 Apache JMeter,它显示了一个自动记录的脚本。