引言

在做学习性能测试之前,有必要先了解一些性能测试的理论基础知识,为后期的性能测试做准备。需要了解什么是软件性能,性能测试需要关注的内容;了解在性能测试过程中常用的相关术语以及性能测试过程中需要关注的指标;了解性能测试的划分和应用领域,这样可以更好的确定需要进行那些性能测试。

性能测试相关术语

了解了什么叫系统性能之后,需要对性能测试过程中常用的术语有一个详细的了解,为后面的性能测试做准备。下面介绍性能测试过程中的一些常用术语,性能测试过程中的常用术语有:响应时间、并发用户数、事务响应时间、吞吐量、吞吐率、TPS(每秒事务响应数)、性能计数器等。

响应时间

响应时间是指应用系统从发出请求开始到客户端接收到所有数据所消耗的时间。该定义强调所有数据都已经被呈现到客户端所花费的时间,为什么说是所有数据呢?因为用户体验的响应时间带有主观性,用户认为从提交请求到服务器开始返回数据到客户端的这一段时间为响应时间。以一个Web应用的页面响应时间为例,从客户端发送请求到服务处理完成的整个过程如图1-3所示。从图中可以看到,页面的响应时间可分解为“网络传输时间”(N1+N2+N3+N4)和“应用服务器处理的时间”为(A1+A3),“数据库处理的时间”为(A2),所以整个Web页面请求的响应时间为(N1+N2+N3+N4+A1+A2+A3)。

并发数用户数

并发用户数是指同一时刻与服务器进行数据交互的所有用户数量。概念中有两点需要注意。第一:同一时刻,因为并发强调的是用户同时对服务器进行施压。例如:一个人同时挑两件东西,这时表示两件东西同时被这个人挑起来,而如果是先挑一件,再挑另外一件,那么就无法表现出同时的概念,这两件东西也就没有同时施压在这个人身上。第二:强调要与服务器进行数据交互,如果未和服务器进行数据的交互,这样的用户是没给服务器带来压力的。同样是上面的例子,这个人虽然同时挑了两件东西,但其中有一件东西是没重量的,那就是说只有一件东西对这个人造成压力。
因此对于并发用户这个概念的理解经常会出现以下两种误区:一是认为系统所有的用户都叫并发用户;二是认为所有在线的用户都是并发用户。在线用户不一定是并发用户,原因是在线用户不一定就与系统进行了数据的交互,例如:如果一些在线用户只是查看系统上的一些消息,那么这些在线用户不能作为并发用户计算,因为这些用户并没有与系统进行数据交互,不会给服务器带来任何压力。
那么并发用户数如何计算呢?目前并没有一个精确的计算公式,很多情况下都是根据以往的经验进行估算。根据行业的不同,并发用户数也会有所不同,像电信行业并发用户数为在线用户的万分之一,如果有1000万在线用户,那么需要测试1000个并发用户即可。OA(办公自动化)系统的并发用户数一般是在线用户的5%~20%左右,所以并发用户数很大程度上是根据经验和行业的一些标准来计算的。
一般情况下我们可以参考以下方法来确定性能测试时的并发用户数:
1.参考其它同类产品。
如果不知道测试过程中需要测试多少并发用户数,那么可以分析市场上同类产品测试的情况,参考其测试的并发用户。
2.分析历史数据
如果有历史数据,可以分析后台统计到的历史数据,分析一年或半年的交易量,可以得到服务器每天需要处理的业务数量,进而可以确定系统需要支持的并发用户数。
3.试上线运行
如果没有同类产品可以参考,那么试上线运行也是一种方法,如火车票官方订票系统,这类系统就没有可参考的对象,这样可以通过试上线运行的方法来大体了解终端用户提交业务的情况,进而确定系统每秒钟需要处理多少笔业务或HTTP请求数。

吞吐量

在性能测试过程中,吞吐量是指单位时间内服务器处理的字节数,吞吐量的单位为字节/秒,吞吐量的大小直接体现服务器的承载能力。
吞吐量作为性能测试过程中主要关注的指标之一,它与虚拟用户数之间存在一定的联系,当系统没有遇到性能瓶颈时,可以采用下面这个公式来计算。
其中,F表示吞吐量;Nvu表示VU(VirtualUser,虚拟用户数)的个数;R表示在T时间内每个VU(虚拟用户数)发出的请求字节数;T表示性能测试所用的时间。但是如果系统遇到性能瓶颈,这个公式就不再适用。吞吐量与VU之间的关联图如图1-4所示。从图中可以看出,吞吐量在VU增长到一定数量时,软件系统出现性能瓶颈,此时,吞吐量的值并不会随着VU数量的增加而增大,而是趋于平衡。

但在实际测试过程中,测试前吞吐量是不知道的,必须通过不断添加虚拟用户来不断的测试,才能找到吞吐量的捌点,也即服务器吞吐量的最大值。
实例:假设向一个水池注水,每根小管注入的水量为0.1立方米每秒,而水池的出水量为1立方每秒(假设这个值在测试之前是不知道)

当只放一根注水管时,水池的流出的水量为0.1立方米每秒,也即当前水池的吞吐量为0.1立方米每秒,依此类推当放入10根注水管时,水池的流出的水量为1立方米每秒,当放入11(或大于10根)根注水管时,水池的流出的水量也为1立方米每秒,此时水池都会开始积水,因为每秒排出的水比注入的水少,这说明水池的吞吐量为1立方米每秒,不管注入的水量为多少,这个值都不再改变。服务器也是一样的,客户端不断的请求,当服务器能正确的处理时,测试出来服务器的吞吐量就会不断的增加的,但当服务器无法处理时,吞吐量的值就不再变化,此时即找到服务器最大吞吐量的值。

吞吐率

吞吐率(Throughout)是指单位时间内从服务器返回的字节数,也可以指单位时间内服务器处理客户提交的请求数。它是衡量网络性能的一个重要指标。吞吐率=吞吐量/测试时间,通常情况下吞吐量的值越大,吞吐率的值也越大,吞吐率的值越大系统的负载能力越强。
TPS
TPS(TransactionPerSecond)表示服务器每秒处理的事务数,它是衡量系统处理能力的重要指标。如果每个事务对应的为一笔业务,那么TPS即表示服务器处理每秒钟的业务笔数,处理业务数的值越大说明服务器的处理能力越强,如银行业务,一些银行业务在性能测试时使用的是WindowsSockets的协议,这样每个事务其对应的就为一笔业务。
点击率
点击率(HitPerSecond)是指每秒钟用户向服务器提交的HTTP数量。用户每点击一次,服务器端就要对用户提交的请求进行一次处理,从事务的角度来说,如果把每次点击作为一次提交事务来对待,那么点击率与TPS的概念是等同的。对于Web系统来说,“点击率”是服务器处理的最小单位,点击率的值越大,说明服务器端所需要承受的压力越大(如果服务器正确的处理客户端的请求)。因此通常情况下,Web服务器都具有防刷新的机制,因为客户每刷新一次系统就要响应一次点击,如果不对服务器进行防刷新处理,当用户不停地点击刷新按钮,此时服务器将承受巨大的压力。
需要注意的是,点击一次并不代表客户端只向服务器端发送一个HTTP请求,客户每点击一次,都会向服务器端发出多个HTTP请求,并且点击率仅仅反应的是客户端提交的请求数,不能表现服务器端当前承受的压力,因为客户端提交的请求,服务器不一定会全部处理,有可能出现服务器拒绝客户端请求的情况,所以点击率不能直接反应服务器处理请求的能力。

资源利用率

资源利用率是指服务器系统中不同硬件资源被使用的程度,资源使用率=资源实际使用量/总的可用资源量。主要包括CPU利用率、内存利用率、磁盘利用率、网络等。资源利用率是分析系统性能指标进而改善性能的主要依据,在配置调优测试的过程中,通过比较配置调优前后系统资源的利用率来判断调优的效果。
性能计数器
性能计数器(Counter)是描述服务器或操作系统性能的一些数据指标。主要是通过添加计数器来观察系统资源的使用情况。性能计数器包括操作系统性能计数器、数据库计数器、应用服务器计数器等。
计数器在性能测试过程中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性和对性能瓶颈进行定位时,计数器的阈值起着非常重要的作用。必须注意的是,一般情况下,单一的性能计数器只能体现系统性能的某一个方面,在性能测试过程中分析测试结果时,必须基于多个不同的计数器进行分析。
在性能测试中常用资源利用率进行横向对比。如在进行性能测试时发现,某个资源的使用率很高,几乎达到100%,假设该资源是CPU,而其他资源的使用率又比较低,这时可以很清楚地知道,CPU是系统性能的瓶颈。

思考时间

思考时间(ThinkTime),也称为“休眠时间”,是指用户在进行操作时,每个请求之间的时间间隔。对于交互系统来说,用户不可能持续不断地发出请求,一般情况下,用户在向服务器端发送一个请求后,会等待一段时间再发送下一个请求,在性能测试过程中使用思考时间来描述这段时间。
在测试脚本中,思考时间为脚本中两条请求语句之间的间隔时间,如以下代码,其思考时间为5秒。
web_url("mer_login.gif",
"URL=http://localhost:1080/WebTours/images/mer_login.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://localhost:1080/WebTours/nav.pl?in=home",
"Snapshot=t9.inf",
LAST);
web_concurrent_end(NULL);
lr_think_time(5);
web_submit_data("login.pl",
"Action=http://localhost:1080/WebTours/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://localhost:1080/WebTours/nav.pl?in=home",
"Snapshot=t10.inf",
"Mode=HTTP",
ITEMDATA,
"Name=userSession","Value={CSRule_1_UID2}",ENDITEM,
"Name=username","Value=test11",ENDITEM,
"Name=password","Value=1",ENDITEM,
"Name=JSFormSubmit","Value=on",ENDITEM,
"Name=login.x","Value=43",ENDITEM,
"Name=login.y","Value=15",ENDITEM,
LAST);
当前对于不同的性能测试工具提供了不同的函数来实现思考时间,LoadRunner工具使用的思考时间函数为lr_think_time(),在实际的测试过程中,如何设置思考时间是性能测试工程师要关心的问题,因为设置不同的思考时间策略,在单位时间内提交的请求数就不一致,服务器的压力也不一样,具体的思考时间如何设置与当前采集的性能测试策略有关,如果是负载测试则可以直接忽略思考时间,如果是压力或可靠性测试则可以根据实际情况,设置一个思考时间,一般思考时间设置为3-5秒。