最近公司要求要压测几个主要的借口,并且要输出最终的压测报告,因为压测报告要给甲方爸爸们看,让他们相信我们的服务是杠杠的,嘿嘿~。其实甲方爸爸们主要是想看服务器参数以及接口的负载能力(tps),于是我就压测了几个接口,发现了一些问题,针对有问题的接口做了一些优化。

    其实做一下压测是挺好的,可以发现很多测试环境不会出现的问题,比如可能缓存没命中,直接穿透到db等等。压测出来的结果,看到单机(4核8G)tps低于1000的,我们都进行了优化,tps怎么也要超过1000吧。因为一直都是使用jmeter来做压测,下面我们就来简单说一下jmeter压测的流程和一些注意事项。

 

一、压测流程。

  1. 在windows下面通过gui打开jmeter,创建测试计划以及压测脚本test.jmx,注意,动态配置的参数,可以使用变量来控制,以方面在linux下用命令行进行压测的时候,动态修改参数,如下图:
     
  2. jemeter linux jemeter linux压测_jemeter linux

  3. 图来自:
     
  4. 把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.压测过程中输出的大概如下,可参考图中的备注理解每个字段的意思:

 

jemeter linux jemeter linux压测_jemeter linux_02

                图来自: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相关文件如下:

    

jemeter linux jemeter linux压测_jemeter linux_03

 

 用浏览器打开如下:

jemeter linux jemeter linux压测_响应时间_04

 

    5.生成的result.jtl,可以传到windows本地,使用jmeter查看相关的结果,使用jmeter新建一个测试计划,然后在该测试计划下面创建对应的监听器之后,点击监听器右边的浏览按钮,选中result.jtl,打开就可以看到对应的result.jtl的结果,大概如下图:

 

jemeter linux jemeter linux压测_响应时间_05

    

    图中的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等容器内部自带压缩机制)。