为什么 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)在 ...
随机推荐
- SOJ 4583 动态规划之分组背包
Description Sidney想去Gandtom家玩.但Sidney家和Gandtom家之间是高低不平.坑坑洼洼的土路.所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土 ...
- AOP的本质
AOP的本质是HOOK: HOOK的本质是:新函数包含原函数或新函数替换原函数: 需要解决的问题: 1.新函数的生成: 2.新函数的调用机制: 3.原函数的调用机制: 新函数的生成: 1.将已有的动态 ...
- Golang包管理工具glide简介
Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...
- 如何在Python中获取当前时间
所属网站分类: python基础 > 模块,库 作者:追梦骚年 链接:http://www.pythonheidong.com/blog/article/68/ 来源:python黑洞网,专注p ...
- playbook-拓展
一.Handles 1. Handlers 在发生改变时执行的操作 2. handlers也是一些task的列表,通过名字来引用,它们和一般的task并没有什么区别. 3. handlers是由not ...
- ZOJ 4103 浙江省第16届大学生程序设计竞赛 D题 Traveler 构造
这个题,正赛的时候也没有过,不过其实已经有了正确的解法,可惜时间不多了,就没有去尝试. 题意是有n个点,i点能通向i-1,然后i和i*2.i*2+1互通. 请你构造一种路径从1能走完所有点,并且不重复 ...
- access数据库及其分页的方法
首先access数据库的话,感觉针对比较小型的网站比较适合.携带方便,不需要按照特定的sql环境. 当然如果使用access数据库的话 1.首先你先要下载办公五合一(access也是其中之一) 2.w ...
- 【Len's DMG】macOS Mojave 10.14.1 正式版 18B75 With Clover 4726原版镜像
亮点:本次10.14.1正式版镜像更新config配置文件SMbios机型信息,让识别更趋于完善,自带去除10.14.1 USB端口限制补丁和最新USBInjectAll.kext,移除大量可能造成卡 ...
- Repository与Factory关系
Factory负责处理生命周期的开始,而Repository帮助管理生命周期的中间和结束. 通俗的来说,Factory用于创建一个对象的新的实例,而Repository用于从数据库中查找数据.
- laravel5.5源码笔记(八、Eloquent ORM)
上一篇写到Eloquent ORM的基类Builder类,这次就来看一下这些方便的ORM方法是如何转换成sql语句运行的. 首先还是进入\vendor\laravel\framework\src\Il ...