☰
分布式压测方案:利用多个 Worker 节点模拟万级并发
2026/10/2 6:12:30 网站建设 项目流程

分布式压测方案:利用多个 Worker 节点模拟万级并发

在对企业级 RAG 网关、向量数据库与高并发大模型流式接口进行极限容量探测时,很多测试团队常常遭遇一个经典的**“单机发压机假瓶颈(Client-side Bottleneck)”**:

  • 测试工程师在自己的单台 8 核笔记本或单台发压测试机上,用 Locust 或 Python 脚本发起 5,000 并发压测;
  • 跑着跑着,被测服务端的 CPU 才占用了 30%,但客户端发压脚本却报出大量Connection reset或延迟飙升;
  • 打开htop一看:单台发压机自身的 CPU 早已 100% 打满,发压进程自身的网络 Socket 端口耗尽、TCP TIME_WAIT 爆满,单机网卡中断被打穿!

这不是被测系统不行,而是单台发压机自身已经先“猝死”了。

为了真实模拟来自公网数万名真实用户的并发洪峰,必须搭建基于Locust Master-Worker 分布式发压集群架构。

如何利用 Docker Compose / Kubernetes 快速编排一套单 Master 集中调度、数十个 Worker 节点分布式协同施压、百万级长连接与实时度量聚合的工业级分布式压测体系?

Locust 分布式主从协同拓扑

Locust 采用Master-Worker 主从分布式架构:

+------------------------- Locust Master 调度节点 -------------------------+ | 1. 启动 Web 控制台 (UI Dashboard: http://master:8089) | | 2. 集中收集所有 Worker 节点的实时吞吐、延迟、错误率度量统计 (RPC 通信) | | 3. 全局下发施压指令: 用户总数 (Users)、每秒启动速率 (Spawn Rate) 与停止信号 | +-----------------------------------+-------------------------------------+ | (基于 ZeroMQ / MsgPack 高速心跳通道) +--------------------------+--------------------------+ | | | v v v [ Worker Node 1 ] [ Worker Node 2 ] [ Worker Node N ] (独立 Pod/物理机) (独立 Pod/物理机) (独立 Pod/物理机) - 运行 2000 个虚拟用户 - 运行 2000 个虚拟用户 - 运行 2000 个虚拟用户 - 发起异步 HTTP/SSE 长连接 - 发起异步 HTTP/SSE 长连接 - 发起异步 HTTP/SSE 长连接 | | | +--------------------------+--------------------------+ | (全网万级并发真实流量) v +----------------------- 目标被测 RAG 服务集群 ------------------------+
  1. Master 节点职责:不发射任何实际的 HTTP 网络请求,仅负责管理 Worker 连接、收集数据并在 Web 大盘上绘制实时的 TPS / 响应时间曲线;
  2. Worker 节点职责:独立运行 Python gevent / asyncio 协程,负责真正向被测服务轰击流量,并将统计结果通过 ZeroMQ 定期向 Master 汇报。

核心实战一:编写生产级全异步 RAG 压测脚本(locustfile.py)

压测脚本必须支持流式 SSE 接收、动态 Zipf 提问分布与 P99 细粒度耗时记录:

import time import random from locust import HttpUser, task, between, events import json class RAGGatewayUser(HttpUser): # 模拟真实用户的思考时间 (1~3 秒) wait_time = between(1.0, 3.0) # 预加载长尾测试集 query_corpus = [ "Kubernetes 出现 CrashLoopBackOff 怎么排障?", "Redis 分布式锁 Redlock 时钟漂移问题", "Milvus HNSW 索引 M 和 efConstruction 参数怎么调?", "BGE-Reranker-Large 显存占用与批处理优化", "FastAPI 与 asyncio 优雅关机生命周期" ] @task(10) def query_rag_chat(self): """核心压测场景:流式 SSE 问答接口""" query_text = random.choice(self.query_corpus) payload = { "query": query_text, "stream": True, "top_k": 5 } start_time = time.perf_counter() first_token_time = None # 发起流式 POST 请求 with self.client.post( "/v1/chat/completions", json=payload, headers={"Content-Type": "application/json"}, stream=True, catch_response=True, name="/v1/chat/completions (Stream SSE)" ) as response: if response.status_code != 200: response.failure(f"HTTP 状态码异常: {response.status_code}") return try: # 逐行读取流式数据包,精准捕获首字延迟 (TTFT) for line in response.iter_lines(): if line and first_token_time is None: first_token_time = time.perf_counter() total_duration_ms = (time.perf_counter() - start_time) * 1000.0 ttft_ms = (first_token_time - start_time) * 1000.0 if first_token_time else 0.0 # 自定义事件上报:记录 TTFT events.request.fire( request_type="METRIC", name="Time-To-First-Token (TTFT)", response_time=ttft_ms, response_length=0, exception=None, context={} ) response.success() except Exception as e: response.failure(f"流式读取中断: {str(e)}")

核心实战二:Docker Compose 一键拉起 10 节点分布式集群

version: '3.8' services: locust-master: image: locustio/locust:latest ports: - "8089:8089" # Web UI 大盘 volumes: - ./locustfile.py:/mnt/locust/locustfile.py command: -f /mnt/locust/locustfile.py --master -H http://target-rag-service.internal:8000 locust-worker: image: locustio/locust:latest deploy: replicas: 10 # 核心:直接横向拉起 10 个独立 Worker 容器! volumes: - ./locustfile.py:/mnt/locust/locustfile.py command: -f /mnt/locust/locustfile.py --worker --master-host locust-master

只需在终端执行一行命令:

docker-compose up -d --scale locust-worker=10

系统瞬间拉起10 个 Worker 节点,从容支撑20,000+ 并发虚拟用户的极限施压!

生产压测三大避坑军规

  1. 发压端 OS 参数调优(Linux ulimit):
    在所有 Worker 节点上,必须将ulimit -n(最大文件描述符数)从默认的 1024 调大至655350,并在系统内核开启net.ipv4.tcp_tw_reuse = 1,彻底根除端口耗尽;
  2. 阶梯式渐进加压(Ramp-up Stage):
    严禁一开始就让 10,000 个用户在第 1 秒同时并发冲击!必须设置Spawn Rate = 100 users/s,让流量在 2~3 分钟内平滑爬升,观察服务在不同并发梯度下的拐点;
  3. 内外网隔离与发压带宽核算:
    万级并发的流式 SSE 压测会产生极大的瞬时下行带宽。确保发压集群与被测服务部署在同一内网千兆/万兆 VPC 网络下,严禁让公网带宽成为隐蔽瓶颈。

总结

真实的容量必须用真实的分布式火力来检验。“Master 集中指挥调度,多 Worker 容器化分布式横向施压,细粒度打点首字延迟与吞吐”,是精准探明 RAG 系统真实承载上限、保障大促与生产高可用上线的最高规格试金石。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询