第一章:性能测试基础
1.性能测试分类
中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试、应用在服务器端性能的测试。概括起来也就是:客户端、网络端、服务端
客户端就是压力机;当进行压力时需要监控客户端、网络端、服务端的数据。
第二章:性能测试方法
1.测试策略
l 负载测试
l 压力测试
l 疲劳强度测试
负载测试:主要指的是模拟系统在正常负载压力场景下,考察系统的性能指标。这里说的正常负载,主要是指预计系统最大应该支持多大用户的并发量。通过负载测试,目的是验证系统是否能满足预期的业务压力场景。
压力测试:在不断增加并发压力下系统的性能会变得不可接受,出现性能崩溃的情况,计算出这时的并发值。在加压策略上,压力测试会对被测系统逐步加压,在加压的过程中考察系统性能指标的走势情况,最终找出系统在出现性能拐点时的并发用户数,也就是系统支持的最大并发用户数。
疲劳强度测试:模拟出长时间系统能承受的最大业务负载量。差异在于前两者,疲劳强度测试更关注系统在长时间运行下性能指标的变化情况。例如,系统在运行一段时间后,是否会出现事务处理失败、响应时间增长、业务吞吐量降低、CPU/内存资源增长等问题。
第三章:性能指标
从维度上划分,性能指标主要分为两大类,分别是业务性能指标和系统资源性能指标
以下的性能指标是常用的指标,随着对性能要求的提升,需要观察其他更详细的数据,比如:其压力机和服务器的硬件也会影响性能
性能的最总目的:在保证一定的成功率、响应时间的前提下得到业务需要的最大并发数
1.业务性能指标
- 并发用户数
- 事务成功率
- 事务吞吐率(TPS/RPS)
- 事务平均响应时间
并发用户数:压力机模拟同时访问服务器的用户数。查看该指标目的:得到服务器最大并发用户数。
事务成功率:在性能测试周期内,成功的请求数占全部请求数的百分比。查看该目标目的:服务器正确处理事务能力。
事务吞吐率TPS:每秒服务器处理的事务数;该指标需要根据当前并发用户数、总响应时间去计算该值。查看该指标目的:服务器处理事务的能力。
事务平均响应时间:平均一条请求(事务)所用的时间。查看该目标目的:宏观查看服务器是否达到理想的并发数
提示:
平均响应时间与TPS是没有直接关系,具有宏观的反比关系,随着并发数提高并超过服务器处理能力,平均响应时间就会升高,TPS则会下降。
这里有一个例子帮助理解两者的区别:
https://www.cnblogs.com/baihuitestsoftware/articles/6405078.html
2.系统资源性能指标
- 压力机:CPU利用资源、处理器队列长度、内存利用率、磁盘IO状态、网卡带宽使用情况等;
- 服务器:CPU利用资源、处理器队列长度、内存利用率、磁盘IO状态、网卡带宽使用情况等;
- 数据库:数据库连接数、数据库读写响应时长、数据库读写吞吐量等;
- 网络:网络吞吐量、网络带宽、网络缓冲池大小;
- 缓存(Redis):静态资源缓存命中率、动态数据缓存命中率、缓存吞吐量等;
第四章:引入性能测试工具
性能测试的主要手段:模拟真实业务的压力对被测系统进行加压,并同时监控被测系统资源性能指标,研究被测系统在不用压力情况下的表现,找出其潜在的性能瓶颈。
如何对系统进行加压,又如何对系统的指标进行监控呢?这里,就需要引入性能测试工具了。
1.性能测试工具的基本组成
现在市面上有很多工具,不管使用哪一款工具,基本都会包含如下几个核心的功能:
- 压力生成器(Pressure Generator)
- 结果采集器(Outcome Collector)
- 负载资源监控器(Monitor)
- 结果分析器(Result Analyzer)
原理结构如下图所示:
压力发生器:来产生无限压力地方,相当于无数个测试人员
结果采集器:结果记录人员
负载控制器:对应的是指挥人员
资源监控器:对应的是若干资源监控人员,监控客户端、网络端、服务端
结果分析器:对应的是结果统计人员
压力发生器是性能测试工具最核心的部分,它主要有两个功能,一是真实模拟用户操作,二是模拟有效并发。
大多数性能测试工作人员可能都会忽略的是,当前市面上性能测试工具的压力发生器基本都是存在缺陷的。
模拟真实用户操作:浏览器在加载网页的时候,是同时并发多个TCP连接去请求页面对应的HTTP资源,包括HTML、JS、图片、CSS,当前流行的浏览器普遍会并发6-10个连接。然而,性能测试工具在模拟单个用户操作的时候,基本上都是单连接串行加载页面资源。产生的差异在于,假如页面有100个资源,每个HTTP请求的响应时间约为100毫秒,那么浏览器采用6个连接并行加载网页时大概会需要1.7秒(100/6*100毫秒),而测试工具采用单连接串行加载就需要10秒(100*100毫秒),两者结果相差十分巨大。这也解释了为什么有时候我们通过性能测试工具测试得到的响应时间挺长,但是手动用浏览器加载网页时感觉挺快的原因。
有效并发:有效并发就是我们在测试工具中设置了1000虚拟用户数,实际在服务器端就能产生1000并发压力。然而现实情况是,很多时候由于测试设备自身出现了性能瓶颈,压力发生器产生的并发压力远小于设定值,并且通常测试工具也不会将该问题暴露给测试人员;如果测试人员忽略了这个问题,以为测试得到的结果就是在设定并发压力下的结果,那么最终分析得出的结论也就跟实际情况大相径庭了。不过,我们可以通过保障测试环境不存在瓶颈,使得实际生成的并发压力尽可能地与设定值一致;另一方面,我们也可以通过在测试过程中监控Web层(例如Nginx)的连接数和请求数,查看实际达到服务器端的并发数是否跟我们的设定值一致,以此来反推压力发生器的压力是否有效。
了解这些缺陷的意义在于,我们可以更清楚测试工具的原理,从而更准确地理解测试结果的真实含义。
2.性能测试工具
目前市场上主要流行的是Loadrunner和jmeter,还有一款知名度很低的Locust等等,就这三种分析下优劣:
|
LoadRunner |
Jmeter |
Locust |
授权方式 |
商业收费 |
开源免费 |
开源免费 |
开发语言 |
C/Java |
Java |
Python |
测试脚本形式 |
C/Java |
GUI |
Python |
并发机制 |
进程/线程 |
线程 |
协程 |
单机并发能力 |
低 |
低 |
高 |
分布式压力 |
支持 |
支持 |
支持 |
资源监控 |
支持 |
不支持 |
不支持 |
报告与分析 |
完善 |
简单图表 |
简单图表 |
支持二次开发 |
不支持 |
支持 |
支持 |
通过对比,Locust也不怎么样嘛,资源监控也不支持,报告分析能力也这么弱,那为啥还要选择它?
授权方式这个就不说了。虽然LoadRunner是商业软件,价格极其昂贵,但是国内盗版横行,别说个人,就算是大型互联网公司,用正版的也没几个。
从功能特性的角度讲,LoadRunner是最全面的,用户群体也是最多的,相应的学习资料也最为丰富,不太熟悉性能测试可以先从LoadRunner熟悉性能测试工具各个模块的概念和功能,再过渡到其他工具。LoadRunner只能在Windows平台使用,并且并发效率比较低,单台压力机难以产生较高的并发能力。
Jmeter的并发是基于线程,并发效率存在同样的问题;另外,Jmeter在脚本编写和描述是基于GUI操作
Locust:
模拟用户:采用Python脚本描述,并且HTTP请求是基于Requests库,该库功能强大使用简单;除了HTPP(S)协议,Locust也可以测试其他任意协议的系统,只需要采用Python调用对应的库进行请求买书即可。
并发机制:采用协程(gevent)的机制。采用多线程模拟用户时,线程数会随着并发数的增加而增加,而线程之间的切换是需要占用资源的,IO的阻塞和线程的sleep会不可避免的导致并发效率下降。
协程和线程区别:协程避免了系统资源调度,由此大幅度提高了性能,单台普通配置的测试机可以生产数千并发压力,这是LoadRunner和Jmeter都无法实现的。
Locust功能单薄,特别是在性能指标监控和测试报告图表方面比较缺失,但是Locust的代码结构清晰,核心代码量也只有几百行,可扩展性不错,深入挖掘性能测试工具原理非常合适
3. 选择性能测试工具
根据上面,选择Locust工具来进行性能测试,性能测试重要的是监控性能数据,增加到持续集成会比较复杂,暂时先不考虑集成到Jenkins里
部署时间:1天
参考资料:
四年性能经验文章:http://debugtalk.com/post/locustplus-talk-about-performance-test/
百度百科【性能测试】:https://baike.baidu.com/item/性能测试