3. 压测工具选型与安装:wrk、locust、自定义Python脚本、vLLM内置benchmark工具介绍与安装
做性能压测,选对工具等于成功了一半。我见过不少团队,一上来就撸起袖子写脚本,结果测出来的数据根本没法看——要么是工具本身成了瓶颈,要么是压测方式跟实际场景对不上。
今天咱们就把市面上主流的几款压测工具捋一遍。我会结合自己的踩坑经历,告诉你什么场景该用什么工具,怎么装,怎么用。
3.1 工具选型:没有银弹,只有合适
先看一张图,帮你快速建立整体认知:
说白了,选工具就三个维度:并发能力、灵活程度、上手成本。我个人的经验是:
- 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 起步,慢慢往上加,直到找到拐点。
-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 了。你可以实时调整并发数,观察响应时间分布。
--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 开始逐步增加 |
3.6 工具对比总结
最后给一张对比表,方便你快速决策:
| 工具 | 并发能力 | 灵活度 | 学习成本 | 适用场景 |
|---|---|---|---|---|
| wrk | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐ | 快速摸底、吞吐量测试 |
| Locust | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 用户行为模拟、长稳测试 |
| Python脚本 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 流式测试、定制化场景 |
| vLLM Benchmark | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | 官方基线、版本对比 |
嗯,工具就介绍到这里。我个人建议你把这四个工具都装上,因为不同阶段、不同场景需要不同的工具。别指望一把锤子敲遍所有钉子——我在项目里就吃过这个亏,用 wrk 测流式,结果数据全是错的。
装好工具后,下一件事就是搞清楚你到底要测什么指标。是吞吐量?是延迟?还是并发上限?不同的目标,压测方案完全不同。