使用 `wrk` 对 vllm OpenAI API 接口进行压力测试:结合测试结果分析 POST 请求性能
在开发和部署 Web 服务时,压力测试是确保服务在高并发情况下稳定运行的关键步骤。wrk
是一个高效的 HTTP 压力测试工具,支持多线程和 Lua 脚本扩展,非常适合用来进行压力测试。本文将结合实际的测试结果,详细介绍如何使用 wrk
进行 POST 请求的压力测试,并分析测试数据。
1. 安装 wrk
首先,我们需要在系统中安装 wrk
。在基于 Debian 的系统(如 Ubuntu)上,可以使用以下命令进行安装:
sudo apt update
sudo apt install wrk
安装完成后,可以通过 wrk --version
命令来验证是否安装成功。
2. 准备 POST 请求的 Body 数据
在进行 POST 请求的压力测试时,通常需要指定请求的 Body 数据。我们可以通过 Lua 脚本来定义这些数据。假设我们有一个 Lua 文件 ./post.lua
,其内容如下:
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = [[
{
"model": "gpt-4",
"messages": [
{"role": "system", "content": "你是一个帮助助手。"},
{"role": "user", "content": "请告诉我2008年北京奥运会,中国队总共获得了多少枚金牌?"}
]
}
]]
在这个脚本中,我们定义了请求方法为 POST
,设置了 Content-Type
为 application/json
,并指定了请求的 Body 数据。
3. 执行压力测试
接下来,我们使用 wrk
来执行压力测试。假设我们的服务运行在 http://localhost:8000/v1/chat/completions
,我们通过以下命令来进行测试,并记录了三种不同配置下的测试结果。
测试 1:单线程单连接测试
首先,我们使用单线程和单个连接来进行测试,命令如下:
wrk -t1 -c1 -d10s -s ./post.lua http://localhost:8000/v1/chat/completions
测试结果:
Running 10s test @ http://localhost:8000/v1/chat/completions
1 threads and 1 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 246.58ms 274.18ms 1.43s 88.71%
Req/Sec 7.65 3.12 10.00 85.19%
54 requests in 10.00s, 30.83KB read
Requests/sec: 5.40
Transfer/sec: 3.08KB
分析:
- 平均延迟(Latency)为 246.58ms,最大延迟为 1.43s。
- 每秒处理的请求数(Requests/sec)为 5.40。
- 总共完成了 54 个请求。
测试 2:单线程 10 连接测试
接下来,我们增加连接数到 10 来进行测试,命令如下:
wrk -t1 -c10 -d10s -s ./resources/2_9/post.lua http://localhost:8000/v1/chat/completions
测试结果:
Running 10s test @ http://localhost:8000/v1/chat/completions
1 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 259.59ms 146.24ms 1.09s 85.20%
Req/Sec 40.76 13.56 80.00 75.00%
397 requests in 10.01s, 229.39KB read
Requests/sec: 39.66
Transfer/sec: 22.92KB
分析:
- 平均延迟(Latency)为 259.59ms,最大延迟为 1.09s。
- 每秒处理的请求数(Requests/sec)为 39.66。
- 总共完成了 397 个请求。
测试 3:单线程 20 连接测试
最后,我们进一步增加连接数到 20 来进行测试,命令如下:
wrk -t1 -c20 -d10s -s ./resources/2_9/post.lua http://localhost:8000/v1/chat/completions
测试结果:
Running 10s test @ http://localhost:8000/v1/chat/completions
1 threads and 20 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 314.60ms 164.85ms 1.74s 83.87%
Req/Sec 59.45 17.00 100.00 64.58%
582 requests in 10.01s, 332.09KB read
Socket errors: connect 0, read 0, write 0, timeout 2
Requests/sec: 58.15
Transfer/sec: 33.18KB
分析:
- 平均延迟(Latency)为 314.60ms,最大延迟为 1.74s。
- 每秒处理的请求数(Requests/sec)为 58.15。
- 总共完成了 582 个请求,但有 2 个请求超时。
4. 测试结果总结
通过以上三个测试,我们可以得出以下结论:
-
延迟分析:
- 随着连接数的增加,平均延迟和最大延迟都有所上升。例如,单连接时平均延迟为 246.58ms,而 20 连接时平均延迟增加到 314.60ms。
- 这表明服务在处理更多并发请求时,响应时间会有所增加。
-
吞吐量分析:
- 每秒处理的请求数随着连接数的增加而显著提高。单连接时为 5.40,10 连接时为 39.66,20 连接时为 58.15。
- 这说明服务能够处理更多的并发请求,但需要权衡延迟的增加。
-
错误分析:
- 在 20 连接测试中,出现了 2 个超时错误,这可能是因为服务在高并发情况下处理能力达到极限。
5. 优化建议
根据测试结果,我们可以考虑以下优化措施:
- 增加服务实例:通过负载均衡将请求分发到多个服务实例,以分担压力。
- 优化代码逻辑:减少请求处理时间,例如通过缓存、异步处理等方式。
- 调整服务器配置:增加 CPU、内存等资源,提升服务处理能力。
6. 总结
以下是将三次测试结果整理成的表格,方便对比和分析:
配置 | 线程数 (-t ) | 连接数 (-c ) | 平均延迟 (Avg Latency) | 最大延迟 (Max Latency) | 每秒请求数 (Requests/sec) | 总请求数 | 总传输数据 | 传输速率 (Transfer/sec) | 错误数 |
---|---|---|---|---|---|---|---|---|---|
wrk -t1 -c1 | 1 | 1 | 246.58ms | 1.43s | 5.40 | 54 | 30.83KB | 3.08KB | 0 |
wrk -t1 -c10 | 1 | 10 | 259.59ms | 1.09s | 39.66 | 397 | 229.39KB | 22.92KB | 0 |
wrk -t1 -c20 | 1 | 20 | 314.60ms | 1.74s | 58.15 | 582 | 332.09KB | 33.18KB | 2 (timeout) |
表格分析
-
延迟:
- 随着连接数的增加,平均延迟和最大延迟逐渐上升。
- 单连接时,平均延迟为 246.58ms。
- 10 连接时,平均延迟增加到 259.59ms。
- 20 连接时,平均延迟进一步增加到 314.60ms。
- 这表明服务在处理更多并发请求时,响应时间会变长。
- 随着连接数的增加,平均延迟和最大延迟逐渐上升。
-
吞吐量:
- 每秒请求数(Requests/sec)随着连接数的增加显著提高。
- 单连接时,每秒处理 5.40 个请求。
- 10 连接时,每秒处理 39.66 个请求。
- 20 连接时,每秒处理 58.15 个请求。
- 这说明服务能够处理更多的并发请求,但需要权衡延迟的增加。
- 每秒请求数(Requests/sec)随着连接数的增加显著提高。
-
错误数:
- 在 20 连接测试中,出现了 2 个超时错误,这可能是因为服务在高并发情况下处理能力达到极限。
-
传输数据:
- 随着请求数的增加,总传输数据和传输速率也相应提高。
- 单连接时,传输速率为 3.08KB/s。
- 10 连接时,传输速率为 22.92KB/s。
- 20 连接时,传输速率为 33.18KB/s。
- 随着请求数的增加,总传输数据和传输速率也相应提高。
通过表格可以清晰地看到:
- 增加连接数可以显著提高服务的吞吐量,但也会导致延迟增加。
- 在高并发情况下(如 20 连接),可能会出现超时错误,表明服务可能需要进一步优化以处理更高的负载。
这种表格化的展示方式非常适合用于测试报告或性能分析文档,能够直观地对比不同配置下的性能表现。
通过本文的介绍和测试结果分析,我们了解了如何使用 wrk
进行 POST 请求的压力测试,并通过增加连接数来模拟不同的并发场景。测试结果表明,服务在处理高并发请求时,延迟会增加,但吞吐量也会显著提高。通过合理的优化措施,我们可以进一步提升服务的性能和稳定性。
参考链接:
标签:
#wrk #压力测试 #HTTP #POST请求 #性能优化 #测试结果分析