Z.S.K.'s Records

Kubernetes学习(jmeter基础使用)

最近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
2
3
tar zxf apache-jmeter-5.2.1.tgz
cd apache-jmeter-5.2.1/bin
sh jmeter

即可打开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
2
3
4
5
6
7
jmeter -n -t xxx.jmx -l k8s.csv -e -o k8s
# 可以使用jmeter -?打印参数说明
# -n: 表示non-gui, 也就是不启动gui
# -t: 保存的测试计划文件
# -l: 测试结果文件,jtl或者csv格式
# -e: 设置生成测试报告
# -o: web测试结果保存目录, 这个目录必须为空或者不存在

执行结果如下图: 其中的错误就是assert的原由

执行完成之后将会生成一个k8s.csv及k8s文件夹, 该文件夹内有web类型的报告,web报告的来源是通过 -l参数指定的jtl或csv文件,有过解析该文件生成html.

报告文件类似下图:

比如重要的是Dashboard一栏, 还有ResponseTime及LatencyTime等相关的黄金指标.

jmeter能够覆盖的场景非常广泛, 官网的文档也非常清晰, 后续有需求再深入研究下.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?