想做一个 jmeter 分布式调度压测平台,大致思路应该怎么样?
JMeter 本身就支持分布式,所以重点应该在控制机、代理机的管理,脚本和参数管理上。
大概流程:上传 jmx 脚本、依赖配置文件、jar 包等→设置参数(并发量,压测时间)→筛选空闲的代理机,拷贝依赖文件→执行 jmeter 命令行→获取测试报告。
我以前本来也考虑过这个的,但是太懒了,就没做出来。。。
我现在弄好了 zookeeper 去监控压测机是否空闲,但是关键在于怎么去弄调度,比如三台物理机,一台为 master,两台为 slave,怎么根据 slave 是否空闲去分发任务
可以把所有代理机的地址保存在数据库里面,测试的时候加锁,测试完了就解锁(控制机的命令执行完了,测试就完成了)。
可以通过命令指定代理机 IP:
jmeter -n -t test.jmx -R 192.168.1.1:1029,192.168.1.2:1029 -l log.jtl -o ./output
编写脚本的时候线程数或循环次数可以使用变量 ${__P(threadCount,)}
代替,
然后通过命令行传递:
jmeter -JthreadCount=2 -n -t test.jmx -R 192.168.1.1:1029,192.168.1.2:1029 -l log.jtl -o ./output
我刚刚差不多有实现,但是就是有几个问题,1:我两台 slave 各自生成的日志有点差别,2:因为我是通过 zookeeper 去注册节点监控 的,是在 jmeter 启动时开启监控,但是物理机如果跑其他的东西就无法进行监控了
1、Slave 不会生成日志啊,日志都会收集到 控制机上面来。然后控制机统一生成测试报告。
2、可以监控 Slave 的 RMI 端口吧,如果没通信就是完成了
那个日志是我 java sampler 内写的日志,按理说 slave 应该是同步进行的,生成的日志应该一样才对。监控 RMI 端口一般都是 1099 那个端口,只有启动服务才会启用那个端口吧,但是如果在 linux 系统上有跑其他的程序而并没有监听那个端口的话,是不是所有启动服务都会启用 1099 这个端口的?
1099 那个端口 是 Slave 才会监听的,其他程序不会监听那个端口
我这边还有个问题,就是如果我主机被 kill 了,那会在 slave 中选一台作为 master 吗,还是这个分布式运行就停止了?
其实调度起来也不麻烦,Slave 和控制机的区别就是启动的程序不一样,一个是 jmeter,一个是 jmeter-server,只要启动相应的进程就可以了
master 都挂了,报告应该也收集不到了吧。
测试的时候可以监控 master 的状态,master 挂了的时候,强制结束 slave,然后重新跑。不过这种情况应该比较少,前期可以不考虑。
zookeeper+jmeter,这个怎么玩? 我最近也再想这事情。 还有一个就是,master 的脚本要同步到 slave,还有对应的参数化文件,应该也要进行切割吧?
一样的思路,根据 RMI 端口号来查找进程。
netstat -tunlp|grep 1099 | awk '{print $7}' | cut -d '/' -f 1
一样的,脚本
netstat -tunlp | grep 1099 | awk '{print $7}' | cut -d '/' -f 1 | xargs kill -9
我之前是 kill 掉占 cpu 最高的来关闭 master,但是这样容易出问题,master 没有端口号,那我应该怎么办,还有就是我需要知道这台机器 cpu 占用率是否过高这该怎么弄,超过 30% 就算高了
楼主可以总结一下不,到底咋搞啊
@cchenax ,我同事写的可以参考下:https://github.com/yww/PTC
我们去年刚搞了个,可以交流交流。
jmeter bin 目录下 自带了停止 jmeter slave 的脚本。。。。。不需要自己去找进程 kill 掉
官方提供了杀掉 slave 进程和停止测试的 2 种脚本。直接触发一下多方便。。