目录
0:前言
业务所需,需要对服务器上指定的接口进行压力测试,目标:检测吞吐量是否可以达到1000/s
1:工具选择
1.1 jmeter
1.2 ab
2个工具都是apache旗下的压测工具,安装配置都很方便。实际工作中,2个工具都有使用,ab比较轻量级,jmeter有gui页面,可以配置复杂的请求。
使用结论:ab得到的吞吐量数值比jmeter大个4-5倍,分析原因:
jmeter是一次完整的请求和返回, 而AB只是发出去请求,并不对返回做处理,只是请求发送成功或者失败。所以使用jmeter更准确一些
且
Jmeter支持可变参数和CSV数据集的输入,能设定更加复杂的测试样例,实际测试中需要传递不同的参数
所以还是使用了jmeter
2:准备测试环境,测试数据,录制测试脚本
2.1 准备测试环境
在ubuntu上使用jmeter需要jre环境
1:去oracle官网下载jre,解压,配置环境变量(网上都有,随便一搜)
2:去jmeter官网下载tgz压缩包,解压
2.2 准备测试数据
根据实际业务需求,准备测试数据
2.3 录制测试脚本
确定需要测试的接口,在jmeter的gui里进行配置,调用成功后开始配置可变参数
3:执行测试
执行命令为:
./jmeter.sh -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
由于需要多次执行,取平均值,所以又写了个shell命令来负责循环
for i in {1..10};do ./jmeter.sh -n -t test.jmx -l testcsv/test-$i.csv -e -o testReport/test-$i/;done
针对同一个脚本,循环多次获取结论的情况已经实现。
后来,又需要测试不同的线程数,每次修改jmx文件太累,经搜索,线程数也可以配置成变量,所以继续优化jmx脚本
线程数配置成变量的方式传进来
${__P(threadNum)}
eg:线程数从100,递增到1000. 每个线程重复执行10次的脚本优化如下
#!/bin/bash
for threadCount in $(seq 100 100 1000)
do
for i in {1..10}
do
./jmeter.sh -n -t test.jmx -J threadNum=$threadCount -l testcsv/test$threadCount-$i.csv -e -o testReport/test$threadCount-$i/
sleep 1
done
done
在命令行下执行这个脚本就可以跑压测啦
4:测试结果分析
测试结果都保存在了testReport中,每次结论都是一个文件夹,可以打开html通过ui的方式查看
不过我的数据量太大了,所以直接找到数据位置,写个脚本全部读出来。
吞吐量数据在文件夹下的 statistics.json 文件中,取 Total 对象下的 throughput