最近kubernetes新上线了个服务,需要基于Kubernetes架构下压测一下该服务的性能, 之前用过ab, 但是ab还是相对简单了点, 网上调研了一番发现了jmeter这个由apache出品的压测工具,特别是报告非常清晰, 使用起来还挺简单.
java环境配置
jmeter是基于java开发的,因此需要有java环境且java的版本需要1.8版本及以上
java环境的配置不再详述
以下测试基于Mac系统
jmeter安装
我在使用tgz包安装时提示以下错误, 开始以为是java环境变量设置的问题, 后来一顿操作始终无法解决,后来直接使用了brew install jmeter
安装后就没问题了.
补充: 当使用brew安装完jmeter后我使用非root用户使用sh jmeter
启动发现居然没问题了, 不清楚上面的报错是因为使用了root还是其它问题被brew install之后给修复了, 现在能用就不管了.
jmeter启动
1 | tar zxf apache-jmeter-5.2.1.tgz |
即可打开gui界面, 当然在bin下还有很多启动脚本, 对应jmeter不同的用途, 可查看官文档
TestPlan
因为我这里已经配置了几个test case, 第一次启动看到的界面在左侧的节点只有一个TestPlan
依次在TestPlan右键Add –> Threads(Users) –> ThreadGroup 即会出现配置界面, 如下图
ThreadGroup相当于比如说要模拟多少个用户进行操作就会组成一个threadgroup, 每个用户使用一个thread
这里有几个重要的参数说明一下:
Number of Threads(users): 从users来看也说明了指定需要模拟多少个用户, 比如500
Ramp-up period(seconds): 这个参数比较重要, 指定Number of Threads指定的用户数需要在多少秒内启动, 比如这里设置为25, 说明500个用户需要在25秒内启动完,也就是每秒都会启动20(500/25)个用户.
如果这个值不填或者为0, 说明立即启动所有的用户,相当于完全的并发
Loop Count: 循环的次数, 可以指定整个流程循环的次数, 也可以勾选
infinite
永远运行Specify Thread lifetime: (使用该操作需要勾选
infinite
)也可以指定持续运行的时间, 比如需要500用户持续操作2小时(7200s)
- Duration(seconds): 持续时间
- Startup delay(seconds): 延迟启动时间, 可为空, 表示不延迟
以上参数跟业务场景息息相关.
举个例子: 比如 Number of Thread(Users): 500, Ramp-up period(seconds): 50, Duration(seconds): 300
整个测试意思是: jmeter将在50s内将启动和运行500个用户, 每隔10s增加10个, 最终在50s(不是精确值)后会同时存在500个用户, 整个测试流程持续300s
thread数据的变化可以从测试结果反应出来
测试是从15:18开始的, 从大约在15:20时 达到了thread=500, 从这里也,也能反应Ramp-up period不是个精确值
HTTP HEADER MANAGER
http请求时大多都需要定义http header, jmeter支持定义header,那么在每次请求时都会使用该header
ThreadGroup右键 Add –> Config Element –> HTTP HEADER MANAGER
HTTP REQUEST
get请求
可以在Parameters指定url参数或者在BodyData一栏指定请求体
所有参数都指定完之后即可保存该测试计划, 注意一定不要在gui页面执行, gui只是用于调试使用, 使用命令行执行整个测试计划, 这个在jmeter启动时也有warning提示, 同时也建议调大HEAP的值, 这个可以直接在jmeter脚本中改
post请求
如果是post请求, Method选择post, 同时也支持在Parameters指定url参数或者在BodyData一栏指定请求体,
还可以通过直接上传文件的方式
Assert
断言是个十分有用的元件, 通过assert来判断压测的请求是否符合预期, 不符合预期的请求最终将反应在报告中.
assert的工作原理就是在response返回的数据中通过对比assert定义的动作来看是否存在相符的情况
官方支持的assert有13种之多, 几乎涵盖了大部分的场景, 用的最多的是ResponseAssertion,通过返回信息来判断
ThreadGroup右键 Add –> Assertions –> responseAssert
同时也可以自定义产生错误时的msg.
增加断言动作后还可以增加查看断言结果, 如果出现不符合预期的结果将显示在这里
ThreadGroup右键 Add –> Listener –> AssertResult
命令行执行
1 | jmeter -n -t xxx.jmx -l k8s.csv -e -o k8s |
执行结果如下图: 其中的错误就是assert的原由
执行完成之后将会生成一个k8s.csv及k8s文件夹, 该文件夹内有web类型的报告,web报告的来源是通过 -l参数指定的jtl或csv文件,有过解析该文件生成html.
报告文件类似下图:
比如重要的是Dashboard一栏, 还有ResponseTime及LatencyTime等相关的黄金指标.
jmeter能够覆盖的场景非常广泛, 官网的文档也非常清晰, 后续有需求再深入研究下.