最近公司要求要压测几个主要的借口,并且要输出最终的压测报告,因为压测报告要给甲方爸爸们看,让他们相信我们的服务是杠杠的,嘿嘿~。其实甲方爸爸们主要是想看服务器参数以及接口的负载能力(tps),于是我就压测了几个接口,发现了一些问题,针对有问题的接口做了一些优化。
其实做一下压测是挺好的,可以发现很多测试环境不会出现的问题,比如可能缓存没命中,直接穿透到db等等。压测出来的结果,看到单机(4核8G)tps低于1000的,我们都进行了优化,tps怎么也要超过1000吧。因为一直都是使用jmeter来做压测,下面我们就来简单说一下jmeter压测的流程和一些注意事项。
一、压测流程。
- 在windows下面通过gui打开jmeter,创建测试计划以及压测脚本test.jmx,注意,动态配置的参数,可以使用变量来控制,以方面在linux下用命令行进行压测的时候,动态修改参数,如下图:
- 图来自:
- 把test.jmx脚本文件放到linux服务器,使用以下命令进行压测(压测不建议使用gui模式运行,gui模式会占用一定的系统资源)。
jmeter -n -t test.jmx -J threadNum=10 -J threadCount=2 -l result.jtl
-n表示以no gui模式运行;
-t指定脚本文件,这里是 test.jmx
-J选项传递动态参数,对应创建jmx脚本的时候设置的相关参数
-l是指定结果监听器(比如聚合报告之类的)文件,这里是result.jtl
3.压测过程中输出的大概如下,可参考图中的备注理解每个字段的意思:
图来自:https://www.bbsmax.com/A/Vx5MRkZ3dN
4.压测结果如果要生成html形式的报告,使用以下命令可以将result.jtl文件生成html的形式。
jmeter -g result.jtl -o ./html
-g指定生成结果文件,这里是result.jtl;
-o指定生成的html结果文件目录,注意是目录,这里是html目录,最终生成的html相关文件会放到html目录下面;
如果result.jtl比较大的话,转换的过程可能有点慢,要等一下。生成的html要传到window端,用浏览器打开即可,生成的html相关文件如下:
用浏览器打开如下:
5.生成的result.jtl,可以传到windows本地,使用jmeter查看相关的结果,使用jmeter新建一个测试计划,然后在该测试计划下面创建对应的监听器之后,点击监听器右边的浏览按钮,选中result.jtl,打开就可以看到对应的result.jtl的结果,大概如下图:
图中的Thoughput就是tps
下面对聚合报告中的字段进行解读:
Label:请求的名称,就是我们在进行测试的httprequest sampler的名称
Samples:总共发给服务器的请求数量,如果模拟10个用户,每个用户迭代10次,那么总的请求数为:10*10 =100次;
Average:默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,以Transaction 为单位显示平均响应时间 ,单位是毫秒
Median: 50%用户的请求的响应时间,中位数
90%Line:90%的请求的响应时间
95%Line:95%的请求的响应时间
99%Line:99%的请求的响应时间
Min:最小的响应时间
Max:最大的响应时间
Error%:错误率=错误的请求的数量/请求的总数
Throughput: 默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
Received KB/sec: 每秒从服务器端接收到的数据量,即:收到的千字节每秒的吞吐量测试
Sent KB/sec: 每秒从客户端发出的的数据量,即:发送的千字节每秒的吞吐量测试
ps.
1.jmeter在linux下的安装和配置教程,这里就不赘述了,网上很多教程
2.jmeter压测脚本的编写,网上也很多教程~
二、注意事项:
1.有时候压测机(运行jmeter的机器)也会成为瓶颈,比如通过https进行压测的时候,压测机的cpu就直接100%了,如果是http的话就没问题,https是多了证书的加解密验证过程,挺耗cpu的。这时候可以通过几台机进行压测,jmeter原生支持分布式进行压测。
2.尽量使用no gui的模式进行压测,同时压测机(运行jmeter的机器)要和接口服务器分开,jmeter进行压测的时候,也是很耗资源的。
3.测试之后,如果某些接口tps很低,可以通过jprofile,jstack,jvisualVM之类的工具进行调优,接口response body很大的,可以考虑压缩之后再返回(比如tomcat,undertow等容器内部自带压缩机制)。