使用 wrk2 压测 TensorRT-LLM (trtllm-serve) 实战
使用 wrk2 压测 TensorRT-LLM (trtllm-serve) 实战记录
一、测试背景与目标
在完成 TensorRT-LLM 部署后,本次使用 wrk2 对 trtllm-serve 服务进行恒定速率压测。wrk2 是 wrk 的改进版,支持通过 -R 参数指定恒定请求速率,并修正了“协调遗漏”问题,能更真实地反映用户等待体验。
核心目标:
- 掌握 wrk2 的安装与基本用法。
- 编写 Lua 脚本以发送 POST 请求给 vLLM/TRT-LLM 的 OpenAI 兼容接口。
- 通过阶梯调整发送速率,定位
trtllm-serve的性能拐点。 - 验证超时参数对压测结果的影响。
二、wrk2 安装与准备
2.1 安装 wrk2
# 从 GitHub 克隆源码并编译
git clone https://github.com/giltene/wrk2.git
cd wrk2
make
# 编译成功后,可执行文件在当前目录
./wrk --version
2.2 编写 Lua 压测脚本
创建一个 wrk2_post.lua 文件,用于发送 POST 请求:
-- wrk2_post.lua
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = [[
{
"model": "/mnt/workspace/model/Qwen2.5-7B-Instruct",
"messages": [
{"role": "user", "content": "请用一句话介绍你自己。"}
],
"max_tokens": 50,
"stream": false
}
]]
三、压测执行与结果分析
3.1 测试一:-R 10(发送速率 10 req/s)
./wrk -t2 -c10 -d30s -R 10 --latency -s wrk2_post.lua http://localhost:8000/v1/chat/completions
| 指标 | 数值 |
|---|---|
| 实际吞吐 | 3.40 req/s |
| P50 延迟 | 15.61 秒 |
| P99 延迟 | 20.32 秒 |
| Timeout 错误 | 53 |
结论:发送速率远超服务端处理能力(约 4 req/s),导致请求严重堆积、大量超时。P50 延迟高达 15.6 秒,不可用。
3.2 测试二:-R 4(发送速率 4 req/s)
./wrk -t2 -c10 -d30s -R 4 --latency -s wrk2_post.lua http://localhost:8000/v1/chat/completions
| 指标 | 数值 |
|---|---|
| 实际吞吐 | 4.00 req/s |
| P50 延迟 | 1.48 秒 |
| P99 延迟 | 2.80 秒 |
| Timeout 错误 | 30 |
结论:发送速率匹配服务端处理能力后,延迟从 15.6 秒断崖式下降至 1.48 秒。剩余 30 个 timeout 是因为 wrk2 默认超时(2 秒)短于 P75 延迟(2.03 秒),属于误判。
3.3 测试三:-R 4 + 超时 5 秒
./wrk -t2 -c10 -d30s -R 4 --latency --timeout 5s -s wrk2_post.lua http://localhost:8000/v1/chat/completions
| 指标 | 数值 |
|---|---|
| 实际吞吐 | 4.00 req/s |
| P50 延迟 | 1.58 秒 |
| P99 延迟 | 2.75 秒 |
| Timeout 错误 | 0 |
结论:将超时设置为 5 秒后,所有 120 个请求全部成功,验证了系统在 4 req/s 负载下的稳定性。P50/P99 延迟稳定在 1.58s/2.75s,无长尾。
四、性能拐点定位
| 发送速率 (-R) | 实际吞吐 (req/s) | P50 延迟 | P99 延迟 | Timeout 错误 | 结论 |
|---|---|---|---|---|---|
| 10 | 3.40 | 15.61s | 20.32s | 53 | 严重过载,队列堆积 |
| 4 | 4.00 | 1.48s | 2.80s | 30(误判) | 匹配点,延迟骤降 |
| 4(超时 5s) | 4.00 | 1.58s | 2.75s | 0 | 最佳工作点,稳定无错误 |
核心结论:
trtllm-serve在--max_batch_size 4配置下的实际处理能力约为 4 req/s。- 发送速率超过此值时,延迟和错误率急剧上升。
- wrk2 的默认超时(2 秒)可能严于服务端实际延迟,导致“假性超时”,建议根据 P90/P99 延迟设置合理的
--timeout。
五、注意事项与踩坑记录
| 问题 | 原因 | 解决方案 |
|---|---|---|
-nan 出现在 Req/Sec 列 |
wrk2 恒定速率模式下的显示问题 | 忽略,看底部的 Requests/sec |
| 大量 timeout 错误 | wrk2 默认超时 2 秒过短 | 使用 --timeout 5s 或更高 |
Throughput MUST be specified |
wrk2 强制要求 -R 参数 |
必须指定 -R 速率 |
-R 参数含义混淆 |
-R 是所有线程的总速率 |
单线程速率 = -R / 线程数 |
六、总结
本次测试完整走通了 wrk2 对 trtllm-serve 的压测流程,并通过阶梯调整发送速率,精确定位了当前配置下的性能拐点(4 req/s)。测试数据表明:
- 性能拐点清晰:发送速率超过 4 req/s 后,系统从“稳定”迅速转为“过载”。
- 延迟分布健康:在最佳工作点(4 req/s)下,P50 延迟 1.58 秒,P99 延迟 2.75 秒,无长尾。
- 超时参数关键:wrk2 的
--timeout必须大于服务的 P90/P99 延迟,否则会产生大量“假性超时”。
这些数据为后续调整 max_batch_size、优化显存配置或升级硬件提供了可靠的基准。
测试环境:ModelScope 免费实例(A10 22GB),TensorRT-LLM 1.2.1,Qwen2.5-7B-Instruct,wrk2。
浙公网安备 33010602011771号