什么叫分布式
分布式,白话理解,就是当一台压测机的并发压力过大时,我们就选择使用多台压测机(即我们前面提到过的 Agent/负载机)。
同时补充一点:在我们性能测试分析的时候,一般分析出系统资源的瓶颈,比如,内存瓶颈我们可以加内存,硬盘瓶颈我们可以换硬盘,但是要是 CPU 发生瓶颈,这时优化测试方案只能是增加 PC 服务机。
分布式的策略
分布式测试的基本策略就是将其中一台机器作为 Controller,其他的机器都作为负载机,作为 Controller 的机器只起到调度任务的作用,其他的负载机进行压力测试:
以上图为例,分布式策略的处理过程如下:
- 调度机 Controller 启动以后,导入 jmx 脚本文件,会拷贝本地的 jmx 文件分发到远程的 Agent 机器上;
- Agent 机器拿到脚本以后启动命令行模式去执行脚本,每台 Agnet 机器拿到的脚本都是一样的,所以如果 jmx 脚本为60个线程跑4分钟循环5次,那么实际并发就是 60×3(Agent 的机器数量)×5(循环次数)=900个线程并发跑4分钟;
这里我们可以得出一个必要结论:分布式测试总样本数 = 线程数 × 循环次数 × 执行机总数;
- 执行时,Agent 会把执行获得的数据结果传给 Controller 机器,Controller 机器会收集所有 Agent 机器的信息并汇总,这样 Controller 机器上就存在一份所有 Agnet 机器汇总的数据结果。
配置负载机的方法
在 JMeter 的 bin 目录下的 jmeter.properties 文件中找到 remote_hosts
,将负载机的 IP 地址配置上即可,多个负载机间用英文输入状态下的逗号(,)间隔,举例来说:
调度机 IP 为:127.0.0.1
负载机1的 IP 为:127.0.0.2
负载机2的 IP 为:127.0.0.3
负载机n的 IP 为:127.0.0.4
此时配置remote_hosts
为:
remote_hosts=127.0.0.2,127.0.0.3,127.0.0.4
一定不能配置调度机的 IP 地址:
此时打开本地的 JMeter,远程启动时:
可以发现,此时只能启动 127.0.0.2,127.0.0.3,127.0.0.4 这三台负载机。
注意事项
配置负载机是需要注意以下几点:
- 无论是调度机还是负载机,都要同时安装相同版本的 JMeter,并且配置相同版本的 JDK,还要注意的是每一台负载机上的 JMeter 的插件也必须一致;
- 对于负载机运行的脚本需要参数化的,一律使用 CSV Data Set Config 的参数化方式,并且所在每个负载机的路径都一致;
- 作为负载机的硬件条件也要完全一致,主要是 CPU、内存、硬盘必须一致。
调度机的作用
现在我们说下调度机从中扮演的角色:主要负责性能测试脚本的分发,及各个负载机(Agent)的测试结果收集汇总,报告产出。
另外:当负载机的数量有限,受 PC 资源数量的限制,此时我们也可以将 Controller 作为负载机,即将调度机的IP地址也加入到remote_hosts
即可,此时我们在打开 JMeter 查看其远程启动:
负载机的作用
主要负责执行性能测试脚本及断言等(命令行模式执行,无界面),并将执行结果反馈给调度机(Controller),若断言执行成功则不返回请求响应数据及详细断言信息。
一个疑问
我们说既然调度机(Controller)本身可以作为负载机,那为什么不将其作为负载机呢?因为 JMeter 执行过程本身就是消耗资源的过程,所以条件允许的情况下,最好单独部署一台机器作为调度机。
总结
- 明确什么情况下需要将调度机也作为负载机;
- 注意所有负载机上的 JMeter 版本、参数化以及使用的所有插件都要一致;
- 介于 PC 资源限制,建议大家有条件的自己动手,一定亲自演练一遍。