Jmeter与压力测试

首发链接:https://chen-yijie.blogspot.com/2018/10/jmeter.html


学习Jmeter对API接口进行压力测试

仍然以WeChatTicket为例

测试抢票接口

服务端接收微信消息的路由为/wechat,消息格式为XML

配置服务端忽略微信消息校验,即任何客户端都可以发起连接

抢票逻辑是处理用户发来的文本信息,消息字段如下,进行压力测试时,我们也需要模拟以下消息体

< ![CDATA[toUser] ]>< ![CDATA[fromUser] ]>1348831860< ![CDATA[text] ]>< ![CDATA[thisisatest] ]>1234567890123456

测试方法:

利用脚本事先在wechat_user数据表里生成已经绑定好的测试用户,将其用户的open_id全部保存在csv文件里

设置测试计划,Jmeter项目结构如下:

- 测试计划

  - CSV数据文件设置

  - 线程组

    - HTTP请求

      - HTTP信息头管理器

    - BeanShell PostProcessor

    - 查看结果树

    - 汇总报告

每一项的关键设置:

CSV数据文件设置:读取用户open_id到变量中

线程组设置合适的并发线程数与Up-time,指定永远循环

HTTP请求的消息体数据直接按上述XML格式填写,用户open_id(fromUser)用之前的变量替换即可

HTTP信息头管理器:设置请求头Content-type=text/xml(不知道有没有必要)

BeanShell PostProcessor填写prev.setDataEncoding("UTF-8");,正确设置显示返回数据的编码(参考自http://blog.51cto.com/ydhome/1864340)

实验结果

单纯对没有进行抢票的用户提交单次抢票的请求进行测试,并发支持大约为80-85请求/s

测试环境(服务器):

----------------------------------------------------------------------

CPU model            : Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

Number of cores      : 1

CPU frequency        : 2199.998 MHz

Total size of Disk  : 25.1 GB (9.7 GB Used)

Total amount of Mem  : 985 MB (622 MB Used)

Total amount of Swap : 1023 MB (354 MB Used)

System uptime        : 24 days, 3 hour 38 min

Load average        : 0.00, 0.01, 0.01

OS                  : Ubuntu 18.04.1 LTS

Arch                : x86_64 (64 Bit)

Kernel              : 4.15.0-34-generic

----------------------------------------------------------------------

I/O speed(1st run)  : 538 MB/s

I/O speed(2nd run)  : 531 MB/s

I/O speed(3rd run)  : 517 MB/s

Average I/O speed    : 528.7 MB/s

----------------------------------------------------------------------

Node Name                      IPv4 address            Download Speed

CacheFly                        205.234.175.175        177MB/s     

Linode, Tokyo, JP              106.187.96.148          19.0MB/s     

Linode, Singapore, SG          139.162.23.4            6.99MB/s     

Linode, London, UK              176.58.107.39          13.3MB/s     

Linode, Frankfurt, DE          139.162.130.8          15.0MB/s     

Linode, Fremont, CA            50.116.14.9            29.8MB/s     

Softlayer, Dallas, TX          173.192.68.18          44.6MB/s     

Softlayer, Seattle, WA          67.228.112.250          73.1MB/s     

Softlayer, Frankfurt, DE        159.122.69.4            6.49MB/s     

Softlayer, Singapore, SG        119.81.28.170          11.3MB/s     

Softlayer, HongKong, CN        119.81.130.170          11.7MB/s     

----------------------------------------------------------------------

Node Name                      IPv6 address            Download Speed

Linode, Atlanta, GA            2600:3c02::4b          35.6MB/s     

Linode, Dallas, TX              2600:3c00::4b          44.4MB/s     

Linode, Newark, NJ              2600:3c03::4b          29.5MB/s     

Linode, Singapore, SG          2400:8901::4b          12.5MB/s     

Linode, Tokyo, JP              2400:8900::4b          20.6MB/s     

Softlayer, San Jose, CA        2607:f0d0:2601:2a::4    81.7MB/s     

Softlayer, Washington, WA      2607:f0d0:3001:78::2    22.4MB/s     

Softlayer, Paris, FR            2a03:8180:1301:8::4    12.5MB/s     

Softlayer, Singapore, SG        2401:c900:1101:8::2    11.0MB/s     

Softlayer, Tokyo, JP            2401:c900:1001:16::4    8.61MB/s     

----------------------------------------------------------------------

服务器带宽:1Gbps

mysql:mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper

python:Python 3.6.6

django:1.9.5

测试结果:

以300线程同时并发,三万个用户在一段时间内抢三万张票为用例

未修改数据库结构

平均响应时间:4600-4800ms (min:320ms,max:87050ms)

错误率(返回502/504): 1.57%

每秒处理的请求数:67.2 (开始时大约75-77,随着压力测试逐渐进行下降到约65, 最低时达到55)

修改数据库结构后(删除unique_id的索引,删除外键)

平均响应时间:2800ms (min:330ms,max:67528ms)

错误率:0.34%

每秒处理的请求数:94.7 (开始时大约100-102,随着压力测试逐渐进行下降到约95, 最低时达到90)

你可能感兴趣的:(Jmeter与压力测试)