之前已经操作过了一些单机的测试,接下来是时候展示真正的进阶技术了——利用Jmeter进行分布式部署测试

 

为何进行分布式测试?

 一台计算机能运行的线程数是有限的,在1.4GHz~3GHz的CPU、1GB内存的JMeter测试机上,可以处理的Jmeter线程就只有100~300个。比如某个接口测试的场景是支持1200的并发, JMeter就可能在运行800个线程左右的时候就顶不上去了,甚至报JAVA内存溢出outofmenmory等各种错误,继续运行一会就会卡死。另外,如果所有负载由一台机器产生,网卡和交换机端口都可能产生瓶颈,所以一个JMeter客户端线程数不应超过100。

在使用Jmeter进行性能测试的时候,由于Jmeter 是java应用,对于CPU和内存的消耗比较大。因此,当需要模拟数以万计的并发用户时,像之前我那样使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起java内存溢出错误。为了让Jmeter工具提供更大的负载能力,这时就要使用Jmeter提供的分布式功能来启动多台电脑(或服务器)来分压测试。

总体思路

jemter 如何测试网站最大并发量_端口号

1、选择一台测试机作为控制器controller(测试触发引擎),控制多台slave(测试执行引擎)机器的操作。

   2、负载机本地的Jmeter不需预先导入脚本,只需要以服务器模式启动、运行即可;controller机器通过GUI界面启动slave机器,将jmeter压测脚本发送给每台启动的slave,slave获得脚本后开始执行(命令行模式执行,无界面)。 

   3、各台slave执行完成后,将结果传回给controller,controller会对测试结果收集汇总,报告产出。

   注意一:每一台负载机都会完整且独立地执行调度机中导入的脚本,所以最终执行的线程数=脚本设置的线程数*负载机数量,比如1200的并发量,脚本的线程数就设置为300,使用4台负载机。

   注意二:调度机与负载机之间、负载机与被测系统之间的网络必须是通畅的。

Jmeter分布式执行原理

1、Jmeter分布式测试时,选择其中一台机器作为控制机(Controller),其它机器则做为代理机(Agent)。

2、执行时,Controller会把脚本发送到每台Agent上,Agent 拿到脚本后开始执行,Agent执行时不需要启动Jmeter,只需要把jmeter-server.bat文件打开,而它是通过命令行模式来执行的。

3、执行后,Agent会把结果回传给Controller,Controller收集所有Agent的信息并汇总。

代理机(Agent)配置

1、Agent机上同样的需要安装JDK、Jmeter,并且配置好环境变量。

2、打开“运行”,输入"cmd",由于我的是虚拟机的server2008版,则直接打开运行面板,输入“ipconfig”,找到IP地址,假设我这个就是10.1.0.2

 

jemter 如何测试网站最大并发量_端口号_02

3、打开Agent的Jmeter/bin/jmeter.properties,找到”remote_hosts=127.0.0.1”,把这一行修改为”remote_hosts=10.1.0.2:1099,1099是端口号,可以随意自定义。不过最好是默认1099,因为这是Jmeter的控制机和代理机交互的“暗号”。

 

jemter 如何测试网站最大并发量_端口号_03

把 #server.rmi.ssl.disable=false改为server.rmi.ssl.disable=true。

jemter 如何测试网站最大并发量_IP_04

4、打开jmeter-server.bat文件,就设置完成了,等待控制机(Controller)启动。

 

jemter 如何测试网站最大并发量_端口号_05

 

三、控制机(Controller)配置:

1、Controller机上同样的,需要安装JDK、Jmeter,并且配置好环境变量。

2、本地中点击jmeter-server.bat,打开个黑窗口,你也看见用的ip地址是什么。(假设我的是169.254.202.100,最后一个为100)

 

jemter 如何测试网站最大并发量_IP_06

打开“运行”,输入"cmd",然后就看到运行面板,输入“ipconfig”,找到IP地址,发现用的这个ip用的是虚拟适配器的ip

jemter 如何测试网站最大并发量_jemter 如何测试网站最大并发量_07

3、打开controller的Jmeter/bin/jmeter.properties,找到”remote_hosts=127.0.0.1”,把这一行修改为”remote_hosts=10.1.0.2:1099,169.254.202.100:1099,1099是端口号,可以随意自定义。如果有多台代理机,这里需要把所有的代理机的IP地址和端口号都加入进来,并且用逗号隔开。

 

jemter 如何测试网站最大并发量_IP_08

把 #server.rmi.ssl.disable=false改为server.rmi.ssl.disable=true。

jemter 如何测试网站最大并发量_IP_04

4、打开jmeter-server.bat文件,设置完成了。

jemter 如何测试网站最大并发量_IP_06

 

添加线程组和请求来运行查看结果

1、打开jmeter.bat文件,添加线程组,编辑线程数,这里设置10个线程数,循环2次,就是一台机器发送10*2=20个请求;我这里设置了两台(本机一台,虚拟机一台),所以一共应该是40个请求。

 

jemter 如何测试网站最大并发量_jemter 如何测试网站最大并发量_11

 

2、添加HTTP请求,这里以我之前操作的百度首页压测为例。

jemter 如何测试网站最大并发量_端口号_12

 

 

3、添加察看结果树和聚合报告,点击运行,可以选择远程启动或者远程全部启动,如果是点击远程启动,可以选择任意一台电脑来运行,如果是点击远程全部启动就会运行控制机和所有的代理机。

 

jemter 如何测试网站最大并发量_控制机_13

 

4、这里以点击远程启动虚拟机为例。运行结束后,查看聚合报告,每台电脑设置的线程数为10,所以是10*2=20个线程数。

 

jemter 如何测试网站最大并发量_端口号_14

 

本期填坑

接下来又到了埋坑和填坑的时间了。看过我之前文章的朋友都知道,坑这个节目是必有的,因为不可能这些项目全都做的顺风顺水,而且其实绝大多数情况都是失败的多。没关系,经验是要总结的,之后路就会更平坦。

那么本期的坑就是,我用本地的controller去启动远程虚拟机上的agent,一直报错,报错信息提示是连接失败。然后我百思不得其解,Jmeter-server启动都正常,参数配置也正常,为什么连接不了?

 

jemter 如何测试网站最大并发量_IP_15

之后我一个个去排查,用虚拟机去ping本地地址,是通的;但是,用本地地址去ping虚拟机,发现ping不通。那么要解决这个问题的关键就是:让controller和agent互相ping通就OK了。然后我查了很多的资料,觉得最大的问题可能就是,我的虚拟机选用了桥接的方式。而桥接的方式,是和局域网网段息息相关。然后我就尝试一下选用另外一种方式连接:NAT方式。nat方式,是不用受限于局域网环境的。但是只能虚拟机访问外部网络,外部除了主机外其他不能访问虚拟机(但是可以通过设置端口映射实现)。

当然还有可能就是虚拟机防护墙禁止ping,这时你就需要关闭虚拟机防火墙;

那么接下来的结果大家都知道了,利用NAT方式我成功ping通了两个机器,并且远程操控成功。