当前位置: 代码网 > 服务器>服务器>Linux > 2024年最新最全面的JMeter接口压力测试

2024年最新最全面的JMeter接口压力测试

2024年08月01日 Linux 我要评论
核心可执行文件以及核心配置文件jmeter.bat: windows启动文件:jmeter: mac或者linux启动文件:jmeter-server.bat:window分布式压测使用的启动文件jmeter.properties: 核心配置文件插件拓展的包核心的依赖包ext核心包junit单元测试包1)线程组Thread Group(一个线程组里可以添加多个取样器)Name:线程组名称Comments:对线程组的描述。

一、jmeter基础知识介绍和压测实操


1、jmeter基本介绍和使用场景

1)压测不同的协议和应用

  • web - http, https (java, nodejs, php, asp.net, …)
  • soap / rest webservices
  • ftp
  • database via jdbc
  • ldap 轻量目录访问协议
  • message-oriented middleware (mom) via jms
  • mail - smtp(s), pop3(s) and imap(s)
  • tcp等等

2)使用场景及优点

  • 功能测试
  • 压力测试
  • 分布式压力测试
  • 纯java开发
  • 上手容易,高性能
  • 提供测试数据分析
  • 各种报表数据图形展示

2、window环境快速安装jmeter5.x

强制依赖: jdk

官方下载地址: jmeter.apache.org/download_jm…

官方文档地址: jmeter.apache.org/usermanual/…

3、jmeter核心目录文件介绍

bin目录: 核心可执行文件以及核心配置文件

  • jmeter.bat: windows启动文件:
  • jmeter: mac或者linux启动文件:
  • jmeter-server.bat:window分布式压测使用的启动文件
  • jmeter.properties: 核心配置文件 extras目录: 插件拓展的包

lib目录: 核心的依赖包

  • ext核心包
  • junit单元测试包

4、jmeter中英文切换

方式一: 控制台修改(临时有效)

menu -> options -> choose language

 

方式二: 配置文件修改(永久有效)

jmeter bin目录 -> jmeter.properties

 

5、使用springboot 2.0快速编写api测试接口

 

复制代码

@restcontroller @requestmapping(value = "usercontroller") public class usercontroller { @getmapping(value = "getuserlist") public list<string> getuserlist() { return arrays.aslist("tom","marry","jack"); } @postmapping(value = "login") public map<string,object> login(string name,string pwd){ map<string,object> map = new hashmap<>(); map.put("name",name); if ("123".equals(pwd)){ map.put("status",0); }else{ map.put("status",-1); } return map; } }

6、创建jmeter测试计划,快速压测接口

1)创建一个setup线程组

 

2)设置setup线程组的名称以及请求线程数、请求时间、请求循环次数

 

3)创建一个http请求

 

4)编写http请求的url

 

5)添加察看结果树

 

6)设置结果树名称并运行该线程组、查看结果树

 

二、jmeter核心组件介绍和实操


1、jmeter基础功能组件介绍

1)线程组thread group(一个线程组里可以添加多个取样器)

 

  • name:线程组名称
  • comments:对线程组的描述
  • number of threads(users):虚拟用户数,一个虚拟用户占用一个进程或线程
  • ramp-up period(in seconds):准备时长,全部线程启动的时长,比如100个线程,启动时长20s,则表示20秒内100个线程都要启动完成,每秒启动5个线程
  • loop count:循环次数,每个线程发送的次数,假如该值为5,100个线程,则会发送500次请求,可以勾选永远循环

2)取样器sampler(以http请求为例)

 

  • name:取样器名称
  • comments:对取样器的描述
  • protocol[http]:协议名称,默认是http协议
  • server name or ip:服务器名称或ip,请求的目标服务器名称或ip地址
  • port number:端口号,默认是80
  • method:方法请求类型
  • path:服务器请求url

3)监听器listener(以察看结果树为例)

 

  • name:结果树名称
  • comments:对结果树的描述
  • text:请求结果列表
  • sampler result:取样器结果
  • request:请求,包括请求头与请求体
  • response data:响应数据,包括响应头与响应体

2、jmeter的断言基本使用

1)给http请求添加响应断言

 

 

  • name:断言名称
  • comments:对断言的描述
  • apply to:应用范围,main sample only表示仅对当前父取样器 进行断言,一般是一个请求,如果发一个请求会触发多个请求,则就勾选sub sample(比较少用)
  • field to test:要测试的响应字段,text response(响应文本),即响应的数据,比如json等文本,response code(响应代码),http的响应状态码,比如200,302,404等,response message(响应信息),http响应代码对应的响应信息,例如:ok, found,response header(响应头),http的响应头
  • pattern matching rules:模式匹配规则,contains(包括),包含在里面就成功,matches(匹配),响应内容完全匹配,不区分大小写,equals,完全匹配,区分大小写

2)断言结果监听器

 

断言失败,查看结果树任务,结果颜色标红(通过结果树里面双击不通过的记录,可以看到错误信息)

3)每个sampler下面可以加单独的结果树,然后同时加多个断言,最外层可以加个结果树进行汇总

3、jmeter实战之压测结果聚合报告分析

新增聚合报告

 

 

  • lable:sampler名称
  • #samples:一共发出去多少个请求,例如10个用户,循环10次,则是100
  • average:平均响应时间
  • median:中位数,也就是50%用户的响应时间
  • 90% line:90%用户的响应时间不会超过该时间
  • 95% line:95%用户的响应时间不会超过该时间
  • 99% line:99%用户的响应时间不会超过该时间
  • min:最小响应时间
  • maximum:最大响应时间
  • error%:错误的请求的数量/请求的总数
  • throughput:吞吐量,默认情况下表示每秒完成的请求数(request per second),可类比为qps
  • received kb/sec:每秒接收数据量
  • sent kb/sec:每秒发送数据量

4、jmeter压测脚本jmx讲解

 

复制代码

<?xml version="1.0" encoding="utf-8"?> <jmetertestplan version="1.2" properties="5.0" jmeter="5.1.1 r1855137"> <hashtree> <!-- 测试计划 --> <testplan guiclass="testplangui" testclass="testplan" testname="测试计划" enabled="true"> <stringprop name="testplan.comments"></stringprop> <boolprop name="testplan.functional_mode">false</boolprop> <boolprop name="testplan.teardown_on_shutdown">true</boolprop> <boolprop name="testplan.serialize_threadgroups">false</boolprop> <elementprop name="testplan.user_defined_variables" elementtype="arguments" guiclass="argumentspanel" testclass="arguments" testname="用户定义的变量" enabled="true"> <collectionprop name="arguments.arguments"/> </elementprop> <stringprop name="testplan.user_define_classpath"></stringprop> </testplan> <hashtree> <!-- 10人线程组 --> <setupthreadgroup guiclass="setupthreadgroupgui" testclass="setupthreadgroup" testname="10人线程组" enabled="true"> <stringprop name="threadgroup.on_sample_error">continue</stringprop> <elementprop name="threadgroup.main_controller" elementtype="loopcontroller" guiclass="loopcontrolpanel" testclass="loopcontroller" testname="loop controller" enabled="true"> <boolprop name="loopcontroller.continue_forever">false</boolprop> <stringprop name="loopcontroller.loops">1</stringprop> </elementprop> <stringprop name="threadgroup.num_threads">10</stringprop> <stringprop name="threadgroup.ramp_time">10</stringprop> <boolprop name="threadgroup.scheduler">false</boolprop> <stringprop name="threadgroup.duration"></stringprop> <stringprop name="threadgroup.delay"></stringprop> </setupthreadgroup> <hashtree> <!-- http取样器 --> <httpsamplerproxy guiclass="httptestsamplegui" testclass="httpsamplerproxy" testname="获取用户列表" enabled="true"> <elementprop name="httpsampler.arguments" elementtype="arguments" guiclass="httpargumentspanel" testclass="arguments" testname="user defined variables" enabled="true"> <collectionprop name="arguments.arguments"/> </elementprop> <stringprop name="httpsampler.domain">127.0.0.1</stringprop> <stringprop name="httpsampler.port">8080</stringprop> <stringprop name="httpsampler.protocol"></stringprop> <stringprop name="httpsampler.contentencoding"></stringprop> <stringprop name="httpsampler.path">/usercontroller/getuserlist</stringprop> <stringprop name="httpsampler.method">get</stringprop> <boolprop name="httpsampler.follow_redirects">true</boolprop> <boolprop name="httpsampler.auto_redirects">false</boolprop> <boolprop name="httpsampler.use_keepalive">true</boolprop> <boolprop name="httpsampler.do_multipart_post">false</boolprop> <stringprop name="httpsampler.embedded_url_re"></stringprop> <stringprop name="httpsampler.connect_timeout"></stringprop> <stringprop name="httpsampler.response_timeout"></stringprop> </httpsamplerproxy> <hashtree> <!-- 响应断言 --> <responseassertion guiclass="assertiongui" testclass="responseassertion" testname="用户列表是否包含jack" enabled="true"> <collectionprop name="asserion.test_strings"> <stringprop name="3254239">jack</stringprop> </collectionprop> <stringprop name="assertion.custom_message">jack is null</stringprop> <stringprop name="assertion.test_field">assertion.response_data</stringprop> <boolprop name="assertion.assume_success">false</boolprop> <intprop name="assertion.test_type">2</intprop> </responseassertion> <hashtree/> <!-- 结果树 --> <resultcollector guiclass="viewresultsfullvisualizer" testclass="resultcollector" testname="用户列表结果树" enabled="true"> <boolprop name="resultcollector.error_logging">false</boolprop> <objprop> <name>saveconfig</name> <value class="samplesaveconfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadname>true</threadname> <datatype>true</datatype> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responsedata>false</responsedata> <samplerdata>false</samplerdata> <xml>false</xml> <fieldnames>true</fieldnames> <responseheaders>false</responseheaders> <requestheaders>false</requestheaders> <responsedataonerror>false</responsedataonerror> <saveassertionresultsfailuremessage>true</saveassertionresultsfailuremessage> <assertionsresultstosave>0</assertionsresultstosave> <bytes>true</bytes> <sentbytes>true</sentbytes> <url>true</url> <threadcounts>true</threadcounts> <idletime>true</idletime> <connecttime>true</connecttime> </value> </objprop> <stringprop name="filename"></stringprop> </resultcollector> <hashtree/> <!-- 聚合报告 --> <resultcollector guiclass="statvisualizer" testclass="resultcollector" testname="用户列表聚合报告" enabled="true"> <boolprop name="resultcollector.error_logging">false</boolprop> <objprop> <name>saveconfig</name> <value class="samplesaveconfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadname>true</threadname> <datatype>true</datatype> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responsedata>false</responsedata> <samplerdata>false</samplerdata> <xml>false</xml> <fieldnames>true</fieldnames> <responseheaders>false</responseheaders> <requestheaders>false</requestheaders> <responsedataonerror>false</responsedataonerror> <saveassertionresultsfailuremessage>true</saveassertionresultsfailuremessage> <assertionsresultstosave>0</assertionsresultstosave> <bytes>true</bytes> <sentbytes>true</sentbytes> <url>true</url> <threadcounts>true</threadcounts> <idletime>true</idletime> <connecttime>true</connecttime> </value> </objprop> <stringprop name="filename"></stringprop> </resultcollector> <hashtree/> </hashtree> <!-- 全局结果树 --> <resultcollector guiclass="viewresultsfullvisualizer" testclass="resultcollector" testname="获取用户列表结果树" enabled="true"> <boolprop name="resultcollector.error_logging">false</boolprop> <objprop> <name>saveconfig</name> <value class="samplesaveconfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadname>true</threadname> <datatype>true</datatype> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responsedata>false</responsedata> <samplerdata>false</samplerdata> <xml>false</xml> <fieldnames>true</fieldnames> <responseheaders>false</responseheaders> <requestheaders>false</requestheaders> <responsedataonerror>false</responsedataonerror> <saveassertionresultsfailuremessage>true</saveassertionresultsfailuremessage> <assertionsresultstosave>0</assertionsresultstosave> <bytes>true</bytes> <sentbytes>true</sentbytes> <url>true</url> <threadcounts>true</threadcounts> <idletime>true</idletime> <connecttime>true</connecttime> </value> </objprop> <stringprop name="filename"></stringprop> </resultcollector> <hashtree/> </hashtree> </hashtree> </hashtree> </jmetertestplan>

三、自定义变量和csv可变参数实操


1、jmeter用户自定义变量实战

1)线程组 -> add -> config element(配置原件)-> user definde variable(用户定义的变量)

 

 

2)编写测试接口

 

复制代码

@requestmapping(value = "info") public list<string> info(string name){ list<string> userlist = new arraylist<>(); userlist.add(name); userlist.add(string.valueof(name.length())); return userlist; }

3)引用方式${xxx},在接口中变量中使用

 

4)原始查看结果树和非原生查看(基础按钮)

 

2、jmeter实战之csv可变参数压测

1)线程组->add -> config element(配置原件)-> csv data set config (csv数据文件设置)

 

2)实战操作jmeter读取txt文本文件里面的参数进行压测

 

复制代码

user1 user2 user3

 

 

3)实战操作jmeter读取csv文本文件里面的参数进行压测

 

复制代码

user1 user2 user3

 

 

3、csv文件多参数使用

1)修改接口

 

复制代码

@requestmapping(value = "info") public list<string> info(string name,string pwd){ list<string> userlist = new arraylist<>(); userlist.add(name); userlist.add(pwd); return userlist; }

2)修改txt文件

 

复制代码

user1|pwd1 user2|pwd2 user3|pwd3

 

 

3)修改cvs文件

 

复制代码

user1 pwd1 user2 pwd2 user3 pwd3

 

 

四、mysql数据库压测实操


1、jmeter压测实战之jdbc request压测mysql

1)thread group -> add -> sampler -> jdbc request

 

 

2)jar包添加 mysql-connector-java-8.0.15.jar

 

3)jdbc request->add -> config element -> jdbc connection configuration

 

 

核心配置:

  • max number of connections:最大连接数(20)
  • max wait(ms):最大等待时间(10000)
  • auto commit: 是否自动提交事务(true)
  • database url:数据库连接地址(jdbc:mysql://127.0.0.1:3306/jmeter_test?characterencoding=utf8&usessl=false&servertimezone=asia/shanghai&rewritebatchedstatements=true)
  • jdbc driver class:数据库驱动(com.mysql.cj.jdbc.driver)
  • username:数据库用户名(root)
  • password:数据库密码(root)

2、jmeter压测实战之jdbc request压测参数详解

1)预处理查询语句

 

2)预处理更新语句

 

3)thread group -> add -> sampler -> debug sampler

 

 

 

 

参数说明(sql语句结尾不要加分号):

  • variable name of pool declared in jdbc connection configuration:指定jdbc连接配置的名称
  • query type:查询类型
  • parameter values:参数值
  • parameter types:参数类型
  • variable names:sql执行结果变量名
  • result variable names:所有结果当做一个对象存储
  • query timeouts:查询超时时间
  • handle results:处理结果集

五、高级篇之分布式压测基础知识


1、分布式压测介绍

  • 普通压测:单台机可以对目标机器产生的压力比较小,受限因素包括cpu,网络,io等
  • 分布式压测:利用多台机器向目标机器产生压力,模拟几万用户并发访问

2、jmeter分布式压测原理

jmeter分布式压测原理:

  • 总控机器的节点叫master,其他产生压力的机器叫肉鸡
  • master会把压测脚本发送到肉鸡上面
  • 执行的时候,肉鸡上只需要把jmeter-server打开就可以了,不用启动jmeter
  • 结束后,肉鸡会把压测数据回传给master,然后master汇总输出报告
  • 配置详情

六、高级篇之阿里云linux服务器压测接口实战


1、spring boot接口打包,并用jar包方式部署

命令行执行mvn打包命令:

 

复制代码

mvn package

命令行执行jar包:

 

复制代码

java -jar cyan-jmeter-0.0.1-snapshot.jar

2、阿里云linux服务器下安装启动jdk8并配置环境变量

官方下载地址: www.oracle.com/technetwork…

将下载好的文件上传至服务器,并执行解压命令:

 

复制代码

$ tar -zxvf jdk-8u201-linux-x64.tar.gz -c /usr/local/ $ cd /usr/local/ $ ln -s jdk1.8.0_201/ jdk $ cd jdk/ $ pwd /usr/local/jdk

配置jdk环境变量:

 

复制代码

$ vim /etc/profile # 进入后在该文件末尾添加如下配置 java_home=/usr/local/jdk export java_home classpath=.:$java_home/lib export classpath path=$path:$java_home/bin:$classpath export path # :wq保存并退出后重启该配置文件 $ source /etc/profile

验证是否安装成功:

 

复制代码

$ java $ javac $ java -version

3、部署java项目到云服务器(阿里云)和并守护进程启动

1)将打包好的jar上传至云服务器

注意点:

  • 关闭防火墙
  • 开放端口

** 2)linux上运行jar包**

 

复制代码

java -jar cyan-jmeter-0.0.1-snapshot.jar

3)守护进程运行jar包

 

复制代码

nohup java -jar cyan-jmeter-0.0.1-snapshot.jar &

4、阿里云linux服务器安装jmeter 4.0

官方下载地址: jmeter.apache.org/download_jm…

将下载好的文件上传至服务器,并执行解压命令:

 

复制代码

$ tar -zxvf apache-jmeter-5.1.1.tgz -c /usr/local/ $ cd /usr/local/ $ ln -s apache-jmeter-5.1.1/ jmeter $ cd jmeter/ $ pwd /usr/local/jmeter

5、jmeter非gui界面参数详解及压测实战

非gui界面,压测参数讲解:

 

复制代码

-h 帮助 -n 非gui模式 -t 指定要运行的jmeter测试脚本文件 -l 记录结果的文件,每次运行之前要确保之前没有运行过,即xxx.jtl不存在,不然报错) -r jmter.properties文件remote_hosts属性指定的所有远程服务器中进行测试 -e 在脚本运行结束后生成html报告 -o 用于存放html报告的目录(目录要为空,不然报错)

官方配置参数详解地址: jmeter.apache.org/usermanual/…

测试准备: 将本地的测试计划(jmetertest.jmx文件)上传至云服务器

官方推荐命令:

 

复制代码

jmeter -n -t [jmx file] -l [results file] -e -o [path to web report folder]

在云服务器上执行如下命令进行压测:

 

复制代码

$ ./jmeter -n -t /usr/local/jmeter/bin/jmetertest.jmx -l result.jtl -e -o /usr/local/jmeter/bin/temp creating summariser <summary> created the tree successfully using /usr/local/jmeter/bin/jmetertest.jmx starting the test @ wed mar 04 13:01:17 cst 2020 (1583298077099) waiting for possible shutdown/stoptestnow/heapdump/threaddump message on port 4445 summary = 10 in 00:00:05 = 2.2/s avg: 13 min: 9 max: 39 err: 0 (0.00%) tidying up ... @ wed mar 04 13:01:22 cst 2020 (1583298082100) ... end of run

七、高级篇之阿里云压测html可视化压测报告详解


1、linux服务器jmeter压测实战之jtl文件查看

查看准备: 将压测生成的result.jtl文件下载到本地

可以通过打开jmeter,新建线程组->summary report->浏览文件进行查看:

 

 

2、jmeter压测接口的性能优化

jmeter压测减少资源使用的一些建议:

  • 使用非gui模式:jmeter -n -t test.jmx -l result.jtl
  • 少使用listener(监听器),如果使用-l参数,它们都可以被删除或禁用。
  • 在加载测试期间不要使用查看结果树或查看结果表监听器,只能在脚本阶段使用它们来调试脚本。
  • 只保存你需要的数据,尽可能少地使用断言
  • 如果测试需要大量数据,可以提前准备好测试数据放到数据文件中,以csv read方式读取。
  • 用内网压测,减少其他带宽影响压测结果
  • 如果压测大流量,尽量用多几个节点以非gui模式向服务器施压

官方推荐: jmeter.apache.org/usermanual/…

3、项目实战之jmeter压测生成多维度图形化html测试报告

把jmtere压测结果转换为html:

 

复制代码

$ ./jmeter -n -t /usr/local/jmeter/bin/jmetertest.jmx -l result.jtl -e -o /usr/local/jmeter/bin/temp

转换后目录结构如下:

 

复制代码

[root@cyan temp]# ll total 24 drwxr-xr-x 5 root root 4096 mar 4 13:01 content -rw-r--r-- 1 root root 9463 mar 4 13:01 index.html drwxr-xr-x 5 root root 4096 mar 4 13:01 sbadmin2-1.0.7 -rw-r--r-- 1 root root 874 mar 4 13:01 statistics.json

下载到本机即可查看(index.html)

4、jmeter图形化html压测报告dashboard详解

压测报告html里面dashboard的核心指标说明:

 

 

1)test and report informations

  • source file:jtl文件名
  • start time :压测开始时间
  • end time :压测结束时间
  • filter for display:过滤器

2)apdex(application performance index)

  • apdex:应用程序性能指标,范围在0~1之间,1表示达到所有用户均满意
  • t(toleration threshold):可接受阀值
  • f(frustration threshold):不可接受阀值
  • lable:sampler采样器名称

3)requests summary

  • ok:成功率
  • ko:失败率

4)statistics 统计数据

  • lable:sampler采样器名称
  • samples:请求总数,并发数*循环次数
  • ko:失败次数
  • error%:失败率
  • average:平均响应时间
  • min:最小响应时间
  • max:最大响应时间
  • 90th pct:90%的用户响应时间不会超过这个值(关注这个就可以了)
  • 95th pct:95%的用户响应时间不会超过这个值
  • 99th pct:99%的用户响应时间不会超过这个值 (存在极端值)
  • throughtput:request per second吞吐量 qps
  • received:每秒从服务器接收的数据量
  • send:每秒向服务器发送的数据量

5、jmeter图形化html压测报告charts报表讲解

压测报告html里面charts的核心指标说明:

1)over time(随时间变化)

  • response times over time:响应时间变化趋势
  • response time percentiles over time (successful responses):最大,最小,平均,用户响应时间分布
  • active threads over time:并发用户数趋势
  • bytes throughput over time:每秒接收和请求字节数变化,蓝色表示发送,黄色表示接受
  • latencies over time:平均响应延时趋势
  • connect time over time:连接耗时趋势

2)throughput(吞吐量)

  • hits per second (excluding embedded resources):每秒点击次数
  • codes per second (excluding embedded resources):每秒状态码数量
  • transactions per second:即tps,每秒事务数
  • total transactions per second:每秒总事务数
  • response time vs request:响应时间和请求数对比
  • latency vs request:延迟时间和请求数对比

3)response times(响应时间)

  • response time percentiles:响应时间百分比
  • response time overview:响应时间概述
  • time vs threads:活跃线程数和响应时间
  • response time distribution:响应时间分布图

八、高级篇之多节点jmeter分布式压测实战


1、jmeter5.1分布式压测准备工作

1)压测注意事项

  • the firewalls on the systems are turned off or correct ports are opened:系统上的防火墙被关闭或正确的端口被打开。
  • all the clients are on the same subnet:所有的客户端都在同一个子网上。
  • the server is in the same subnet, if 192.x.x.x or 10.x.x.x ip addresses are used. if the server doesn't use 192.xx or 10.xx ip address, there shouldn't be any problems:如果使用192.x.x.x或10.x.x.xip地址,则服务器位于同一子网中。如果服务器不使用192.xx或10.xxip地址,则不应该有任何问题。
  • make sure jmeter can access the server:确保jmeter可以访问服务器。
  • make sure you use the same version of jmeter and java on all the systems. mixing versions will not work correctly:确保在所有系统上使用相同版本的jmeter和java。混合版本将无法正常工作。
  • you have setup ssl for rmi or disabled it:您已为rmi设置ssl或将其禁用。

官网地址 jmeter.apache.org/usermanual/…

压测注意事项: 一定要用内网ip,不用公网ip(有带宽限制),用ping去检查

2)专业名字

  • master:司令
  • slave:奴隶
  • target:目标

3)网络拓扑图:

 

 

4)远程拷贝(内网地址):

 

复制代码

scp -r /usr/local/software/jdk-8u141-linux-x64.tar.gz root@172.18.230.233:/usr/local/software scp -r /usr/local/software/jmeter/apache-jmeter-4.0.tgz root@172.18.230.233:/usr/local/software/jmeter

5)启动

 

复制代码

./jmeter-server nohup ./jmeter-server &

6)检查启动是否成功

 

复制代码

ps -ef|grep jmeter-server ps aux|grep jmeter-server

2、云服务器jmeter压测常见问题处理

1)内存不足

 

复制代码

$ cd /usr/local/jmeter/ $ ./bin/jmeter java hotspot(tm) 64-bit server vm warning: info: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='cannot allocate memory' (errno=12) # # there is insufficient memory for the java runtime environment to continue. # native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory. # an error report file with more information is saved as: # /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log

解决方案:编辑jmeter文件,修改启动堆内存和最大堆内存

 

复制代码

$ vim bin/jmeter # 修改如下启动堆内存和最大堆内存 : "${heap:="-xms1g -xmx1g -xx:maxmetaspacesize=256m"}"

2)拥有rmi over ssl的有效秘钥库,或者禁用了ssl

 

复制代码

$ ./bin/jmeter-server server failed to start: java.rmi.server.exportexception: listen failed on port: 0; nested exception is: java.io.filenotfoundexception: rmi_keystore.jks (no such file or directory) an error occurred: listen failed on port: 0; nested exception is: java.io.filenotfoundexception: rmi_keystore.jks (no such file or directory)

解决方案:禁用ssl

 

复制代码

$ vim bin/jmeter.properties # 禁用ssl server.rmi.ssl.disable=true

再次启动jmeter:

 

复制代码

$ ./bin/jmeter-server created remote object: unicastserverref2 [liveref: [endpoint:[172.17.156.214:41187](local),objid:[3ff15d6a:170a80f2a47:-7fff, 3197885818151024044]]]

3、jmeter5.1分布式压测实战

1)压测修改master节点信息

 

复制代码

$ vim bin/jmeter.properties # remote_hosts值是slave机器的ip+端口号,如果有多个,用逗号分隔 # remote_hosts=127.0.0.1 remote_hosts=192.168.1.25:8899,192.168.1.26:8899 server.rmi.ssl.disable=true # server_port=1099

2)压测修改slave节点信息

 

复制代码

server_port=8899 server.rmi.ssl.disable=true

3)启动slave机器,注意要同个网段,ip地址用内网ip

 

复制代码

$ ./bin/jmeter-server

4)压测

 

5)本地非gui分布式压测(-r)

 

复制代码

$ ./jmeter -n -t /usr/local/jmeter/bin/jmetertest.jmx -r -l result.jtl -e -o /usr/local/jmeter/bin/temp creating summariser <summary> created the tree successfully using /users/jack/desktop/remote.jmx configuring remote engine: 172.20.10.3:8899 using local port: 8899 configuring remote engine: 172.20.10.11:8899 starting remote engines starting the test @ thu mar 29 23:21:13 cst 2018 (1522336873931) remote engines have been started waiting for possible shutdown/stoptestnow/heapdump message on port 4445 summary = 4 in 00:00:22 = 0.2/s avg: 5582 min: 94 max: 21006 err: 1 (25.00%) tidying up remote @ thu mar 29 23:21:36 cst 2018 (1522336896842) ... end of run ```

   总结

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

​​​

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com