Jmeter(四十七) - 从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)
1.简介
千呼万唤始出来,这一篇感觉写了好久,总想写的清楚明白简洁,但是还是洋洋洒洒写了好多,希望大家喜欢吧!本来打算将这一篇文章是放在性能测试中讲解和分享的,但是有的童鞋或者小伙伴们私下问的太多了,实在是忍不了也解答烦了,索性就在这里分享一下吧。权当参考,但是希望对大家有所帮助。
2.为什么要使用分布式测试
(1)Jmeter是基于java程序运行的,在windows上使用Jmeter进行性能测试时,非常耗费客户机的CPU和内存,如果并发数稍微大一点(比如100、1000...并发),单台电脑的配置经常无法支持,很容易卡死,即使不卡死也会使电脑运行很慢,导致我们没办法进行其它操作。
(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.开始前的准备工作
本简短教程说明了如何使用多个系统执行压力测试。在我们开始之前,有几件事要检查。
- 系统上的防火墙已关闭或打开了正确的端口。
- 所有客户端都在同一子网上。
- 如果使用192.xxx或10.xxx IP地址,则服务器位于同一子网中。如果服务器不使用192.xx或10.xx IP地址,则应该没有任何问题。
- 确保JMeter可以访问服务器。
- 确保在所有系统上使用相同版本的JMeter和Java。混合版本将无法正常工作。
- 您已经为RMI设置了SSL或将其禁用。
一旦确定系统已准备就绪,就可以进行远程测试了。本教程假定您已经在所有系统上安装了JMeter。JMeter的工作方式是一个控制器节点在多个工作节点上启动测试。
一个控制器节点和多个工作节点
在深入了解分步说明之前,最好先定义术语并确保定义清楚。
- 控制器节点:运行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:1888
代码中 , 192.168.174.130:1000
即是执行机IP和端口号。
3.取消server.rmi.ssl.disable=false
的中注释并将false改为ture,或者你复制一下这一行代码,将false改为ture,当然了不要忘记去掉前边的注释。
server.rmi.ssl.disable=true
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
server.rmi.localport=1000
server.rmi.ssl.disable=true
2、在执行机上自定义端口号
(1)进入Jmeter的bin目录,找到Jmeter.properties文件,打开该文件修改如下两个配置项,比如修改端口号为:1355(默认端口号为:1099)(记得取消注释)
server_port=1355
server.rmi.localport=1355
server.rmi.ssl.disable=true
(2)启动执行机上的Jmeter-server.bat,如下图所示,端口号已经修改为:1000.宏哥这里是修改成1000。
3、在调度机上添加远程的负载机
进入Jmeter的bin目录,找到Jmeter.properties文件,进行如下配置:
4、在调度机上打开,Jmeter,如下图即可启动远程的负载机
5、验证:启动后如果运行正常,在调度机上可以看到远端负载机的执行结果,如下图:
在执行机上有如下显示:
7.3linux下的配置
1、在Linux下安装同调度机相同的JDK和Jmeter版本
JDK环境变量的配置参考如下:https://www.cnblogs.com/du-hong/p/14428790.html
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
server.rmi.localport=1099
(2)启动执行机上的Jmeter-server.bat,命令:./jmeter-server -Djava.rmi.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 -Djava.rmi.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.net.ConnectionException: Connection refused:connect
解决问题:在执行机上重新启动Jmeter-server服务,或者是你这个服务压根就没有启动(我的测试环境这样是可以解决的,如果你的环境解决不了,请仔细查看执行机上的Jmeter-server.log中的报错信息)
5、启动Jmeter报错
解决办法:1、找到JMETER_HOME\bin\jmeter.properties
2、修改server.rmi.ssl.disable=true (记得去除server.rmi.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调整为合适大小。
Jmeter(四十七) - 从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)的更多相关文章
- Jmeter(四十三) - 从入门到精通高级篇 - Jmeter之IP伪装和欺骗(详解教程)
1.简介 我们从小接受的教育就是不要撒谎,要做一个诚实的孩子,但是在现实生活中有时候说一个善意的谎言也不是可以的.这里由于服务器各种安全机制的限制和校验,因此我们不得不欺骗一下服务器,今天宏哥就给大家 ...
- Jmeter(三十七) - 从入门到精通进阶篇 - 输出HTML格式的性能测试报告(详解教程)
1.简介 相对于Loadrunner,Jmeter其实也是可以有测试报告产出的,虽然一般都不用(没有Loadrunner的报告那么强大是一方面),但是有小伙伴们私下问,那宏哥还是顺手写一下吧,今天我们 ...
- Jmeter(四十) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 中篇(详解教程)
1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了,因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂,就算修改了也是模模糊糊的.更有甚者觉得那是禁地神圣不可轻 ...
- Jmeter(四十一) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 下篇(详解教程)
1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了,因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂,就算修改了也是模模糊糊的.更有甚者觉得那是禁地神圣不可轻 ...
- Jmeter(五十) - 从入门到精通高级篇 - jmeter 之模拟弱网进行测试(详解教程)
1.简介 在实际工作中,网络带宽一定不会是持续稳定的保持某一个值,而是有高有低.因此为了测试场景和实际能够无限的接近,所以我们需要模拟一下来达到效果.还有就是在实际的测试工作中,会因为业务需要,有时限 ...
- Jmeter(五十一) - 从入门到精通高级篇 - jmeter之运动战(详解教程)
1.简介 运动战是一种军事作战方式,依托较大的作战空间来换取时间移动兵力包围敌方,以优势兵力速战速决,运动战的运用归为这样一段话"避敌主力,诱敌深入,集中优势兵力逐个击破".今天宏 ...
- Jmeter(五十三) - 从入门到精通高级篇 - 懒人教你在Linux系统中安装Jmeter(详解教程)
1.简介 我们绝大多数使用的都是Windows操作系统,因此在Windows系统上安装JMeter已经成了家常便饭,而且安装也相对简单,但是服务器为了安全.灵活小巧,特别是前几年的勒索病毒,现在绝大多 ...
- Jmeter(五十四) - 从入门到精通高级篇 - 如何在linux系统下运行jmeter脚本 - 上篇(详解教程)
1.简介 上一篇宏哥已经介绍了如何在Linux系统中安装Jmeter,想必各位小伙伴都已经在Linux服务器或者虚拟机上已经实践并且都已经成功安装好了,那么今天宏哥就来介绍一下如何在Linux系统下运 ...
- Jmeter(五十二) - 从入门到精通高级篇 - jmeter之跨线程组传递参数(详解教程)
1.简介 之前分享的所有文章都是只有一个线程组,而且参数的传递也只在一个线程组中,那么如果需要在两个线程组中传递参数,我们怎么做呢?宏哥今天就给小伙伴或者童鞋们讲解一下,如何实现在线程组之间传递参数. ...
随机推荐
- 全网最清楚的:MySQL的insert buffer和change buffer 串讲
目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...
- IDEA xml 注解快捷键
注释:CTRL + SHIFT + / 撤销注释:CTRL + SHIFT + \
- Spring Cloud Alibaba(2)---RestTemplate微服务项目
RestTemplate微服务项目 前言 因为要运用 Spring Cloud Alibaba 开源组件到分布式项目中,所以这里先搭建一个不通过 Spring Cloud只通过 RestTemplat ...
- Day08_40_集合_List
List集合 List接口是继承Collection接口,所以Collection集合中有的方法,List集合也会继承过来,可以直接使用. All Superinterfaces: Collectio ...
- 手把手教你SonarQube入门安装与使用
简介 Sonar (SonarQube)是一个开源平台,用于管理源代码的质量. Sonar 不只是一个质量数据报告工具,更是代码质量管理平台. 支持Java, C#, C/C++, PL/SQL, C ...
- Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo
前话 Qt中的拽拖操作详细介绍. Demo 图片拽拖 控件拽拖 窗口拽拖 拽托框架(高级开发) 拖放(Drag and Drop) 拖放提供了一种简单的可视 ...
- css选择器中:first-child 与 :first-of-type的区别
## css选择器中:first-child 与 :first-of-type的区别 ---- :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比 ...
- 浅谈程序设计和C语言
学前必备知识 程序:一组计算机能识别和执行的指令. 计算机语言:计算机工作基于二进制,计算机只能识别和接受由0和1组成的指令. 计算机能直接识别和接受的二进制代码称为机器指令.机器指令的集合就是该计算 ...
- hdu1839 二分最短路
题意: 给你n个城市,m条双向边,每条边有自己的长度和最大运输量,让你找到一条时间小于等于T的运输能力最大的那条路... 思路: 刚开始以为是费用流呢,后来发现根本不是,因为根 ...
- ACM JAVA大数
有的水题自己模拟下大数就过了,有的各种坑,天知道曾经因为大数wa了多少次....自己最近学者用JAVA,下面是自己总结的JAVA常用知识.. 框架 import java.util.Scanner; ...