性能测试工具 jmeter 分布式调度平台实现思路

cc · 2018年03月14日 · 最后由 回复于 2020年03月05日 · 3893 次阅读

想做一个 jmeter 分布式调度压测平台,大致思路应该怎么样?

共收到 37 条回复 时间 点赞

JMeter 本身就支持分布式,所以重点应该在控制机、代理机的管理,脚本和参数管理上。
大概流程:上传 jmx 脚本、依赖配置文件、jar 包等→设置参数(并发量,压测时间)→筛选空闲的代理机,拷贝依赖文件→执行 jmeter 命令行→获取测试报告。
我以前本来也考虑过这个的,但是太懒了,就没做出来。。。

cc #2 · 2018年03月14日 Author
arrow 回复

我现在弄好了 zookeeper 去监控压测机是否空闲,但是关键在于怎么去弄调度,比如三台物理机,一台为 master,两台为 slave,怎么根据 slave 是否空闲去分发任务

cc 回复

可以把所有代理机的地址保存在数据库里面,测试的时候加锁,测试完了就解锁(控制机的命令执行完了,测试就完成了)。
可以通过命令指定代理机 IP:

jmeter -n -t test.jmx -R 192.168.1.1:1029,192.168.1.2:1029 -l log.jtl -o ./output
cc 回复

编写脚本的时候线程数或循环次数可以使用变量 ${__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
cc #5 · 2018年03月14日 Author
arrow 回复

我刚刚差不多有实现,但是就是有几个问题,1:我两台 slave 各自生成的日志有点差别,2:因为我是通过 zookeeper 去注册节点监控 的,是在 jmeter 启动时开启监控,但是物理机如果跑其他的东西就无法进行监控了

cc 回复

1、Slave 不会生成日志啊,日志都会收集到 控制机上面来。然后控制机统一生成测试报告。
2、可以监控 Slave 的 RMI 端口吧,如果没通信就是完成了

cc #7 · 2018年03月14日 Author
arrow 回复

那个日志是我 java sampler 内写的日志,按理说 slave 应该是同步进行的,生成的日志应该一样才对。监控 RMI 端口一般都是 1099 那个端口,只有启动服务才会启用那个端口吧,但是如果在 linux 系统上有跑其他的程序而并没有监听那个端口的话,是不是所有启动服务都会启用 1099 这个端口的?

1099 那个端口 是 Slave 才会监听的,其他程序不会监听那个端口

cc #9 · 2018年03月14日 Author
arrow 回复

哦哦,谢谢您呢

cc #10 · 2018年03月15日 Author
arrow 回复

我这边还有个问题,就是如果我主机被 kill 了,那会在 slave 中选一台作为 master 吗,还是这个分布式运行就停止了?

cc 回复

理论上来说是可以的,就要看你怎么设计了

cc #12 · 2018年03月15日 Author
arrow 回复

这种 jmeter 本身应该是不支持的吧,需要自己写调度吧?

cc 回复

其实调度起来也不麻烦,Slave 和控制机的区别就是启动的程序不一样,一个是 jmeter,一个是 jmeter-server,只要启动相应的进程就可以了

cc #14 · 2018年03月15日 Author
arrow 回复

就是当 master 挂了时 继续启动其中一台 slave 的 jmeter 吗 这样 jmeter 还能正常继续运行?

cc #15 · 2018年03月15日 Author
arrow 回复

我刚试了下,master 挂了后 slave 还是会继续跑诶,没有 master 的状态下还是会继续运行?

cc #16 · 2018年03月15日 Author
arrow 回复

我 master 收集到的 qps 就是两个 slave qps 的总和吗

master 都挂了,报告应该也收集不到了吧。
测试的时候可以监控 master 的状态,master 挂了的时候,强制结束 slave,然后重新跑。不过这种情况应该比较少,前期可以不考虑。

zookeeper+jmeter,这个怎么玩? 我最近也再想这事情。 还有一个就是,master 的脚本要同步到 slave,还有对应的参数化文件,应该也要进行切割吧?

cc #19 · 2018年03月15日 Author
菠萝蜜 回复

改 jmeter 源码

arrow 回复

JthreadCount 貌似只支持单机,分布式不支持

cc 回复

兄弟,你改了没? 我是想着自己弄一个同步脚本和切割参数化数据的 sampler 的。

cc #22 · 2018年03月15日 Author
菠萝蜜 回复

改了

cc #23 · 2018年03月15日 Author
arrow 回复

怎么在命令中强制结束 slave,我需要先知道 PID 才可以 kill,这样的话怎么进行一键执行

cc 回复

一样的思路,根据 RMI 端口号来查找进程。

netstat -tunlp|grep 1099 | awk '{print $7}' | cut -d '/' -f 1
cc #13 · 2018年03月15日 Author
arrow 回复

这样的话是输出进程号,能直接进行 kill 吗,就是在后台可以写死 一步到位的

cc 回复

一样的,脚本

netstat -tunlp | grep 1099 | awk '{print $7}' | cut -d '/' -f 1 | xargs kill -9
cc #27 · 2018年03月15日 Author
arrow 回复

我之前是 kill 掉占 cpu 最高的来关闭 master,但是这样容易出问题,master 没有端口号,那我应该怎么办,还有就是我需要知道这台机器 cpu 占用率是否过高这该怎么弄,超过 30% 就算高了

楼主可以总结一下不,到底咋搞啊

cc #29 · 2018年03月16日 Author
bauul 回复

我想把问题解决了再总结下

@cchenax ,我同事写的可以参考下:https://github.com/yww/PTC

cc #31 · 2018年03月20日 Author
麦子 回复

谢谢您

我们去年刚搞了个,可以交流交流。

cc #33 · 2018年03月20日 Author
大东 回复

你可以微信什么,可以私聊

cc 回复

楼主实践结果如何?想学习交流下

jmeter bin 目录下 自带了停止 jmeter slave 的脚本。。。。。不需要自己去找进程 kill 掉


官方提供了杀掉 slave 进程和停止测试的 2 种脚本。直接触发一下多方便。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册