本章学习目标:
- 了解应用性能问题分析方法论;
- 掌握压力测试基础概念;
- 掌握压力测试:线程组配置,结果分析,插件使用;
- 理解性能关键的指标;
性能问题分析方法论
首先我们需要知道性能优化的终极目标是什么?
- 用户体验 = 产品设计(非技术)+系统性能,也就是响应快;
- 那么快是多久呢?3秒,不可以更久了!
接下来我们需要了解怎么才能让系统快起来
- 前端工程师:首屏时间,白屏时间,可交互时间,完全加载时间;
- 移动端工程师:端到端响应时间,Crash率,内存使用率,FPS;
- 后端工程师:RT,TPS,并发数。
而作为后端工程师的我们,主要是观察后端性能调优方面:
- 影响因素1:数据库读写。RPC,网络IO。逻辑计算复杂度,缓存;
- 影响因素2:JVM。
什么是压力测试?
什么压力测试?
- 压力测试:是针对特定系统或者组件,为确认其稳定性而特意进行的严格测试。会让系统在超时正常使用条件下运作,然后再确认其结果;
- 所白了就是对系统不断施加压力,来预估系统负载能力的一种测试。
为什么需要对系统进行压力测试?
- 一般而言,只有在系统基础功能测试验证完成,系统趋于稳定情况下,才会进行压力测试。
压测的目的是什么?
- 当负载逐渐增加时,观察系统各项性能指标的变化情况是否有异常;
- 发现系统的性能短板,进行针对性的性能优化;
- 判断系统在高并发情况下是否会报错,进程是否会挂掉;
- 测试在系统某个方面达到瓶颈时,粗略估计系统性能上限。
压力测试的指标有哪些?
指标 | 含义 |
响应时间(RT) | 是指系统对请求作出响应的平均时间,对于单用户的系统,响应时间可以很好地度量系统的性能。 |
吞吐量(Throughput) | 是指系统在单位时间内处理请求的数量,每秒事务数TPS也算是吞吐量的一种。 |
资源利用率 | CPU占用率,内存使用率,系统负载,网络IO。 |
并发用户数 | 是指系统可以同时承载的正常使用系统功能的用户的数量,用户不同的使用模式会导致不同用户在单位时间发出不同数量的请求。 |
错误率 | 失败请求占比,在测试时添加响应断言,验证不通过记为错误;若不添加,响应码非200即为错误。 |
评判系统性能,主要考虑三个性能指标(RT,TPS,资源利用率)。
我们需要知道其中的一些指标:
- 两个点:最优用户并发数,最大并发用户数;
- 三条线:RT,Throughput,资源利用率;
- 三个区:轻负载,重负载,塌陷区;
- 三种状态:资源饱和,吞吐量下降,用户受影响。
压力测试介绍
首先我们需要知道市场上主流的压力测试工具有哪些?
- Apache JMeter 可视化的测试工具
- LoadRunner 预测系统行为和性能的负载测试工具
- Apache 的 ab 压力测试
- nGrinder 韩国研发一款性能测试工具
- PAS 阿里测试工具等等
而我们主要使用的就是Jmeter,其官方网站为:https://jmeter.apache.org/。
了解完市场上主要流行的压测工具之后,我们需要了解压测的目标是什么?
压测目标简单来说就4个:
- 负责上升各项指标是否正常;
- 发现性能短板;
- 高并发下系统是否文档;
- 预估系统最大负责。
压力测试案例
- 首先我们需要创建新的压测计划
- 然后配置线程组
- 线程数:20,线程数量,这里设置了20个线程;
- ramp-up:表示在指定时间之内把这些线程全部启动起来。如果n=1,那就表示要在1s以内把50个线程全部启动;
- 循环次数:2000,表示把20thread循环2000次,也就是一个请求接口循环调用2000次。
- 然后测试HTPP接口
- 配置断言:
- 响应断言(判断响应内容是否包含指定的字符信息,用于判断api接口返回内容是否正确);
- 响应时间断言(判断响应时间,是否超过预期的时间,用于判断api接口返回时间是否超时过期);
- 配置结果监听:
- 聚合报告:查询结果信息聚合汇总,例如样本,平均值,吞吐量,最大值,最小值;
- 察看结果树:记录每一次压测请求;
- 图像结果:分享了所以请求的平均值,终止,偏离值和吞吐量之间的关系;
- 汇总结果:汇总压测结果;
- 汇总图:将压测结果以图像形式展示。
压测结果
聚合报告
- 样本(sample):发送请求的总样本数量
- 响应时间【单位 ms】:
- 平均值(average):平均的响应时间
- 中位数(median):中位数的响应时间,50% 请求的响应时间
- 90% 百分位(90% Line):90% 的请求的响应时间,意思是 90% 的请求是 <=1765ms 返回,另外 10% 的请求是大于等于 1765ms 返回的
- 95% 百分位(95% Line):95% 的请求的响应时间,95% 的请求都落在 1920ms 之内返回的
- 99% 百分位(99% Line):99% 的请求的响应时间
- 最小值 (min):请求返回的最小时间,其中一个用时最少的请求
- 最大值 (max):请求返回的最大时间,其中一个用时最大的请求
- 异常(error):出现错误的百分比,错误率 = 错误的请求的数量 / 请求的总数
- 吞吐量 TPS(throughout):吞吐能力
- Received KB/sec:每秒从服务器端接收到的数据量
- Sent KB/sec:每秒从客户端发送的请求的数量
察看结果树
每一次http请求结果
汇总图与图像结果
图形结果:分析了所以请求的平均值,终止,偏离值和吞吐量之间的关系
- 横坐标;为请求数量,单位个数;
- 纵坐标;响应时间,单位ms。
汇总报告
- 样本(sample):发送请求的总样本数量
- 响应时间【单位 ms】:
- 平均值(average):平均的响应时间
- 最小值 (min):请求返回的最小时间,其中一个用时最少的请求
- 最大值 (max):请求返回的最大时间,其中一个用时最大的请求
- 标准偏差:度量响应时间分布的分散程度的标准,衡量响应时间 / 值偏离平均响应时间的程度。标准偏差越小,偏离越少,反之亦然。
- 异常(error):出现错误的百分比,错误率 = 错误的请求的数量 / 请求的总数
- 吞吐量 TPS(throughout):吞吐能力,这个才是我们需要的并发数
- 每秒接收 KB/sec:每秒从服务器端接收到的数据量
- 每秒发送 KB/sec:每秒从客户端发送的请求的数量
- 平均字节数
Jmeter常用插件
为什么需要加入Jmeter插件?
- TPS,QPS
- PT【平均响应时间】
- 压力机活动线程数
- 服务器资源信息
插件下载地址:https://jmeter-plugins.org/downloads/all/
- PerfMon:监控服务器硬件,如 CPU,内存,硬盘读写速度等Allows collecting target server resource metrics
- Basic Graphs:主要显示平均响应时间,活动线程数,成功 / 失败交易数等
- Average Response Time 平均响应时间
- Active Threads 活动线程数
- Successful/Failed Transactions 成功 / 失败 事务数
- Additional Graphs:主要显示吞吐量,连接时间,每秒的点击数等
- Response Codes
- Bytes Throughput
- Connect Times
- Latency
- Hits/s