前言
我们都知道性能测试是做自动化测试会比较常用到的,也是自动化测试人员必备的意向测试技能,所以今天呢,笔者打算和大家来唠唠性能测试相关的,主要是聊聊性能测试常见的指标,我在这里也不喜欢说废话我们直接开始吧。
性能测试最基本要考虑以下几点:
1、时间特性,主要指的是软件产品的事物响应时间(用户发出请求到收到应答的这段时间)
2、资源利用率,包括:cpu、内存、网络、硬盘、虚拟内存(如Java虚拟机)
3、服务器可靠性,指服务器能在相对高负载情况下持续的运行
4、可配置优化性,指服务器配置优化、业务逻辑优化、代码优化等
性能指标:
1、响应时间
响应时间是最能反应服务器性能的指标之一,也是用户最关心的业务体验。比如登录某个商城网站时,只消耗1s钟。在进行性能测试时,是通过对事务响应时间(Transaction Response Time)来分析服务器的响应速度。
(一般响应时间在3s内,用户会感觉比较满意。在3s~8s之间用户勉强能接受,大于8s用户就可能无法接受,从而刷新页面或者离开,仅供参考)
2、吞吐量
吞吐量表示单位时间内能够完成的事务数量,因此也被称为每秒事务数(Transaction Per Second),计算方式是完成的事务数除以时间。
3、服务器资源占用
服务器资源占是指在负载情况下,系统的资源利用率。资源占用越低,说明系统越优秀。例如,cpu的占用率、内存使用率、查询Cache命令率、磁盘I/O读写速率等。
CPU常用计数器:
计数器 | 计数器分析 |
%Processor Time | 如果该值持续超过95%,表明瓶颈是cpu。 |
Processor Queue Length | 指待处理队列中的线程数,如果在处理器队列中总是有两个以上的线程则通常表示处理器堵塞,处理器瓶颈会导致该值持续大于2。此外,跟踪计算机的服务器工作队列将显示当前长度的Server Work Queues\Queue Length,队列长度持续大于4则表示可能出现处理器拥塞。 |
%User Time | 表示消耗CPU的数据库操作,如排序、执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表连接、水平分割大表格等方法来降低该值。 |
%Privileged Time | 此计数器是特定时间的值,指(CPU内核时间)在特权模式下处理线程执行代码所花时间的百分比,如果该参数的值和“Physical Disk”参数值一直很高,则表明I/O有问题。可考虑更换磁盘系统。 |
%DPC Time | 网卡CPU的占用率,该值越低越好。如果这个值大于50%并且Processor:%Processor Time非常高,说明提供的网络已经受CPU影响无法饱和工作 |
内存常用计数器:
计数器 | 计数器分析 |
Available Mbytes | 可用物理内存数。如果Available Mbytes的值很小,则说明计算机上总的内存可能不足,或某程序没有释放内存。 |
Page/sec | 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放内存空间的页面数。一般如果Page/sec持续高于几百,那么应该进一步研究交换活动,有可能需要增加内存,以减少换页的需求。Page/sec的值很大,不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。 |
Page read/sec | 指页的硬故障,是Page/sec的子集,为了解析对内存的引用,必须读取页文件的次数。该数值越低越好,大于5时表示磁盘读而不是缓冲读。 |
Page Faults/sec | 指每秒钟软件页面失效的数目,而Page/sec只表明数据不能在指定内存中立即使用。 |
Cache Bytes | 文件系统缓存(File System Cache),默认情况下为50%的可用物理内存,如果怀疑有内存泄露,请监视Memory \Available Bytes、Process\working set 和Process\Handle Count,如果怀疑是内存的进程Process\Private Bytes\Process\Working set 和Process\Handle Count,如果怀疑是内核模式进程导致了泄露,则还应该监视Memory\pool Nonpaged Bytes、Memory\pool Nonpaged Allocs和Process(process_name)\Pool Nonpaged Bytes |
Pages/sec | 每秒钟检索的页数,该数字应少于每秒1页 |
Committed Bytes | 以字节表示的确认虚拟内存,确认内存磁盘页面文件上保留了空间的物理内存。每个物理磁盘上可以有一个或一个以上的页面文件。这个计数器只显示上一回观察到的值;它不是一个平均值。其实就是指有多少虚拟内存正在被使用,虚拟内存是占用硬盘空间的内存,和物理内存无关。 |
物理磁盘常用计数器:
计数器 | 计数器分析 |
%Disk Time | 指所选磁盘驱动器为读或写入请求提供服务所用时间的百分比。如果三个计数器都比较大,那么磁盘不是瓶颈。如果只有%Disk Time比较大,另外两个都比较适中,则硬盘可能会是瓶颈。若数值持续超过80%,则可能的内存泄露。 |
Avg.Disk Queue Length | 它指的是当前磁盘的队列长度。通俗点来解释就是:计数器反映的磁盘完成请求所用的时间,较高的值表明磁盘控制器由于失败而不断重试该磁盘。这些故障会增加平均磁盘传送时间。 |
Average Disk Read / Write Queue Length | 指读取(写入)请求(队列)的平均数 |
Disk Reads(Writes)/sec | 物理磁盘上每秒磁盘读/写的次数,两者相加,应小于磁盘设备最大容量 |
Average Disk sec/Read | 指以秒计算的在此盘上读取数据所需的平均时间 |
Average Disk sec/Transfer | 指以秒计算的在此盘上写入数据所需的平均时间。一般来说,该值小于15ms最佳,15~30ms为良好,30~60ms为可以接受,超过60ms则需要考虑更换磁盘或磁盘的RAID方式了 |
Bytes Total/sec | 发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽进行比较。 |
线程常用计数器:
计数器 | 计数器分析 |
Context Switch/sec | 如果决定要增加线程字节池的大小,应该同时监视实例化inetinfo 和dllhost 进程这两个计数器。增加线程可能会增加上下文切换次数,这样性能不会上升,反而会下降。如果多个实例的上、下文切换值非常高,就应该减小线程字节池。 |
进程常用计数器:
计数器 | 计数器分析 |
Process/ %Processor Time | 被处理器消耗的处理器时间数量。如果服务器专用于SQL Server,则可接受的最大上限是80%~85% |
Page Faults/sec | 将进程产生的页故障与系统产生的相比较,以判断这个进程对系统页故障产生的影响 |
Working set | 处理线程最近使用的内存页,反映了每个进程使用的内存的数量,如果服务器有足够的空闲内存,页就会被留在内存中,当自由内存少于一个特定的阈值时,页就会被消除内存。 |
Process/Private Bytes | 指进程所分配的无法与其他进程共享的当前字节数量,该计数器主要用来判断进程在性能测试过程中有无内存泄露。我们可以重点监控inetinfo进程的Private Bytes,如果在性能测试过程中,该进程Private Bytes计数器的值不断增加,或是性能测试停止后一段时间,该进程的Private Bytes仍然持续较高水平,则说明应用存在内存泄露。 |
服务缓冲常用计数器:
计数器 | 计数器分析 |
File Cache Hits | 文件缓存命中的具体值 |
File Cache Hits % | 全部缓存请求中,缓存命中次数所占的比例,反映了IIS的文件缓存设置的工作情况。对于一个大部分是静态网组成的网站,该值应该保持在80%左右。 |
File Cache Flushes | 自服务器启动之后文件缓存刷新的次数,如果刷新太慢,会浪费内存;如果刷新太快,缓存中的对象就会被频繁的丢弃再重新生成,起不到缓存的作用,通过将File Cache Hits除以File Cache Flushes 可以得出缓存命中率对缓存清空率的比率。通过观察这两个值,可以得到一个适当的刷新值 |
Connection Refused | 该数值越低越好,高数值表明网络适配器或处理器存在瓶颈。 |
网络常用计数器:
计数器 | 计数器分析 |
Bytes Total/sec | 发送和接收字节的速度,包括帧字符在内,判断网络连接速度是否为瓶颈,可以用该计数器的值和目前网络的带宽相除,结果应该小于50%。 |
Apache常用计数器:
计数器 | 计数器分析 |
Apache CPU Usage apache | 服务器CPU的占用率 |
Kbytes Sent/sec | 服务器每秒发送的字节数 |
Hits/sec | Apache 服务每秒的点击率 |
#Busy Workers | Apache 服务占用率 |
#Idle Workers | Apache 服务空闲率 |
Mysql 常用计数器:
计数器 | 计数器分析 |
Threads_connected | 表示当前有多少个客户连接该Mysql服务器,连接数是否过多,网络是否存在问题,它是动态变化的。当Threads_connected ==max_connections时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现报错信息。 |
Threads_running | 如果数据库超负荷了,将会得到一个正在(查询的语句持续)增长的数值。这个值也可以小于预先设定的值。这个值在很短的时间内超过限定值是没有问题的,如果超过预设值时且5s内没有回落,就要同时监视其他的一些值。 |
Aborted_clients | 客户端被异常中断的数值(因为连接到Mysql服务器的客户端没有正常地断开或关闭)。对于一些应用程序是没有影响的,但对于另一些应用程序可能要跟踪该值,因此异常中断连接可能表明一些应用程序有问题 |
Questions | 每秒获得的查询数量。也可以是全部查询的数量,可以根据输入不同的命令得到你想要的不同的值。 |
Handler_* | 如果想监视底层(low-level)数据库负载,这些值是值得去跟踪的。如果Handler_read_rnd_next值与正常值相差悬殊,可能是优化或索引出问题了,Handler_rollback表明事务被回滚的查询数量。 |
Opened_tables | 指表缓存没有命中的数量。如果该值很大,就需要增加table_cache的数值。 |
Select_full_join | 没有主键(key)联合(join)的执行,该值可能是零。这是捕获开发错误的好方法,因为这样的查询有可能降低系统的性能。 |
Select_scan | 执行全表搜索查询的数量,如果发现该值持续增长,说明需要优化,缺乏必要的索引或其他问题。 |
Select_queries | 超过该值(--long-query-time)的查询数量,或没有使用索引查询数量。对于全部查询会有小的冲突。如果该值增长,则表明系统有性能问题。 |
Threads_created | 该值一般较低。较高的值可能意味着需要增加thread_cache的数值,或遇到了持续增加的连接,表明存在潜在的问题。 |
Pending normal aio reads | 该值是innodb io 请求查询的大小(size)。如果该值超出了10~20的范围,可能存在一些瓶颈。 |
总结:
1、硬件上的性能瓶颈:
一般指的是CPU、内存、磁盘读写等的瓶颈,为服务器硬件瓶颈。
2、应用软件上的性能瓶颈:
一般指的是服务器操作系统瓶颈(参数配置)、数据库瓶颈(参数配置)、web服务器瓶颈(参数配置)、中间件瓶颈(参数配置)等
3、应用程序上的性能瓶颈:
一般指的是开发人员,开发出来的应用程序(如sql语句、数据库设计、业务逻辑、算法等)。
4、操作系统上的性能瓶颈:
一般指的是Windows、linux等操作系统,如出现物理内存不足时,或虚拟内存设置不合理(虚拟内存设置不合理,会导致虚拟内存的交换率大大降低,从而导致行为的响应时间大大增加,可以认为在操作系统上出现了性能瓶颈)。
5、网络设备上的性能瓶颈:
一般指的是防火墙、动态负载均衡器、交换机等设备。
性能瓶颈原因定位十分复杂,需抽丝剥茧逐一排除,以上信息仅供参考。