美文网首页测试杂文JMeterJmeter
使用Jmeter做接口压力测试-实战

使用Jmeter做接口压力测试-实战

作者: 飞翼_U | 来源:发表于2017-03-12 21:09 被阅读26688次

    缘由:前段时间只是看了小强的视频,跟着视频做一些实验,这种学习方式总会给人一种 ‘我学的是假Jmeter’ 的错觉,这周有个项目需要做压力测试,我便做个全程记录,以后自己用到也回来看看,毕竟很长时间不做就忘记了。

    业务场景:可知某系统A目前是2台机器承受10W用户,以后用户会扩展到200W,问:大概需要多少台机器?

    测试思路:在window本机上创建测试计划形成 .jmx。然后拿到linxu系统去跑测试计划进行打压

    1.jmeter安装

    1)window系统,下载.zip包解压,添加环境变量,就ok . windows系统安装jmeter

    2)linux安装,下载tar.gz包解压,添加环境变量,linux系统安装jmeter

    cat /etc/profile

    #JDK配置
    export JAVA_HOME=/opt/product/test/tools/jdk1.8.0_111
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #Jmeter配置
    export JMETER=/opt/apache-jmeter-3.0
    export CLASSPATH=${JMETER}/lib/ext/ApacheJMeter_core.jar:${JMETER}/lib/jorphan.jar:$JMETER/lib/logkit-2.0.jar:${CLASSPATH} 
    export PATH=${JMETER}/bin/:${PATH} 
    
    

    验证是否安装好,返回如下的信息就代表安装好了

    [root@localhost bin]# java -version
    java version "1.8.0_111"
    Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
    Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
    [root@localhost bin]# 
    [root@localhost bin]# jmeter -v
    Writing log file to: /opt/apache-jmeter-3.0/bin/jmeter.log
        _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____     
       / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \   
      / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) | 
     / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <  
    /_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 3.0 r1743807  
    
    Copyright (c) 1999-2016 The Apache Software Foundation
    
    [root@localhost bin]# 
    
    

    1.在windows环境录制测试计划

    1)打开jmeter,创建测试计划(线程组-sampler(HTTP请求-监听器(查看结果树、聚合报告)))

    100个并发打压2分钟.png

    HTTP请求,填写IP,端口,请求方法,路径,参数名称和值

    HTTP请求.png

    以上截图中的参数名称是接口文档里面定义的,值是我们设定的。设定参数值的方法很多,第一个方法 是在文件中取值,比如第一个参数 UserID 是在一个文件中去的,如果在文件中取值需要添加 配置元件(CSV Date Set Config)进行参数化,如下图:

    配置元件.png

    取参数也可以通过函数 动态生成数据,如 ${__RandomString(8,324YFHDDN0098432U2J32EWWDDYEHD,)}指在后面的字符中随机取8个数字。

    查看结果树和聚合报告是用来查看执行计划是否成功以及各项指标的。

    保存测试计划.png

    最后把跑通的脚本保存为 .jmx文件。

    2.在linux环境执行测试计划(打压)

    把脚本上传到 linxu环境,可以在脚本里面直接修改参数(并发数、运行时间、参数文件的位置)
    在 jmeter 的bin目录下执行测试计划,执行命令如下;

    jmeter -n -t  ncindex-collect.jmx -l result.jtl -e -o ResultReport
    #ncindex-collect.jmx是脚本名字,result.jtl 是生成的日志文件,ResultReport是生成的报告目录
    · -h 帮助 -> 打印出有用的信息并退出
    · -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
    · -t 测试文件 -> 要运行的 JMeter 测试脚本文件
    · -l 日志文件 -> 记录结果的文件
    · -r 远程执行 -> 启动远程服务
    · -H 代理主机 -> 设置 JMeter 使用的代理主机
    · -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
    

    执行命令后还需要观察打压过程是否有报错,监控linux服务器的cpu 、内存、负载等。

    跑脚本的过程.png 服务器性能监控.png probe监控应用耗费内存.png

    如果脚本过程有报错,还要去监控应用的日志,我在打压的时候应用日志就报了内存泄露;

    应用日志报错.png

    这时候需要分析内存泄露在什么地方,什么地方占用内存,执行命令:

    jmap -dump:format=b,file=mem.dat  PID
    

    dump下来的文件需要用工具分析,具体使用工具 Memory Analyzer,是一个eclipse插件 ,也可以单独使用,安装以及使用方法见 :
    MAT Memory Analyzer Tool 插件安装(图解)
    性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(二)
    使用 Eclipse Memory Analyzer 进行堆转储文件分析
    分析后会生成的报告见:

    转储分析报告.png

    大体意思就是 大部分的内存泄露是因为 "java.util.concurrent.ConcurrentHashMap$Node[]" 还可以看具体报告的细节,虽然看不大懂,但是知道肯定是代码引起的。打压过程还有个很奇怪的现象就是打压完成后 内存和cpu好久都下不来,这明显是不正常的。对比图如下:

    Paste_Image.png

    后来就把报告发给研发分析,也发给我们经理看了下,最终他们给出的结果是 被压的页面没有关闭session,如下修改:

    <%@ page session="false" contentType="text/html;charset=UTF-8" language="java"%>
    

    后来关闭后再打压果然不报错了,老大说这种这种问题很常见,不得不感叹经验很重要呀!

    最后展示一下某个接口的打压情况:

    接口打压统计.png 接口打压统计.png

    现在打压出了接口的TPS,但是我还不知道要根据这个TPS怎么判断出使用几台服务器,周一把数据汇报给经理再确定。
    和老大商讨后的结果:
    根据现网10W认证用户可以算出:

    现网目前的TPS.png

    就算用户增加到200W,算出来的 是:600多,但是打压出来的系统能力远不止这些,所以目前2台服务器就可以支撑了。

    一个打压测试做完后不得不承认学到了很多啊,性能测试果然要学习很多知识、使用一些工具去辅助自己寻找问题,得到满意的分析结果。和老大交流会学到很多东西,有些东西是自己根本不知道的,所以跟牛人交流很重要,加油。

    备注:如需转载,请私信联系我。

    相关文章

      网友评论

      • CCFjasmin:线程数、时间、循环次数那些是要怎么设置才能测试性能瓶颈的啊
      • andy_d196:请问你的Excel表格里的结果 (接口打压统计.png), 是什么软件生成的?
        飞翼_U:@hsl971105 好的 我找一下,发你。
        hsl971105:可以管你要一个你做的Excel表格里的结果 (接口打压统计.png)吗 我的qq 549243357。 如果方便留下您的qq
        飞翼_U:@andy_d196 你好,自己用 excel统计的。手动录入的。
      • 9da04b9c8c6a:要怎么在Linux下进行打压啊
      • 妙活:性能测试小白有很多问题:
        1 这是单接口压测吗?
        2 如果有多个接口需要压测,是一个一个压测还是加多个线程组?
        3 单接口压测时,测完一个接口后,数据库要恢复到之前的状态再测下一个接口吗?
      • 陌上花开_64d5:你好,想请问下是如何设置Ramp-Up Period,来计算出并发数量的呢
        陌上花开_64d5:@飞翼_U 感谢回答提问,那请问下Ramp-Up Period需要如何设置合理的时间呢?看了网上的资料都说的不是很明确,可以加个Q请教jmeter的问题吗?我的Q:437889925 :blush:
        飞翼_U:@陌上花开_64d5 Ramp-Up Period 和并发量没有关系。Ramp-Up Period是指要在多长时间内建立全部的线程。
      • 45516e03d22f:Hi 想请问下“就算用户增加到200W,算出来的 是:600多,”这个是怎么算的呢?还有10W现网数据里的分钟和秒代表什么?
        45516e03d22f:明白了,非常感谢!!!
        飞翼_U:分钟是打压了20分钟,看下每秒能支撑多少用户。TPS不就是每秒处理事务数吗。
        100000*0.8 / 2 / 20 /60 =33.3333,200W的时候也是这样算出来的。
      • 天一生水_3777:接口打压统计中TPS、负载、数据量分别是什么??
      • _王子_:你试过分布式压测吗?你那样测出来数据并不准确吧,存在一定差异
        飞翼_U:@_王子_ 好的,环境允许的话可以试试。
        _王子_:@飞翼_U 分布式可以去试试,效果肯定比你单机要好,
        环境架构这块你可以搞一下负载均衡,或者分布集群,得出的结果会让你的数据更有说服力
        飞翼_U:@_王子_ 没试过,肯定有差异,做分布压测也有差异,没有完全模拟现场环境。
      • e0a730a56cef:可以管你要一个你做的Excel表格吗
      • e0a730a56cef:你好,问下你那个TPS和响应时间的图是jmeter生成的吗
      • 836383285f10:我有个问题,我昨天装了jmeter的插件,然后我录制了场景的脚本,线程会有好些个http请求,我想问下,这个事务指的是线程完成一次这些请求的集合吗?TPS指的是每秒完成集合事务的吗?
      • 520c5bcc96af:求教,Tps是聚合报告中的throughout字段吗?
        天边青石:不一定人,对于单接口的测试来说,throughout是QPS,也是TPS,但是如果是多接口的化,每个接口后面的throughout就只是QPS了
        飞翼_U:@bluehgp 是的
      • 乘风飘飘:并发数20,打压20min,那样得到的采样数应该是 20*20*60=24000;但是jMeter实际的sampler远远超过这个数,是哪里理解不对吗?
        飞翼_U:@乘风飘飘 500w是我数据库里面的数据量,和并发没有关系,并发是在jmeter里面设置的,20、50、100,这样的是并发。持续打压完在jmeter的生成报告里面有整个时间段请求的总数,我这里没有贴出报告。
        乘风飘飘:@飞翼_U 是上面截图里的500W吗?但是这样算起来的话,并发数远远大于20啊
        飞翼_U:@乘风飘飘 我是持续20分钟,这20分钟他自己请求完就去循环持续请求。请求总数最后报告有记录。
      • 522118f7f735:问哈,自己弄个虚拟机linux系统可以跑吗,还有你这个90%响应时间是自己用excel函数算出来的吗
        飞翼_U:@美吕aggie 对啊 你可以试试啊 自己的电脑运行jmeter也需要很大资源的
        522118f7f735:@飞翼_U 我这本地windows系统电脑只是发起并发。承受压力的还是公司服务器啊,发起并发的电脑也需要性能配置很高吗
        飞翼_U:自己弄个虚拟就怕性能撑不住;表格是自己做出来的。
      • 水做的鱼:有个疑问,为啥在linux上打压,可否直接在Windows下打压出结果呢?
        飞翼_U:@水做的鱼 window也可以打压,只要机器承受的住。
        水做的鱼:windows打压,并通过网络传输可以不;
        飞翼_U:@水做的鱼 你的电脑受得了?
      • 三好大师:开启的线程数 确定是并发执行,不是排队执行么??
        飞翼_U:@三好大师 我理解的是刚开始用户数阶梯状增加,打压时间长的话,用户数加到设定的值后还在持续压,接下来就是并发。
      • 請叫我女王大大:我不会做接口压力测试,求请教,我这次需要接触压力测试,我不太懂,线程数是用户人数是吗?为什么线程数为20人的时候,平均响应时间为254秒,而线程数为700人的时候,平均响应时间为60秒,求请教,解说,经理让我想办法把人数少的平均响应时间长短,怎么操作,。
        飞翼_U:线程数理论上代表用户数;第二个问题“线程数为20人的时候,平均响应时间为254秒,而线程数为700人的时候,平均响应时间为60秒”你在哪里看出来的,没看懂;第3个问题问的啥?:sweat:
      • 洛奇洛:有以下几个问题:
        1. 接口打压时,整个服务器只运行了这一个接口打压吗?没有其它任何负载吗?
        2. 被测服务器的性能监控,具体用什么做的呢?cpu/内存/负载/数据量数据,是如何统计的?
        3. 表格中的用户数,就是jmeter中的线程数吧?
        谢谢~~
        洛奇洛: @飞翼_U 非常感谢@@
        飞翼_U:1.是的,只用了一台机器打压,没有使用多台负载,本机器也没有其他服务在跑。
        2.cpu、内存、负载 使用服务器top命令就可监控,数据量不是性能参数,是我数据库里面表的数据量,这个数据量是自己造的数据。
        3.是的。
        有问题再交流~
      • _王子_:你好,你这个最后的报告怎么生成excel的?导出?还是自己整理的结果?
        有时间可以交流学习一下
        飞翼_U:Excel是自己做的。:relaxed:

      本文标题:使用Jmeter做接口压力测试-实战

      本文链接:https://www.haomeiwen.com/subject/rocwgttx.html