如何在Locust分布式测试运行时从主节点获取合并统计数据
解决Locust分布式模式下主节点合并统计数据的问题
在使用--processes -1运行分布式Locust测试时,你在Worker节点的User类中获取的self.environment.stats只是当前Worker的本地统计数据,只有主节点会汇总所有Worker的统计结果。原来的get_percentile_stats_summary等方法失效,是因为这些方法在Worker节点只能拿到本地数据,要获取合并后的全局统计,需要从主节点层面处理,以下是两种可行方案:
方案一:在主节点的事件钩子中获取合并统计
主节点会自动汇总所有Worker的统计数据,你可以通过监听Locust的测试启动事件,在主节点上启动后台任务定期获取合并后的stats:
from locust import events import threading import time @events.test_start.add_listener def on_test_start(environment, **kwargs): # 仅在主节点执行,跳过Worker节点 if environment.runner and environment.runner.is_worker: return def fetch_merged_stats(): # 测试运行期间循环获取统计数据 while environment.runner.state != environment.runner.STATE_STOPPED: merged_stats = environment.runner.stats # 打印总请求数 print(f"合并后总请求数: {merged_stats.num_requests}") # 获取并打印百分位数统计 percentile_summary = merged_stats.get_percentile_stats_summary() print(f"百分位数统计结果: {percentile_summary}") time.sleep(5) # 启动后台线程,避免阻塞测试进程 threading.Thread(target=fetch_merged_stats, daemon=True).start()
将这段代码添加到你的locustfile中,测试启动后,主节点会定期输出合并后的全局统计数据。
方案二:通过主节点HTTP API拉取合并统计
如果必须在Worker节点的代码中获取主节点的合并数据,可以调用主节点的内置HTTP接口(默认端口为8089):
修改你原有的_background_task方法:
def _background_task(self): import requests import time # 替换为你的主节点实际地址和端口 master_api_url = "http://localhost:8089/stats/requests" while True: print("Background task running...") try: response = requests.get(master_api_url) if response.status_code == 200: stats_data = response.json() total_requests = stats_data["total"]["num_requests"] print(f"主节点合并后总请求数: {total_requests}") # 也可提取响应时间百分位数等其他统计字段 response_times = stats_data["total"]["response_times"] print(f"响应时间百分位数: {response_times}") except Exception as e: print(f"获取主节点统计失败: {str(e)}") time.sleep(5)
注意事项
- 方案一效率更高,无需网络请求,直接从主节点内存读取合并数据,是优先推荐的方式。
- 方案二需要确保Worker节点能访问主节点的8089端口,且主节点未禁用HTTP API(默认启用)。
- 不要尝试在Worker的User类中直接访问主节点的stats对象,Worker和主节点的运行环境完全隔离,无法直接共享内存数据。
内容的提问来源于stack exchange,提问作者David A
相关产品推荐
相关产品推荐

