Jmeter(四⼗七)-从⼊门到精通⾼级篇-分布式压测部署之负载
机的设置(详解教程)
1.简介
tony bennett
  千呼万唤始出来,这⼀篇感觉写了好久,总想写的清楚明⽩简洁,但是还是洋洋洒洒写了好多,希望⼤家喜欢吧!本来打算将这⼀篇⽂章是放在性能测试中讲解和分享的,但是有的童鞋或者⼩伙伴们私下问的太多了,实在是忍不了也解答烦了,索性就在这⾥分享⼀下吧。权当参考,但是希望对⼤家有所帮助。
2.为什么要使⽤分布式测试
(1)Jmeter是基于java程序运⾏的,在windows上使⽤Jmeter进⾏性能测试时,⾮常耗费客户机的CPU和内存,如果并发数稍微⼤⼀点(⽐如100、并发),单台电脑的配置经常⽆法⽀持,很容易卡死,即使不卡死也会使电脑运⾏很慢,导致我们没办法进⾏其它操作。(2)通过cmd命令⾏,或者是在Linux上使⽤Jmeter进⾏性能测试时,能够⼤⼤缩减所需要的系统资源;但是需要将jmeter脚本上传到Linux 上使⽤命令⾏⽅式运⾏,如果脚本经常改动就要频繁上传;测试完成后要把结果数据下载到本地GUI环境中查看,当结果⽂件较⼤时,下载要花费⼤量时间,总是有很多不⽅便。
(3)按照⼀般的压⼒机配置,jmeter的GUI模式下(Windows),最多⽀持300左右的模拟请求线程,再⼤的话,容易造成卡顿、⽆响应等情况,这是限于jmeter其本⾝的机制和硬件配置。
(4)有时候为了尽量模拟业务场景,需要模拟⼤量的并发请求,这个时候单台压⼒机就显得有⼼⽆⼒。针对这个情况,jmeter的解决⽅案是⽀持分布式压测,即将⼤量的模拟并发分配给多台压⼒机,来满⾜这种⼤流量的并发请求场景。
普通压测:单台机可以对⽬标机器产⽣的压⼒⽐较⼩,受限因素包括CPU,⽹络,IO等。
分布式压测:利⽤多台机器向⽬标机器产⽣压⼒,模拟⼏万⽤户并发访问。
3.分布式压测的原理
1、分布式测试中,选择⼀台作为管理机(Contorller),其他的机器作为测试执⾏的代理机(Agent);
2、执⾏测试时,由Contorller通过命令⾏将测试脚本发给Agent,然后Agent执⾏测试(不需要启动GUI),同时将测试结果发送给Contorller;
3、测试完成,可以在Contorller上的⾥⾯看到Agent发来的测试结果,结果为多个Agent测试结果汇总⽽成;
4.开始前的准备⼯作
本简短教程说明了如何使⽤多个系统执⾏压⼒测试。在我们开始之前,有⼏件事要检查。
系统上的防⽕墙已关闭或打开了正确的端⼝。
所有客户端都在同⼀⼦⽹上。
如果使⽤或10.xxx IP地址,则服务器位于同⼀⼦⽹中。如果服务器不使⽤或10.xx IP地址,则应该没有任何问题。
确保JMeter可以访问服务器。
确保在所有系统上使⽤相同版本的JMeter和Java。混合版本将⽆法正常⼯作。
您已经或将其禁⽤。
⼀旦确定系统已准备就绪,就可以进⾏远程测试了。本教程假定您已经在所有系统上安装了JMeter。JMeter的⼯作⽅式是⼀个控制器节点在多个⼯作节点上启动测试。
在本教程中,我们仅使⽤GUI模式进⾏演⽰。在现实⽣活中,您应该使⽤CLI模式(NON GUI)来开
始负载测试
⼀个控制器节点和多个⼯作节点
在深⼊了解分步说明之前,最好先定义术语并确保定义清楚。
控制器节点:运⾏JMeter GUI(控制测试)的系统
⼯作节点:运⾏jmeter-server的系统,该系统从GUI接收命令并将请求发送到⽬标系统
⽬标:我们计划进⾏压⼒测试的Web服务器
5.普通压测
普通压测:单台机可以对⽬标机器产⽣的压⼒⽐较⼩,受限因素包括CPU,⽹络,IO等。下边是宏哥简单⽤图形描述了⼀下普通压测。如下图所⽰:
6.Jmeter分布式压测介绍
在⼯作中使⽤jmeter做⼤并发压⼒测试的场景下,单机受限内存、CPU、⽹络IO,会出现服务器压⼒还没有上去,但是压测服务器已经由于模拟的压⼒太⼤死机了。为了让jmeter⼯具提供更强⼤的负载
能⼒,jmeter提供了多台机器同时产⽣负载的机制,下⾯是架构图。
原理:⽐如我在jmeter server配置线程数为10,循环次数为100,也就是会对测试服务器发起1000次请求,我有3台agent服务器,如果我在server端选择远程启动压⼒测试,那么每台agent都会对测试服务器发起10*100次请求,那么这次压⼒测试产⽣的请求就是10*100*3=3000次。
如果对原理不是很明⽩,看完下⾯的操作之后就会理解了。
6.1JMeter分布式执⾏原理说明
前提:在调度机上安装JDK(我们这⾥使⽤1.8版本的)+Jmeter(5.3)
1、客户端机器(window系统)作为⼀个控制器controller,控制多台slave机器的操作。
2、Controller和slave机器上最好装有相同版本的jdk和jmeter,并配置好环境变量,安装和配置⽅法跟windows环境类似。
3、controller通过GUI界⾯启动slave机器,将jmeter压测脚本发送给每台启动的slave,slave获得脚本后开始执⾏。slave本地不需预先存储脚本,但是需要有脚本中的依赖⽂件(如csv⽂件等)。
4、各台slave执⾏完成后,将结果传回给controller,controller收集后整合显⽰出来。
7.Jmeter分布式压测环境搭建
7.1搭建前说明
服务器环境说明:做性能测试可以直接在在云平台按需购买压⼒机,⼀旦测试结束释放压⼒机即可。当然了这是个视公司资源和公司情况⽽定,如确实需要提前报备和领导申请经费或者设备、时间等等。
分布式环境压⼒服务器要求:
需要server(控制机)和agent(压⼒机),agent搭建在linux(centos 6.5)服务器环境下,server搭建在windows(server 2012)环境下。
压⼒测试瓶颈⼤都在带宽上⾯,需要保证压⼒机的带宽要⽐服务器的带宽⾼,不然压⼒上不去。
需要保证agent和server都在⼀个⽹络中,且在多⽹卡环境需要保证启动的⽹卡都在⼀个⽹段。
需要保证server和agent之间的时间同步。
关闭防⽕墙。
7.2windows下配置
1、在Windows系统上安装相同版本的JDk和Jmeter(参考调度机的安装)
注意:JDK和Jmeter都要配置环境变量
Jmeter 环境变量的配置:
在系统环境变量中添加:JMETER_HOME=C:\jmeter\apache-jmeter-3.3\bin
在path系统变量中添加如下配置:%JMETER_HOME%\bin;
7.2.1调度机Controller
1.在多台机器中按照上述步骤配置jmeter,选择其中⼀台为调度机,其他为执⾏机。宏哥这⾥将⾃⼰的本地电脑作为调度机。
2.在调度机上修改JMETER_HOME/bin/jmeter.properties, 添加执⾏机的IP及端⼝ , 1099是默认的rmi通信端⼝。
我妈已经三天没有打我了remote_hosts=192.168.174.130:1000,192.168.3.148:1000
代码中 , 192.168.174.130:1000即是执⾏机IP和端⼝号。
3.取消i.ssl.disable=false的中注释并将false改为ture,或者你复制⼀下这⼀⾏代码,将false改为ture,当然了不要忘记去掉前边的注释。
4.开启执⾏脚本机器上的server服务,JMETER_HOME/bin/jmeter-server
把爱汇成最美的风景是什么歌
5.在控制机执⾏分布式命令
#使⽤ -r 启动所有从机执⾏脚本
jmeter -n -t testplan/comic.jmx -r -l testResult/result1.jtl
#指定从机IP
jmeter -n -t testplan/comic.jmx -R 10.15.243.53,10.15.230.78 -l testResult/result1.jtl
7.2.2执⾏机Agent
1、和调度机同样的原理,到对应的代码修改jmeter.properties⽂件中的代码,如下:
server_port=1000
2、在执⾏机上⾃定义端⼝号
(1)进⼊Jmeter的bin⽬录,到jmeter.properties⽂件,打开该⽂件修改如下两个配置项,⽐如修改端⼝号为:1000(默认端⼝号为:1099)(记得取消注释)
server_port=1000
(2)启动执⾏机上的jmeter-server.bat,如下图所⽰,端⼝号已经修改为:1000.宏哥这⾥是修改成1000。
3、在调度机上添加远程的负载机
进⼊Jmeter的bin⽬录,到Jmeter.properties⽂件,进⾏如下配置:
4、在调度机上打开,Jmeter,如下图即可启动远程的负载机
5、验证:启动后如果运⾏正常,在调度机上可以看到远端负载机的执⾏结果,如下图:
在执⾏机上有如下显⽰:
7.3linux下的配置
1、在Linux下安装同调度机相同的JDK和Jmeter版本
Jmeter的环境变量配置,export PATH=/opt/apache-jmeter-3.3/bin/:$PATH(配置⽂件位置:/etc/profile)如下图所⽰:
验证:jmeter -v
2、在执⾏机上⾃定义端⼝号
(1)进⼊Jmeter的bin⽬录,到Jmeter.properties⽂件,打开该⽂件修改如下两个配置项,⽐如修改端⼝号为:1355(默认端⼝号为:1099)
server_port=1355
(2)启动执⾏机上的Jmeter-server.bat,命令:./jmeter-server -i.server.hostname=192.168.0.199,如下图,端⼝号已经修改为:1099。宏哥的如下图所⽰:
3、在调度机上添加远程的负载机
阿宝和张冬玲进⼊Jmeter的bin⽬录,到Jmeter.properties⽂件,进⾏如下配置:
4、在调度机上打开,Jmeter,如下图即可启动远程的负载机
5、验证:启动后如果运⾏正常,在调度机上可以看到远端负载机的执⾏结果,如下图:
在执⾏机上有如下显⽰:
8.分布压测(全部启动)
1、选择远程启动-->远程全部启动,如下图所⽰:
2、master结果,全部启动,宏哥配置了2台slave,所以有两次执⾏结果:
3、查看结果树,查看执⾏机(两台两个结果),如下图所⽰:
察看结果树如图:
呼吸乐队执⾏机宏哥配置的是⼀台Linux系统,⼀台Windows系统,如图:
9.⼩结
9.1实战过程遇到问题
1、Linux下Jmeter-server启动失败,如下图所⽰:
解决办法:在启动Jmeter-server的时候加上如下参数,完成命令如下:
./jmeter-server -i.server.hostname=192.168.0.199
2、Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
在使⽤java远程启动linux服务器上的jmeter服务是报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,如下图所⽰:
无间道再见警察
解决办法:查询该报错基本都是tomcat操作 , 编辑jmeter/bin/jmeter-server⽂件,在顶部添加JAVA_HOME和JRE_HOME即可
3、调度机报如下错误:
解决办法:将执⾏机上的端⼝设置为固定端⼝即可(在之前的部署中已经说明如何⾃定义端⼝了,参考上⽂)
4、启动Jmeter报错:Java.ConnectionException: Connection refused:connect
解决问题:在执⾏机上重新启动Jmeter-server服务,或者是你这个服务压根就没有启动(我的测试环境这样是可以解决的,如果你的环境解决不了,请仔细查看执⾏机上的Jmeter-server.log中的报错信息)
5、启动Jmeter报错
解决办法:1、到JMETER_HOME\bin\jmeter.properties
2、修改i.ssl.disable=true (记得去除i.ssl.disable=true前的#),重新启动jmeter-server.bat
9.2其它说明
1.调度机(master)和执⾏机(slave)最好分开,由于master需要发送信息给slave并且会接收slave回传回来的测试数据,所以mater⾃⾝会有消耗,所以建议单独⽤⼀台机器作为mater。
2.参数⽂件:如果使⽤csv进⾏参数化,那么需要把参数⽂件在每台slave上拷⼀份且路径需要设置成⼀样的。
3.每台机器上安装的Jmeter版本和插件最好都⼀致,否则会出⼀些意外的问题。
4.若是脚本中设置的并发线程数是100,采⽤3台slaver机器去施加压⼒,那么对于服务端来说,此时的并发线程数是300。
5.为了减少出错的可能性,最好按照如下Jmeter 分布式要求:
各个机器在相同⽬录下安装相同版本的jdk;
各个机器在相同的⽬录下安装相同版本的jmeter;
配置/etc/hosts的IP和hostname的映射。
修改各个机器的jmeter的默认内存参数,从512m调整为合适⼤⼩。