Bootstrap

使用 `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-Typeapplication/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. 测试结果总结

通过以上三个测试,我们可以得出以下结论:

  1. 延迟分析

    • 随着连接数的增加,平均延迟和最大延迟都有所上升。例如,单连接时平均延迟为 246.58ms,而 20 连接时平均延迟增加到 314.60ms。
    • 这表明服务在处理更多并发请求时,响应时间会有所增加。
  2. 吞吐量分析

    • 每秒处理的请求数随着连接数的增加而显著提高。单连接时为 5.40,10 连接时为 39.66,20 连接时为 58.15。
    • 这说明服务能够处理更多的并发请求,但需要权衡延迟的增加。
  3. 错误分析

    • 在 20 连接测试中,出现了 2 个超时错误,这可能是因为服务在高并发情况下处理能力达到极限。
5. 优化建议

根据测试结果,我们可以考虑以下优化措施:

  • 增加服务实例:通过负载均衡将请求分发到多个服务实例,以分担压力。
  • 优化代码逻辑:减少请求处理时间,例如通过缓存、异步处理等方式。
  • 调整服务器配置:增加 CPU、内存等资源,提升服务处理能力。
6. 总结

以下是将三次测试结果整理成的表格,方便对比和分析:

配置线程数 (-t)连接数 (-c)平均延迟 (Avg Latency)最大延迟 (Max Latency)每秒请求数 (Requests/sec)总请求数总传输数据传输速率 (Transfer/sec)错误数
wrk -t1 -c111246.58ms1.43s5.405430.83KB3.08KB0
wrk -t1 -c10110259.59ms1.09s39.66397229.39KB22.92KB0
wrk -t1 -c20120314.60ms1.74s58.15582332.09KB33.18KB2 (timeout)

表格分析

  1. 延迟

    • 随着连接数的增加,平均延迟和最大延迟逐渐上升。
      • 单连接时,平均延迟为 246.58ms。
      • 10 连接时,平均延迟增加到 259.59ms。
      • 20 连接时,平均延迟进一步增加到 314.60ms。
    • 这表明服务在处理更多并发请求时,响应时间会变长。
  2. 吞吐量

    • 每秒请求数(Requests/sec)随着连接数的增加显著提高。
      • 单连接时,每秒处理 5.40 个请求。
      • 10 连接时,每秒处理 39.66 个请求。
      • 20 连接时,每秒处理 58.15 个请求。
    • 这说明服务能够处理更多的并发请求,但需要权衡延迟的增加。
  3. 错误数

    • 在 20 连接测试中,出现了 2 个超时错误,这可能是因为服务在高并发情况下处理能力达到极限。
  4. 传输数据

    • 随着请求数的增加,总传输数据和传输速率也相应提高。
      • 单连接时,传输速率为 3.08KB/s。
      • 10 连接时,传输速率为 22.92KB/s。
      • 20 连接时,传输速率为 33.18KB/s。

通过表格可以清晰地看到:

  • 增加连接数可以显著提高服务的吞吐量,但也会导致延迟增加。
  • 在高并发情况下(如 20 连接),可能会出现超时错误,表明服务可能需要进一步优化以处理更高的负载。

这种表格化的展示方式非常适合用于测试报告或性能分析文档,能够直观地对比不同配置下的性能表现。

通过本文的介绍和测试结果分析,我们了解了如何使用 wrk 进行 POST 请求的压力测试,并通过增加连接数来模拟不同的并发场景。测试结果表明,服务在处理高并发请求时,延迟会增加,但吞吐量也会显著提高。通过合理的优化措施,我们可以进一步提升服务的性能和稳定性。


参考链接:

标签:
#wrk #压力测试 #HTTP #POST请求 #性能优化 #测试结果分析

;