为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties
中配置自己的 IP。
至于为什么要这么做,源于这一次 debug 的过程。
运行环境

mint, ubuntu 两台主机作为 master 节点,一台 win server 作为 slave 节点,采用分布式的方式,
对 target 进行测试。
问题
问题很奇怪,以 mint 系统作为 master,调度分布式测试没有问题,
$ jmeter -n -t ./test.jmx -R 10.27.2.210 -l test.jtl -e -o report_test
Creating summariser <summary>
Created the tree successfully using ./888.jmx
Configuring remote engine: 10.27.2.210
Starting remote engines
Starting the test @ Wed May 16 10:09:24 CST 2018 (1526436564379)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary =      1 in 00:00:00 =    3.5/s Avg:    20 Min:    20 Max:    20 Err:     0 (0.00%)
Tidying up remote @ Wed May 16 10:09:26 CST 2018 (1526436566910)
... end of run
而使用另一台 ubuntu 主机作为 master,调度测试,则卡在 waiting 这一行,
$ jmeter -n -t ./test.jmx -R 10.27.2.210 -l test.jtl -e -o report_test
Creating summariser <summary>
Created the tree successfully using ./888.jmx
Configuring remote engine: 10.27.2.210
Starting remote engines
Starting the test @ Wed May 16 10:09:24 CST 2018 (1526436564379)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
尝试1:防火墙干扰
第一种猜测,应该是 ubuntu 系统的防火墙干扰,阻止了 4445 端口的数据。
先关闭防火墙
$ sudo service ufw stop
再次运行测试,依旧卡在 waiting 那一行,看来问题没有那么简单。
尝试2:关闭监听功能
以 Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
信息在网上查找,有人建议修改 jmeter 设置,不监听 shutdown 信息,相应的也就不会开启 4445 端口,
理论上就不会卡在 waiting 那里,而是直接跳过。
在 ubuntu 主机,修改 jmeter.properties 文件,
#jmeterengine.nongui.maxport=4455 修改为
jmeterengine.nongui.maxport=0
但是依旧不能工作。
尝试3:端口没有开启
在 mint 作为 master,成功调度分布式测试的过程中,mint 主机自身打开了 4445 udp 端口,
用 netstat 可以查看的到。
但是,在 ubuntu 调度的时候,用 netstat 也可以查看到 4445 udp 端口已经打开。
而且用 netcat 测试 udp 端口也是可用的。
$ nc -vz -u 10.27.2.13 4445
Connection to 10.27.2.13 4445 port [udp/*] succeeded!
看来也不是端口未开放的问题。
尝试4:信息被阻塞
猜测是不是在哪个环节,shutdown message 被阻拦,导致收不过消息,而一直卡在那里。
于是在 mint 主机运行测试的时候,用 wireshark 监听所有发送与 4445 udp 的信息,然而!什么都没有!
这样看来,之前对问题的判断是不准确的。一直以为和 shutdown message 有关,其实正常运行一次测试,根本不必要有 shutdown message。
尝试5:在日志中寻找
之前一直被表面现象迷惑,认为是 master 的问题,直到进入 slave 节点查看日志 jmeter-server.log。
发现这样的错误输出,
2018-05-14 18:29:56,240 ERROR o.a.j.s.BatchSampleSender: testEnded(host)
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
	java.net.ConnectException: Connection refused: connect
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source) ~[?:1.8.0_162]
	at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source) ~[?:1.8.0_162]
	at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source) ~[?:1.8.0_162]
	at sun.rmi.server.UnicastRef.invoke(Unknown Source) ~[?:1.8.0_162]
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) ~[?:1.8.0_162]
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) ~[?:1.8.0_162]
	at com.sun.proxy.$Proxy20.testEnded(Unknown Source) ~[?:?]
	at org.apache.jmeter.samplers.BatchSampleSender.testEnded(BatchSampleSender.java:127) [ApacheJMeter_core.jar:4.0 r1823414]
	at org.apache.jmeter.samplers.DataStrippingSampleSender.testEnded(DataStrippingSampleSender.java:86) [ApacheJMeter_core.jar:4.0 r1823414]
	at org.apache.jmeter.samplers.RemoteListenerWrapper.testEnded(RemoteListenerWrapper.java:90) [ApacheJMeter_core.jar:4.0 r1823414]
	at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfEnd(StandardJMeterEngine.java:229) [ApacheJMeter_core.jar:4.0 r1823414]
	at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:495) [ApacheJMeter_core.jar:4.0 r1823414]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_162]
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[?:1.8.0_162]
	at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[?:1.8.0_162]
	at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[?:1.8.0_162]
	at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[?:1.8.0_162]
	at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_162]
	at java.net.PlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_162]
	at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:1.8.0_162]
	at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_162]
	at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_162]
	at java.net.Socket.<init>(Unknown Source) ~[?:1.8.0_162]
	at java.net.Socket.<init>(Unknown Source) ~[?:1.8.0_162]
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source) ~[?:1.8.0_162]
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source) ~[?:1.8.0_162]
	... 13 more
为什么地址是 127.0.1.1 ?为什么要向这个地址通信?
根据对 jmeter master/slave 通信机制的理解,不仅 master 主动向 slave 通信, slave 也向 master 主动通信,自然要知道彼此的地址。
由此联想到,在 slave 节点多网卡的时候,一般都设置 hostname,猜测 master 也需要进行同样的设置,告知 slave 自己的通信地址。
于是在 ubuntu master 主机的 system.properties 最后一行添加,
java.rmi.server.hostname=10.27.2.13
测试终于正常运行了。
写在最后
推而广之,在 jmeter 的所有节点,无论 master/slave,都显示设置自己的 IP 地址。
system.properties 最后一行添加
java.rmi.server.hostname=<IP addr>
												
											为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname的更多相关文章
- Jmeter分布式测试的各种坑之jmeter-server修改ip
		
第一坑:启动压力机的时候,直接./jmeter-server,会报如下错误 错误原因:127.0.0.1是本机, 一个回路地址, 没有指定地址 正确的启动方式:启动命令加一个参数, IP地址写压力机对 ...
 - 『动善时』JMeter基础 — 59、进行JMeter分布式测试遇到的坑
		
目录 1.控制机端 (1)执行机没有关闭防火墙 (2)内存溢出 2.执行机端 (1)启动jmeter-server服务情况一 (2)启动jmeter-server服务情况二 (3)启动jmeter-s ...
 - JMeter分布式测试环境搭建(禁用SSL)
		
JMeter分布式环境,一台Master,一到多台Slave,Master和Slave可以是同一台机器. 前提条件: 所有机器,包括master和slave的机器: 1.运行相同版本的JMeter 2 ...
 - jmeter分布式测试远程连接失败
		
jmeter分布式部署其实很简单.但今天测试的时候发现了一个坑,远程连接一直失败. 原因:服务器上部署了slave,而这台服务器上有多个网卡.举个例子:ip分别为:192.168.100.6,10.1 ...
 - Jmeter分布式测试实战
		
一.Jmeter分布式测试基础 1.Jmeter分布式测试原因: 在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对负载机的CPU和内存消耗比较大.所以当需要模拟数以万计的并 ...
 - Jmeter分布式测试dubbo接口2
		
上次我们将dubbo接口与jmeter集成起来,但是jmeter是由java实现的,本身有很多限制,无法实现高并发,我们需要借助分布式来实现大压力测试. 在上次的例子中,我们只是实现了简单的dubbo ...
 - Jmeter分布式测试笔记
		
在性能测试过程中,如果要求并发数较大时(例如1000+),单机配置cpu与内存等无法支持,则需要使用Jmeter的分布式测试方法. 一.一般什么情况下需要分布式 1.前辈经验:比如机器i5双核的cpu ...
 - Jmeter系列(39)- Jmeter 分布式测试
		
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 为什么要做分布式 Jmeter 本身的 ...
 - 『动善时』JMeter基础 — 58、JMeter分布式测试
		
目录 1.JMeter分布式测试概念 2.JMeter分布式测试前提条件 3.JMeter实现分布式测试 (1)在执行机中的配置 (2)在控制机中的配置 (3)启动执行机中的JMeter服务 (4)在 ...
 
随机推荐
- arcgis api for javascript本地部署加载地图
			
最近开始学习arcgis api for javascript,发现一头雾水,决定记录下自己的学习过程. 一.下载arcgis api for js 4.2的library和jdk,具体安装包可以去官 ...
 - kubernetes 认证授权
			
每个Kubernetes集群都有一个集群根证书颁发机构(CA). 集群中的组件通常使用CA来验证API server的证书,由API服务器验证kubelet客户端证书等.为了支持这一点,CA证书包被分 ...
 - mysql安装后找不到sock文件
			
mysql rpm安装方式之后,启动找不到sock文件,经排查是之前安装的由mysql, 需要时yum list installed mysql 或者 rpm -qa |grep -i mysql ...
 - UITextView 和 UITextField限制字符数和表情符号
			
UITextField限制字符数 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)r ...
 - PAT乙级1002
			
1002 写出这个数 (20 分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 ...
 - UCOS时钟节拍的讲究
			
其实这个值取适中即可,100,200都行,看你的片子是什么,Cortex-M3的片子取200较合适这个值太小,系统调度周期较长,各个任务之间切换较慢,适时性降低,而太大了,中断周期与调试周期接近了,那 ...
 - 【Unix 网络编程】TCP 客户/服务器简单 Socket 程序
			
建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...
 - Mysql 安全登陆工具 mysql_config_editor
			
mysql_config_editor 帮助信息请查看 man mysql_config_editor 或 mysql_config_editor -? 或 mysql_config_editor s ...
 - jQuery----淘宝商品展示(类似与tab切换)
			
实现效果如图: 功能需求: ①鼠标进入商品名称,商品名称变色,同时对应的物品展示图片显示对应的物品,鼠标移出时候,商品名称恢复原来的颜色 实现分析: 1.HTML+CS ...
 - c语言输出控制符
			
c语言格式输出 %d 10进制 %f 浮点型输出 %lf 长浮点型输出 %c 字符输出 %s 字符串输出 %o 八进制输出 %x 十六进制输出 %p 16进制,一般输出地址 %e 科学计数法输出 %m ...