最近在研究搭建一控三的分布式压测环境,首先网上研究一下教程,感觉好简单啊,shell命令来一波就可以了,一顿操作猛如虎,立马在三台linux系统的虚拟机上搭建了jmeter环境,在控制机准备好脚本,调试没问题之后,开始用负载机压测,然后问题一波一波(宝宝心里好苦,遇到问题问了各路大神,都说没遇到过,无解,只能自己一点一点琢磨,研究,o(╥﹏╥)o)
第一坑:启动jmeter-server服务时报:java.io.FileNotFoundException: rmi_keystore.jks
原因:因为从JMeter 4.0开始,RMI的默认传输机制将使用ssl。SSL需要密钥和证书才能工作,不使用ssl将存在安全漏洞。下面提示缺少jsk文件
解决办法:
1、修改jmeter.properites中 server.rmi.ssl.disable=true,关闭ssl功能(注意去掉前面的#)
2、既然找不到rmi_keystore.jks文件,那么我们就去创建这个文件
a,在控制机bin目录下,点击:create-rmi-keystore.bat
b,在弹出的终端,根据提示一直填下去,遇到Yes与No就直接填y,然后回车就ok了,生成以下文件:
c,复制控制机生成的rmi_keystore.jks到每一台负载机jmeter的bin目录下,即可,再启动就ok了~~~
第二坑:负载机启动之后,控制机无法访问负载机:java.net.ConnectionException:Connection refused:connect
控制机ping负载机:没问题,通了~
控制机Telnet负载机:完了,不通~
查看端口是否被占用:发现也没问题
关闭防火墙:iptables -F(清除所有防火墙规则),之后再Telnet,发现通了~(简单粗暴的关闭防火墙)
第三坑:启动负载机上的jmeter-server报错:Cannot start. besttest is a loopback address
原因:回环地址有问题
解决方法:
1、启动的时候,指定一个ip地址,在JMeter的bin目录下:jmeter-server -Djava.rmi.server.hostname=192.168.40.191(本服务ip)
2、或者修改jmeter-server文件,道理跟1一样:
第四坑:负载机结果不回传到控制机
监控负载机及日志发现异常报错:
分析:查看日志发现15.39:41时间时,线程请求在负载机确实是执行完了,但是在回写时,发生连接异常,但是不明白主机10.0.75.1是从哪里来的,为什么要向这个地址通信,一开始认为是该主机也在连接我的负载机,找运维查找,发现压根没有这主机,故排查认为是控制机这边打出来的!
但是想想:根据对 jmeter master/slave 通信机制的理解,不仅 master 主动向 slave 通信, slave 也向 master 主动通信,自然要知道彼此的地址。
由此联想到,在 slave 节点多网卡的时候,一般都设置hostname,猜测 master 也需要进行同样的设置,告知 slave 自己的通信地址。
master 主机的 system.properties后一行添加:java.rmi.server.hostname=10.192.72.39(master主机ip)
此时再检查负载机日志:
完美执行,并且控制机也接收到了负载的测试结果:
总结:遇到问题的过程中,请教了很多大神,但是大神说没遇到过这种问题,只能自己一点一点排查,定位问题,然后解决,这个问题耗时我两天才解决掉,真是多学多做,有些事不是你看着那么简单