身为后端程序员怎么也要会一点压力测试相关的技术吧, 不然无脑上线项目万一项目火了进来大量请求时出现程序执行缓慢, 宕机等情况你肯定稳稳背锅, 而且这个时候短时间内还没办法解决, 只能使用物理扩容CPU, 内存, 更换网络等几种方式来解决问题, 妥妥的为公司增加支出好吧, 下一个被开的就是你
都是想跑路拿高薪的打工仔, 身上怎么可以背负污点, 赶紧学一手压力测试进行保命, 我先学为敬
本篇文章主打一个学完就会, 奥利给
文中出现软件的版本
- JMeter: 5.5
- ServerAgent: 2.2.3
性能调优对各个开发岗位的区别
各个岗位对性能调优的关键节点
- 前端工程师:
- 首屏时间: 初次访问项目等待加载时间
- 白屏时间: 刷新页面到数据全部展示时间
- 可交互时间
- 完全加载时间
- 后端工程师
- RT: 响应时间
- TRS: 每秒事务数
- 并发数: 这应该不会解释了吧
- 移动端工程师
- 端到端相应时间
- Crash率
- 内存使用率
- FPS
主要讲一下后端工程师(Java), 毕竟这是吃饭的家伙
对于后端工程师来说, 影响性能的地方主要有两个
- 数据库读写, RPC, 网络IO, 代码逻辑复杂度, 缓存
- JVM(Throughput) - JVM(Throughput)
影响性能的关键要素
- 产品设计
- 产品逻辑
- 功能交互
- 动态效果
- 页面元素
- 基础网络
- 代码质量&架构
- 架构不合理
- 研发功底和经验不足
- 没有性能意识: 只实现功能不注重代码性能, 当业务上量后系统出现连锁反应, 导致性能问题增加
- 数据库: 慢查询, 过多查询, 索引使用不当, 数据库服务器瓶颈
- 用户移动端环境
- 设备类型&性能
- 系统版本
- 网络(WiFi, 2G, 3G, 4G, 5G)
- 硬件及云服务(服务器硬件, CPU, 内存..)
1. 初步了解压力测试
1.1压力测试是什么
压力测试是针对特定系统或组件, 为要确定其稳定性而特意进行的严格测试. 会让系统在超过正常使用条件下运作, 然后再确认其结果 对系统不断施加压力, 来预估系统`负载能力`的一种测试
一般而言, 只有在系统基础功能测试验证完成, 系统趋于稳定的情况下, 才会进行压力测试
1.2压力测试的目的
当负载主键增加时, 观察系统各项性能指标的变化情况是否有异常
发现系统的性能短板, 进行针对性的性能优化
判断系统在**高并发情况下是否会报错**, 进行是否会挂掉
测试在系统某个方面达到瓶颈时, 粗略估计系统性能上限
1.3 压力测试的指标
指标 | 含义 |
---|---|
相应时间(RT) | 是指系统对请求作出响应的平均时间, 对于单用户的系统, 响应时间可以很好地度量系统的性能 |
吞吐量(Throughput) | 是指系统在单位时间内处理的数量, 每秒事务数TPS 也算是吞吐量的一种 |
资源利用率 | CPU占用率, 内存使用率, 系统负载, 网络IO |
并发用户数 | 是指系统可以同时承载的正常使用系统功能的用户的数量, 用户不同的使用模式会导致不同用户在单位时间发出不同数量的请求 |
错误率 | 失败请求占比, 在测试时添加响应断言, 验证不通过即标记为错误, 若不添加, 响应码非200则为错误 |
评判系统性能, 主要考虑三个性能指标 RT, TPS, 资源利用率
上图充分的展示了响应时间, 吞吐量, 利用率和并发用户数之间的关系
随着并发用户的增加经过轻负载区, 达到最优并发数, 此时利用率高,吞吐量高, 响应时间短
但是如果用户数继续增加, 就会到达重负载区, 此时性能最大化, 但是当超过某一临界值(最大并发数)之后, 响应时间会急剧增加, 利用率平缓, 吞吐量急速下降
我们进行压测的目的主要就是测试出这个临界值的大小, 或者说, 我们系统当前能承受住的最大并发数
2. 压力测试工具 JMeter
老规矩, 先来一波软件介绍 JMeter是 Apache组织开发的基于 Java的开源压力测试工具, 具有体积小, 功能全, 使用方便等特点. 最初被设计用于 Web应用测试, 后来被扩展到其他测试领域.
常用压测工具:
- Apache JMeter可视化的测试工具
- LoadRunner 预测系统行为和性能的负载测试工具
- Apache的 ab压力测试
- nGrinder韩国研发的一款性能测试工具
- PAS阿里测试工具
压测目标:
- 负载上升各项指标是否正常
- 发现性能短板
- 高并发下系统是否稳定
- 预估系统最大负载
2.1 安装 JMeter
写在前面, 需要 Java8环境, 没有的话需要去安装, 教程百度上一大堆
官网地址: jmeter.apache.org/
熟悉的download, 点他
开始下载(是真的慢)
解压之后进入 bin目录下, 双击 jmeter.bat, 就可以启动 JMeter了
上图可以看出, 在我们第一次打开界面时是英文的, 多少有点不友好, 接下来讲解一下怎么将语言更改为中文
2.2 设置 JMeter界面为中文
还是我们的 bin目录下, 有一个 jmeter.properties文件
双击打开, 搜索 language
去除 #
号, 值更改为 zh_CN
, 保存文件然后重启软件(双击jmeter.bat)
可以看到, 我们的 jmeter成功更改为了中文界面, 这对于我这种英语白痴来说是很舒服的
2.3 初步使用 JMeter
我们先随便创建一个测试用例, 就是简单测试, 同时讲解一下常用的参数
本次测试采用 20线程, 1秒启动时间, 循环100次, Get请求
2.3.1 创建线程组
- 线程数: 虚拟的用户数, 一个用户占一个线程
- Ramp-Up: 等待时间, 设置的虚拟用户(线程数)需要多长时间全部启动
- 循环次数: 单个线程发送请求的次数
- 调度器:
- 持续时间: 该任务执行的时间
- 启动延迟: 等待多少秒开始执行
2.3.2 创建 http请求
右键线程组-添加HTTP请求
这个中文讲解的很明白, 应该都看得懂的, 有疑问的评论区留言
2.3.3 结果树
结果树, 聚合报告, 图形结果只有新增, 解释在测试
线程组右键-添加-监听器-查看结果树
执行结果分析(启动之后显示界面)
列表列出了每一次的HTTP请求, 绿色的是成功, 红色的话就是失败
- 取样器结果参数详解
- Thread Name:线程组名称
- Sample Start: 启动开始时间
- Load time:加载时长
- Latency:等待时长
- Size in bytes:发送的数据总大小
- Headers size in bytes:发送数据的其余部分大小
- Sample Count:发送统计
- Error Count:交互错误统计
- Response code:返回码
- Response message:返回信息
- Response headers:返回的头部信息
- 请求
- 基本数据
- 入参
- 请求头
- 相应数据
- 响应码
- 响应头
2.3.4 聚合报告
线程组右键-添加-监听器-聚合报告
执行结果分析(启动之后界面)
参数解释
- 样本: 并发量
- 平均值: 接口请求用时(单位毫秒)
- 中位数: 请求用时中位数(单位毫秒), 例如2000请求以请求时间排序, 排名1000的用时时长
- 90%百分位, 95%百分位, 99%百分位和中位数同理
- 最小, 最大值: 请求用时最小和最大
- 异常% : 请求中异常的百分比
- 吞吐量: 单位时间内请求次数
2.3.5 图形结果
线程组右键-添加-监听器-图形结果
执行结果分析(启动之后显示界面)
- 样本数目:总共发送到服务器的请求数。
- 最新样本:代表时间的数字,是服务器响应最后一个请求的时间。
- 吞吐量:服务器每分钟处理的请求数。
- 平均值:总运行时间除以发送到服务器的请求数。
- 中间值:有一半的服务器响应时间低于该值而另一半高于该值。
- 偏离:表示服务器响应时间变化、离散程度测量值的大小。
2.3.6 断言
断言主要用来判断结果返回是否符合预期
线程组右键-添加-断言-响应断言
假设我们接口的返回状态码字段为code
, 200为成功, 那么就可以在断言这里进行配置, 来判断请求是否成功
3. JMeter插件
3.1 插件安装
首先说明 JMeter是不支持插件的, 所以我们先要 JMeter的插件允许插件下载, 这句话多少有点拗口
网址: Install :: JMeter-Plugins.org
点击上图红框即可下载插件, 前面说过了 JMeter是 Java8开发的, 插件对应的也是一个 jar包
下好之后就可以放在 JMeter安装目录下的 lib/ext/ 下了, 具体下载页面也有说明
上述操作结束之后, 在选项
里面就可以看到插件中心Plugins Manager
弹出以下界面, 点击 Available Plugins搜索我们需要的插件Basic Graphs
和Additional Graphs
, 勾选上, 然后安装
Basic Graphs主要显示显示平均响应时间,活动线程数,成功/失败交易数等
Additional Graphs主要显示吞吐量,连接时间,每秒的点击数等
在安装成功之后, 在监听器
会相应的多出很多的 jc开头的, 这就代表安装成功了
我使用的是 5.5版本的, 之前版本安装之后好像要手动重启, 5.5安装完会自动重启
4. Linux硬件监控
在压测过程中, 我们需要实时了解服务器的CPU, 内存, 网络, 服务器负载等情况的变化, 这个时候我们就需要对我们的 Linux系统进行监控, 通常来讲, 我们查询 Linux系统的资源占用情况可以使用以下几种方法
- 使用命令: top, iostat, iotop等
- 使用 Linux远程连接工具 FinalShell等
- 宝塔
- JMeter压测工具 PerfMon
在 JMeter中, 如果需要监控服务器硬件, 那么我们还需要安装 PerfMon插件
PerfMon监控服务器硬件,如CPU,内存,硬盘读写速度等
进入下述地址开始下载监控包: github.com/undera/perf…
下载好之后我们可以直接解压放到服务器上, 会看到有两个startAgent
文件, 分别是Windows
系统和Linux
系统的启动脚本
我们直接启动就可以了, 如果脚本启动连接不上的话可以考虑更改脚本内容
例: Linux系统脚本更改为以下内容
## 默认启动运行 startAgent.sh 脚本即可
## 服务启动默认4444端口,根本连接不上,因此自己创建一个部署脚本文件对此进行部署,且把端口修改为7879
nohup java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 7879 --tcp-port 7879 > log.log 2>&1 &
## 赋予可执行权限
chmod 755 startAgent.sh
启动成功之后, 脚本同级路径下会多出 log.log
的日志文件
然后我们就可以配置 JMeter了, 线程组-监听器-jp@gc - PerfMon Metrics Collector
我是在本地启动了ServerAgent.bat
进行测试, 执行结果如下所示:
注: 文件必须配置, 不然没有图像
具体的配置指标信息建议看官方文档, 太多了.... github.com/undera/perf…
ServerAgent闪退问题
Windows系统配置好ServerAgent
启动之后窗口闪退可能是 jre版本问题, 可以从下面的链接下载老版的 jre
www.aliyundrive.com/s/Yzw3DZ74w…
下载好之后, 建议安装目录设置在ServerAgent/jre
下
并更改startAgent.bat
脚本, cd 到老版本 jre路径
本文内容到此结束了
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!