使用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台服务器就可以支撑了。



作者:飞翼_U
链接:http://www.jianshu.com/p/673766f12ed2
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2017-08-01 11:02  HkGov  阅读(839)  评论(0编辑  收藏  举报