GUI模式压测
基本使用
断言
自定义变量
批量导入测试数据
压测数据库
CLI模式压测
压测流程
分析压测结果
分布式压测
通过压测可以定位系统的性能瓶颈,以便针对性地进行优化。
前端的静态资源一般都放在cdn上,速度快、无需压测,压测一般是指后端接口的压测。一般只压测请求频率高的接口,压测请求频率低的接口没有意义。
压测结果一般关注
qps:query per second,每秒处理的读请求数量
tps:transaction per second,每秒处理的写请求数量
请求处理耗时:95线、99线,95%、99%的请求落在什么区间范围,剩下的极少数请求可能是受到网络环境等极端情况影响。
jmeter是一个开源免费、功能强大的压测工具,纯java编写,支持不同的请求协议(http、https),支持分布式压测。
win下载zip,linux下载tgz,里面的文件都是一样的,只是压缩格式不同。
解压,主要使用bin目录下的文件,win执行 jmeter.bat 启动,linux执行 jmeter.sh 启动。
修改GUI语言
可在 jmeter.properties 中修改GUI语言,language=zh_CN,默认en
也可启动后在菜单栏的 options -> choose language 中修改,但这种只是临时修改,重启失效。
创建压测任务
1、对测试计划单击右键,添加线程组
2、对线程组单击右键,分别添加
取样器(sampler)的http请求。可在Parameters中添加请求参数。
监听器(listener)的查看结果树、聚合报告。
一个http请求对应一个接口,一个线程组可添加多个请求,这些请求通过名称进行区分。
点击工具栏的运行是压测所有线程组,可以对某个线程组右键运行,只压测该线程组。如果不想压测某些线程组或某些请求,可以右键禁用。
可以把压测任务保存为.jmx文件,传给其他人使用,在jmeter中打开.jmx文件即可。
聚合报告的指标
label:http请求名称
samples:总的请求个数
average:请求处理时间的平均数
median:请求处理时间的中位数
9x%line:9x%的请求都在该时间内处理完成
min:请求处理的最小时间,0表示处理时间极短
max:请求处理的最大时间
error%:错误率
throughtput:相当于qps
压测到throughtput上升缓慢,这时服务器cpu的使用率也差不多100%了,就行了。
可以对线程组右键添加断言,这种断言会应用于此线程组的所有http请求
也可以对某个http请求右键添加断言,这种断言只应用于这个http请求
断言一般使用响应断言即可。
有多个http请求时,可以使用自定义变量,统一设置这些http请求的protocol、服务器的ip|域名、port、path中的公共路径,方便修改。
使用步骤
对线程组单击右键,添加配置元件(config element)的用户定义变量,设置自定义的变量
在http请求中通过${xxx}引用对应的变量
场景:自定义一批要传给后端接口的参数,或者传给后端接口的参数是从数据库中导出的.csv文件。
对线程组单击右键,添加配置元件(config element)的csv数据集配置
选择csv文件,也可以是txt之类的文本文件,不要标题,一行对应一个实参表
设置变量名,有多个变量名时英文逗号分隔
填写分隔符,如果是csv文件,不用填分隔符
默认读取到最后一行后会从头循环读取,可以将recycle on eof设置为false、stop thread on eof设置为true,这样读取到最后一行后会自动终止测试。
1、点击测试计划,在最底部点击浏览,添加对应的数据库驱动的jar包。
2、新建线程组,分别添加
取样器(sampler)的jdbc请求
配置元件的jdbc连接配置。这个也可以添加到jdbc请求中,只应用于该jdbc请求。
监听器的查看结果树、聚合报告。查看结果树中的返回响应,有利于定位错误原因。
根据压测结果调整jdbc连接配置、数据库本身配置,反复压测,以优化数据库。
jmeter需要使用大量的线程模拟用户请求,很吃性能。GUI模式是在带图形界面的操作系统上,使用jmeter的GUI界面进行压测,不管是操作系统的GUI,还是jmeter本身的GUI,都占了机器不少性能,况且我们自己的开发机也运行着很多程序,jmeter不能完全发挥测试性能,压测结果有误差。
一般是把jmeter部署在单独的服务器上,在命令行进行压测,不使用监听器等耗性能的设置,以便发挥jmeter的测试性能;需要先设置好应用的堆内存 -Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m,jmeter的堆内存可以在bin/jmeter中设置,不过jmeter的堆内存一般不用手动设置。
1、下载tgz,tar -xzvf解压,cd到bin目录
2、在jmeter的GUI上创建好测试任务,没问题后,将要使用的线程组另存为.jmx脚本,传到linux上。
不要使用需要GUI界面支持的功能,比如监听器的查看结果树、聚合报告;尽量不使用有额外性能损耗的功能,比如断言、监听器。
如果要测带宽影响,使用服务器的公网ip进行测试;一般使用服务器的内网ip进行测试,以排除带宽影响。
3、在linux上jmeter的bin目录下执行
-n 非GUI模式
-t 要使用的.jmx测试脚本
-l 指定结果文件。这个文件会包含每个请求的结果。这个文件要是空的,如果不是空的,先手动删除此文件。
-e 生成html报告
-o 指定html报告的存放目录,此目录要是空的,如果不是空的,先手动删除此目录。
说明
这个命令可以在win命令行运行
如果提示.jmx文件没有对应权限,可以chmod赋权
1、下载生成的.jtl文件、html文档
2、分析.jtl文件(可选):在jmeter的GUI界面对线程组单击右键,添加监听器的聚合报告,在浏览中导入生成的.jtl文件,即可查看压测请求的总体情况。
3、双击index.html在浏览器中生成的html报告,查看压测结果分析。这里面已经包含了第二步中的聚合报告内容,所以第二步可以省略。
分布式压测:使用多个jmeter节点同时进行压测,测试结果更加准确。
一个jmeter节点作为master,其余jmeter节点作为slave,master启动分布式压测,各个slave节点同时进行压测,完成后将压测数据返回给master进行汇总。master可以同时作为slave参与应用压测。
1、准备工作
在各个jmeter节点上安装jdk、jmeter,版本保持一致
各个jmeter节点要在同一局域网内
各个jmeter节点之间通过RMI协议进行通信,RMI默认使用1099端口,所以各个jmeter节点都需要开放1099端口,或者关闭防火墙
2、修改master的配置文件 jmeter.properties
3、分别启动slave
4、master启动压测
GUI方式:双击jmeter.bat启动,创建压测任务,点击菜单栏的 运行 -> 远程启动所有,所有的slave都会压测线程组中指定的接口。可以只选择某个slave进行启动。
CLI方式:在GUI中创建压测任务,不要使用需要GUI支持、有额外性能开销的功能,保存为.jmx脚本,上传到master节点,cd到bin目录执行
参考官方文档
https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html
https://jmeter.apache.org/usermanual/remote-test.html