3. 压测工具选型与安装:wrk、locust、自定义Python脚本、vLLM内置benchmark工具介绍与安装

做性能压测,选对工具等于成功了一半。我见过不少团队,一上来就撸起袖子写脚本,结果测出来的数据根本没法看——要么是工具本身成了瓶颈,要么是压测方式跟实际场景对不上。

今天咱们就把市面上主流的几款压测工具捋一遍。我会结合自己的踩坑经历,告诉你什么场景该用什么工具,怎么装,怎么用。

3.1 工具选型:没有银弹,只有合适

先看一张图,帮你快速建立整体认知:

vLLM 压测工具选型图谱 vLLM 压测需求 wrk 轻量级 · 高并发 · HTTP Locust 分布式 · 可编程 · Web UI Python 自定义脚本 灵活 · 定制 · 流式测试 vLLM Benchmark 官方 · 精准 · 一键运行 选型原则:简单场景用 wrk,复杂场景用 Locust,定制需求用 Python,官方测试用 Benchmark

说白了,选工具就三个维度:并发能力、灵活程度、上手成本。我个人的经验是:

  • wrk:适合快速验证,测个大概的吞吐量。我经常用它做第一轮摸底。
  • Locust:适合模拟真实用户行为,比如思考时间、登录态等。我在做长稳测试时必用它。
  • 自定义Python脚本:当你要测流式输出、测特定prompt模板、测batch推理时,这是唯一选择。
  • vLLM内置Benchmark:官方出品,跟vLLM的兼容性最好。我建议你每次升级vLLM版本后,先用它跑一遍基线。

3.2 wrk:轻量级并发利器

wrk 是我个人最喜欢的压测工具之一。它基于 C 语言编写,用 epoll 做事件驱动,单机就能压出几十万 QPS。安装也简单:

# Ubuntu / Debian
sudo apt-get install wrk

# macOS
brew install wrk

# 从源码编译
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin/

基本用法:

wrk -t12 -c400 -d30s http://localhost:8000/v1/completions

参数说明:-t 是线程数,-c 是连接数,-d 是持续时间。我一般会先用 -t4 -c64 起步,慢慢往上加,直到找到拐点。

我的小技巧: wrk 默认只支持 HTTP 1.1,如果你要测 HTTPS 或者需要自定义请求头,记得用 -H 参数。比如测 vLLM 的 API 时,我通常会加上 -H "Authorization: Bearer xxx"

3.3 Locust:模拟真实用户行为

Locust 是用 Python 写的,最大的好处是你可以用代码定义用户行为。安装:

pip install locust

写一个简单的压测脚本:

# locustfile.py
from locust import HttpUser, task, between

class VLLMUser(HttpUser):
    wait_time = between(1, 3)  # 模拟用户思考时间
    
    @task
    def send_completion(self):
        payload = {
            "model": "meta-llama/Llama-2-7b-hf",
            "prompt": "What is the capital of France?",
            "max_tokens": 100
        }
        self.client.post("/v1/completions", json=payload)

启动:

locust -f locustfile.py --host=http://localhost:8000

然后打开浏览器访问 http://localhost:8089,就能看到 Web UI 了。你可以实时调整并发数,观察响应时间分布。

注意: Locust 的每个 worker 都是 Python 进程,受 GIL 限制。我曾经在压测时发现 Locust 自己先撑不住了——CPU 100% 但请求发不出去。解决办法是用 --processes 参数启动多进程,或者用 --web-host 0.0.0.0 允许远程访问。

3.4 自定义Python脚本:终极灵活性

当 wrk 和 Locust 都满足不了你时,就该自己写脚本了。我遇到过最典型的场景是测流式输出——vLLM 支持 SSE(Server-Sent Events),但 wrk 和 Locust 都不原生支持流式响应。

下面是我常用的模板:

import requests
import time
import concurrent.futures

def send_request(prompt):
    payload = {
        "model": "meta-llama/Llama-2-7b-hf",
        "prompt": prompt,
        "max_tokens": 200,
        "stream": True  # 开启流式输出
    }
    start = time.time()
    response = requests.post(
        "http://localhost:8000/v1/completions",
        json=payload,
        stream=True
    )
    # 读取流式响应
    for line in response.iter_lines():
        if line:
            pass  # 处理每个 token
    elapsed = time.time() - start
    return elapsed

# 并发测试
prompts = ["Hello"] * 100
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    results = list(executor.map(send_request, prompts))
    
print(f"平均耗时: {sum(results)/len(results):.2f}s")
print(f"P99: {sorted(results)[int(len(results)*0.99)]:.2f}s")
核心要点: 自定义脚本时,一定要关注 stream=True 的处理。很多人在测流式时只统计了首 token 时间,忽略了完整响应时间。我建议你同时记录 TTFT(Time to First Token)TPOT(Time per Output Token),这两个指标才是 vLLM 性能的关键。

3.5 vLLM内置Benchmark工具

vLLM 官方提供了一个 benchmark 脚本,就在源码的 benchmarks/ 目录下。安装 vLLM 后就能直接用:

# 克隆 vLLM 仓库
git clone https://github.com/vllm-project/vllm.git
cd vllm/benchmarks

# 运行 benchmark
python benchmark_throughput.py \
    --model meta-llama/Llama-2-7b-hf \
    --backend vllm \
    --input-len 512 \
    --output-len 128 \
    --num-prompts 1000 \
    --request-rate 10

参数说明:

参数 说明 我的建议值
--input-len 输入 prompt 长度 128 / 512 / 1024
--output-len 输出 token 长度 64 / 128 / 256
--num-prompts 总请求数 500 ~ 2000
--request-rate 每秒请求数(0 表示不限速) 从 1 开始逐步增加
我的经验: 内置 benchmark 的输出非常详细,会告诉你 throughput(tokens/s)、latency(ms)、TTFT 等指标。我每次调优完参数,都会先跑一遍 benchmark,看看有没有 regression。有一次我发现升级后 throughput 下降了 15%,排查了半天,原来是某个 kernel 的编译缓存没清理。

3.6 工具对比总结

最后给一张对比表,方便你快速决策:

工具 并发能力 灵活度 学习成本 适用场景
wrk ⭐⭐⭐⭐⭐ ⭐⭐ 快速摸底、吞吐量测试
Locust ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ 用户行为模拟、长稳测试
Python脚本 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ 流式测试、定制化场景
vLLM Benchmark ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ 官方基线、版本对比

嗯,工具就介绍到这里。我个人建议你把这四个工具都装上,因为不同阶段、不同场景需要不同的工具。别指望一把锤子敲遍所有钉子——我在项目里就吃过这个亏,用 wrk 测流式,结果数据全是错的。

装好工具后,下一件事就是搞清楚你到底要测什么指标。是吞吐量?是延迟?还是并发上限?不同的目标,压测方案完全不同。

专注资料整理