本文摘自《软件测试实践》 周伟明著
1.1 常用软件性能指标
时间效率、空间效率、事务操作性能、IO性能、数据库性能、内存性能、初始化/退出时间、资源利用率等。
-
事务处理时间:指软件中完成一项事物所需的运行时间。一般主要用来评价事务处理的效率,通常事务处理时间越短,则效率越高。属于时间效率的范畴。
-
最大的事务处理时间:服务器软件中,最大事务处理时间是一个很重要的性能指标,因为如果某项事务处理时间过多的话,将很容易受到DOS型的攻击。要测试最大事务处理时间需要先分析一下哪些事务耗时比较多,然后再将这些事务所花费的时间分别测试出来,花费时间最多的就是最大的事务处理时间。
-
事务操作时间:主要用来评价需要用户进行操作的事务处理需要花费的时间,主要体现了用户操作方面的效率。测试事务操作时间时,需要一个好的计时器(如秒表之类的东西),需要多测试几次,最好测试多个不同的人花费的时间,最后取平均值即可。
-
IO性能:本文指物理磁盘的IO性能,衡量IO性能的主要指标是单位时间内的读写数据数量,比如磁盘每秒钟读取的数据字节数、每秒写入的数据字节数。硬盘发展速度没有赶上CPU的发展速度,所以,如果一个软件需要操作磁盘的话,最好测试一下IO方面的性能。
程序的实现对IO性能也有很大影响,比如写一个文件,多次写入小块数据就不如一次写入一大块数据高效。
当然IO不局限于磁盘IO,网络IO和其他硬件设备IO都属于IO的范畴,如果程序使用了某个IO的通道,那么就需要做一下这方面的IO性能测试。
IO测试可以在白盒测试时设计专门的测试用例进行测试,也可以在黑盒测试时做,黑盒测试由于操作上要花时间,存在误差,所以不如百合测试准确。
-
数据库性能:一般包括查询、插入、删除、更新数据库数据等所花费的时间。需要使用数据库的软件中,数据库性能往往容易成为软件中的性能瓶颈。提高数据库性能能通常通过规范数据表以减少相互依赖或者通过增加数据库服务器的数量来解决。
数据库性能测试也可以采用百合测试的方法来进行。
-
空间利用率:是指有效数据占用的空间和整个是用的空间的比例。比如,定义了一个字符数组大小为1024字节,但是程序中只拷贝了一个“Hello!”字符串到数组里,那么有效数据占用的内存为7字节,而实际使用的内存空间却有1024字节。在这种情况下空间利用率就是7/1024。
空间利用率可以用以下公式来计算:空间利用率=实际使用的空间/占用的总空间
测试空间利用率比较困难,一般只能在白盒测试时有针对性地编写专用的测试代码进行统计。比如内存管理中,可以使用HOOK技术来记录总共分配了多少块内存,再将每块内存的实际使用大小保存起来,在计算每块内存的分配尺寸,最后根据上述公式计算实际使用的大小总数和分配大小的总数就可以得出空间利用率。
-
最大消耗的内存量:指软件在运行过程中需要消耗的最大内存数量(单位:kb),这个指标标示着应该配置什么级别的硬件才能运行软件,是硬件成本的直接反映。
要测试最大消耗的内存量,可以通过性能监视器来进行,不过最好的方法是自己编写一个内存监测工具,先让工具记录下初始系统剩余内存大小,然后运行软件,通过监测工具自动记录系统剩余内存大小,由工具计算出整个系统过程中系统最小的剩余内存,用把初始系统剩余内存减去最小的系统剩余内存就得到了最大的内存消耗量。
-
高峰内存时间:是指软件在高峰内存消耗时期所运行的时间。如果软件在高峰期使用的内存和系统的总内存比较接近的话,软件的效率将会大大降低。作者在《多任务下的数据结构与算法》一书中讲述了动态等尺寸内存管理算法,当到了内存使用高峰期后,如果释放掉很多使用过的内存,占用系统的内存也会跟着释放一部分,对于缩减软件的高峰内存时间有很好的帮助。
-
初始化/退出时间:初始化时间是指软件初始化所花费的时间,比如,对于客户端软件,就是在从运行开始直到用户可以操作的时间。服务器软件是指从运行开始到服务器可以开始处理客户端的服务请求的时间。
退出时间包括软件正常结束情况下的退出和非正常结束情况下的退出所花费的时间。
衡量退出性能主要有两个指标,一个事能不能在任何情况下退出,另一个是退出花费的时间是多少。
不论在正常结束还是非正常结束的情况下,软件都应该以较快的速度退出。
现在软件一般都采用多任务架构的,当有任务在运行时,需要等待正在操作的任务结束后才能退出。在《多任务下的数据结构与算法》一书中讲述了一个多任务下的退出算法,采用此算法可以让软件很快退出而不需要等待很长的时间。
-
CPU 利用率:CPU利用率属于资源利用率的一种,对于单核CPU系统来说:
CPU利用率=总时间-CPU空闲时间/程序运行总时间
对于多核或多CPU机器来说,要分别统计每个CPU的利用率,再计算平均值。在Windows操作系统上可以通过性能监视器来观察每一个CPU的利用率曲线。
CPU利用率对不同的软件意义不同,在分时系统中,客户端软件一般要求CPU利用率不能太高,必须留一些CPU给其他应用程序使用。而在服务器软件中,一般要求CPU利用率要高一些,否则会造成其他硬件资源浪费。
1.2 网络性能
主要包括最大并发连接数量、请求响应时间、吞吐率、吞吐量和处理能力等。
-
并发连接数量:并发连接数量是指同时连接到服务器上的最大连接数量,这个性能指标用来衡量最高峰时服务器可以同时响应多少客户端的连接。这个并发连接数量不是服务器中正在运行的处理客户端请求的数量,而是网络连接的数量,指的是和服务器建立了连接的客户端总数量。
-
请求响应时间:指从客户端发出请求开始到收到服务器最后一个数据包花费的时间。请求响应时间反映出客户收到完整数据钱需要等待的时间。
请求响应时间在不同的负载和网络情况下是不同的,在高峰时期,请求响应时间可能会大大增加,而空闲时间里的请求响应时间一般会小很多。要测试出请求响应时间需要在不同的网络情况和不同负载的情况下进行测试。
-
吞吐率(throughoutput):指单位时间内网络上传输的数据量,这个传输的数据量的单位在不同场合有不同的指标,可以是访问次数,也可以是页面数,还可以是字节数。
吞吐率反映出软件的网络数据传送能力,可用于帮助选择硬件配置和网络带宽配置。
吞吐能力可以通过压力测试来得出。
-
处理能力(TPS):系统每秒钟能够处理完的客户端请求数量,比如一个HTTP服务器每秒钟能够处理完多少个客户端的网页请求。
处理能力如果提升20%的话,那么将可以节约20%的硬件成本,并且由于处理能力提升,实际上每个用户的响应时间减少了,还可以增加用户的满意度。
处理能力的测试同样需要通过压力测试来得出。
-
网络带宽利用率:指用于传输数据的带宽和网络总带宽的比值。比如一个100Mbps的网络,如果服务器每秒只能传输10M字节,那么服务器用到的带宽为80Mbps
网络带宽利用率的测试同样需要通过压力测试来得出。
-
净荷率:指传输的有效数据和传输的数据总量的比值,有效数据是指不包括网络协议报头等附加信息的报文数据,一般来说传输的小数据包越多,则有效数据占的比例就越小,净荷率就越低。
净荷率可以通过网络抓包软件来进行,通过分析捕获的报文,很容易得到数据的净荷率,注意,需要捕获大量样本数据然后取平均值。
-
误码率:指传送的报文中,出错的报文字节数占整个传输数据字节数的比例。误码率一般较多地用于电信等底层系统中,但是对于上层应用软件来说,如果使用了UDP之类的不可靠通信的话,也存在误码率的问题,需要进行测试。
误码率必须在真实的网络环境或Internet中进行,并且需要在网络通信高峰期进行测试,一般来说每天早上刚上班的时候都是高峰时期,晚上7~9点也是Internet的通信高峰期。可以在一天内的各段时间内都进行测试,不能只测试一天,需要测试一段时间。
误码率测试的通信双方最好选择多个不同的物理位置进行,客户端可以选择不同的城市,特别使一些小城市或农村地区也要进行测试。通信双方间的路由长度要足够长。
-
往返次数:往返次数是指完成意见任务所需要的往返请求/响应次数。比如一个普通的HTTP获取网页操作,客户端需发送一次请求,服务器进行一次响应就将网页内容全部返回给客户端。而E-mail客户端则需要经过好几次请求/响应才能将邮件发送出去。
往返次数测试可以用一些抓包软件来进行,例如SnifferPro, NetXRay等软件都可以截获网络数据报文,通过统计收发的报文情况就可以得到往返次数。
-
事务数据流:指处理一件事务时所需要的网络数据流量,这个指标可以反映出网络通信数据的效率,应用中应在合理范围内使用尽可能少的数据流来达到工作的目的。当然数据流也不能太少,因为如果数据流太少的话可能会影响安全性等其他性能。
事务数据流也很容易使用网络抓包软件分析出来。
1.3 多任务性能
-
多CPU效率
主要是统计多核或多CPU系统下系统的性能,多核中的每个内核的效率等同于同级别单核CPU的效率。可采用白盒的方法进行测试,测出准确的时间。
多CPU效率=同级别单核上执行的时间/(多(核)CPU执行花费时间*CPU数量)
-
同时运行事务数量
可以使用性能监视工具来进行,在运行过程中来观察运行的线程或进程数量。
-
任务优先级
特别是抢占式任务调度算法的系统中,高优先级的任务会抢占绝大部分的CPU时间。高优先级任务运行时间越长,对软件运行的影响越大。
对客户端软件来说,有高优先级任务运行时,用户无法操作软件。与易用性有很大影响。
对服务器软件来说,服务端可能无法响应客户端请求,那么客户端基本都会长时间处于等待状态,严重影响用户使用。
-
任务死亡率
单位时间内死掉或异常退出的任务个数,一般以天为单位来计算。
1.4 可靠性与可用性
1. 服务器软件上的常见可靠性技术
-
双机备份方面的技术
-
StandBy机制
Sun公司的Solaris等商业Unix系统中一般都使用这种技术,主要是采用两台机器,一台机器为活动运行状态,另外一台机处于备份的飞活动状态,如果活动状态的机器出现故障,则备份机器转为活动状态而活动机器变为备份机器。这种方案缺点是硬件成本较高。
-
心跳技术
在Linux上广泛使用的技术,这种技术原理是两台机器同时工作,但如果一台机器出现故障,另一台机器就接替故障机器的IP地址。这种方案缺点是出现故障后,机器承受双倍的负载,如果正赶上高峰期的话,对性能有很大影响。
-
单机内的可靠性技术
-
进程切换技术,Apache中就采用了进程切换技术来实现。
-
线程异常恢复技术
线程出现异常时,线程退出后通常由该线程占用的许多资源都无法正常释放,会严重影响软件的可用性。所以当线程出现异常后,需要找到方法使得线程的占用资源被释放,Apache中就采用了longjmp,setjmp等函数,当线程出现异常后自动跳转到线程开始的地方来退出,这样线程的栈等资源就不会产生泄露了。
2. 可靠度
指规定时间内无失效情况发生的概率。
3. 失效时间
单位时间内(通常一年)的软件无法完成任务的失效中时间。
失效时间=一年中的故障次数*一年中的平均恢复时间
可以通过压力测试来估算失效时间,比如进行一天24小时的压力测试,系统崩溃了2次,每次恢复需耗时一分钟,那么如果估算出实际情况下1个月的访问量才能达到24小时压力测试的负载强度,那么一年中失效时间为12*2*1=24分钟。由于实际情况复杂,压力测试时不可能模拟出实际情况中的所有场景,因此对估算结果还应乘以一个放大系数。
4. 最小失效间隔时间
失效间隔时间是软件运行起来到失效时花费时间或两次失效间的运行时间。最小失效间隔时间就是软件运行后最少可以运行多久。
可用性的重要指标就是用软件能连续运行的时间来衡量的,对于服务器软件,可用性是一个非常重要的指标。
5. 平均恢复时间和最大恢复时间
最大的单次不可用时间就是最大恢复时间。
6. 拓机次数
是指程序运行出现异常后,必须重新启动机器来运行的情况。属于一种严重的失效情况。包括以下两种情况:
-
程序运行出现的异常直接导致死机,必须重启机器才能运行。
-
程序异常后未死机但机器内已经收到严重影响,如有很多未回收的资源等。此时也需要重新启动机器。
拓机次数是指单位时间内的拓机次数,比如一个月拓机多少次,或者一年拓机多少次等。可以在真实环境测试,也可通过压力测试来估算。
1.5 易用性
用来评价软件易操作程度。在易用性中,界面的操作性是很大的一部分内容,界面操作性指标主要有:
-
鼠标点击次数-越少越好
-
鼠标移动距离-越短越好
-
击键次数-越少越好
-
操作失误率
-
操作等待时间
-
界面美观度
-
链接率
1.6 易学性
-
界面标准程度
-
记忆信息量
-
提示准确度
-
知识难易程度
-
过程清晰度
-
学习时间
1.7 负载均衡性能
1.7.1 常见的负载
-
机器间的计算负载均衡
常见的技术有DNS Round Robin技术、Web重定向技术和IP四层交换技术等,分布式处理环境DCE也可以实现计算机间的计算负载均衡。
可以观察各台机器间的CPU使用情况,记录各个时间段的每台机器的CPU使用率,得到各台机器的CPU使用率曲线,从而可以分析出各台机器间的负载均衡情况。
-
多CPU上的负载均衡
同一台机器上有多个CPU或是多核CPU时,需要将负载均衡地分布到各个CPU上才能最大发挥多个CPU或多核CPU的优势。
可以通过性能检测器来观察多个CPU的使用情况。
-
存储的负载均衡
Google的分布式存储策略就很好地实现了负载均衡,当增加了数据时他只要增加一些普通的PC Server就能进行处理,使得硬件成本大大降低。
-
网络数据流的负载均衡
网络环境中,有许多应用需要网络上多条路径同时传输数据。最典型的就是P2P应用,比如BITTORRENT和Emule等软件就是著名的P2P下载软件。当有多个P2P客户端下载某个文件时,各个客户端相互要传输数据,使得网络数据流负载分布到不同的网络路径上,从而大大提高下载速率。
1.7.2 负载均匀度
1.7.3 负载效率
计算负载效率=单机完成相同人物的时间*机器数量/多机完成任务总时间
存储负载效率=单机上存储数据所需的理论空间/多级存储相同数据耗费的总空间