You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:32:47