编辑
2024-10-15
压测
00

目录

wrk介绍
安装
基本用法
1. 常用选项 (Options):
2. 示例:
4. 注意事项:
实例
1. Netty demo 压测
2.

wrk介绍

wrk 是一款现代化的 HTTP 基准测试(benchmarking)工具,它能够在单机多核 CPU 上产生显著的负载。它结合了多线程设计和异步事件驱动模型(如 epoll, kqueue),因此效率非常高。

主要特点:

  • 高性能: 利用系统扩展机制(epoll, kqueue)和多线程,可以轻松产生数十万甚至更高的 QPS(取决于机器性能和网络)。
  • 易用性: 命令行接口简单直观。
  • 可扩展性: 支持通过 Lua 脚本定制请求生成、响应处理和报告逻辑,非常灵活。

安装

  • macOS (使用 Homebrew):
    bash
    brew install wrk
  • Linux (Debian/Ubuntu):
    bash
    sudo apt-get update sudo apt-get install wrk
    (注意:某些发行版的仓库可能版本较旧,推荐从源码编译)
  • 从源码编译 (推荐,通常能获取最新版本):
    bash
    git clone https://github.com/wg/wrk.git cd wrk make # 可选:将编译好的 wrk 可执行文件复制到 PATH 路径下,如 /usr/local/bin # sudo cp wrk /usr/local/bin/
    编译通常需要 openssl 开发库(如 libssl-dev on Debian/Ubuntu)。

基本用法

bash
wrk [options] <url>
  • <url>: 你要测试的目标 URL。

1. 常用选项 (Options):

  • -t<N>--threads=<N>: 使用的线程数 (N)。通常设置为 CPU 核心数。
  • -c<N>--connections=<N>: 保持的 TCP 连接总数 (N)。这些连接会在线程间共享。
  • -d<T>--duration=<T>: 测试持续时间 (T)。例如 10s (10秒), 2m (2分钟), 1h (1小时)。
  • -s<S>--script=<S>: 加载指定的 Lua 脚本 (S),用于自定义请求等。
  • -H<H>--header=<H>: 添加 HTTP Header。例如 -H "Content-Type: application/json"。可以多次使用以添加多个 Header。
  • --latency: 打印详细的延迟百分位统计信息。
  • --timeout <T>: 请求超时时间。例如 2s
  • POST 请求或带 Body 的请求:通常需要配合 Lua 脚本 (-s) 来实现。

2. 示例:

  • 简单 GET 测试: 使用 4 个线程,保持 200 个连接,测试 30 秒。
    bash
    wrk -t4 -c200 -d30s http://your-target-service.com/api/resource
  • 显示延迟统计:
    bash
    wrk -t4 -c200 -d30s --latency http://your-target-service.com/api/resource
  • 添加 Header:
    bash
    wrk -t4 -c200 -d30s -H "Authorization: Bearer your_token" http://your-target-service.com/api/resource
  • 使用 Lua 脚本进行 POST 请求 (假设脚本名为 post.lua):
    bash
    wrk -t4 -c200 -d30s -s ./post.lua http://your-target-service.com/api/submit
    一个简单的 post.lua 示例:
    lua
    wrk.method = "POST" wrk.body = '{"key": "value", "number": 123}' wrk.headers["Content-Type"] = "application/json"

3. 结果解读:

wrk 的输出通常包含:

  • Running <duration> test @ <url>
  • <threads> threads and <connections> connections
  • Thread Stats Avg Stdev Max +/- Stdev (延迟统计)
    • Latency
    • Req/Sec (每个线程的平均 QPS)
  • Latency Distribution (如果使用了 --latency):不同百分位的延迟。
  • <N> requests in <duration>, <size> read (总请求数、总耗时、读取的总数据量)
  • Requests/sec: <QPS> (最重要的指标:平均每秒请求数)
  • Transfer/sec: <throughput> (平均每秒传输数据量)
  • Socket errors: connect <N>, read <N>, write <N>, timeout <N> (各种错误计数,需要关注)

4. 注意事项:

  • 压测发起端(运行 wrk 的机器)自身的性能(CPU、内存、网络带宽、文件描述符限制 ulimit -n)会影响测试结果的上限。
  • 确保压测环境和目标服务之间的网络稳定且延迟较低,否则网络会成为瓶颈。
  • 从单机发起的连接数 -c 不宜设置过高,否则可能耗尽本地端口或触发操作系统限制。如果需要极高的并发,考虑使用分布式压测方案。
  • 压测可能会对目标服务造成巨大压力,请务必在授权和可控的环境下进行,并提前通知相关方。

实例

1. Netty demo 压测

sh
# Netty demo 压测 p99 3ms内 liangfeng@Golovins-MacBook-Pro ~ % wrk -c 40 -d 30s --latency http://127.0.0.1:8808/test Running 30s test @ http://127.0.0.1:8808/test 2 threads and 40 connections Thread Stats Avg Stdev Max +/- Stdev Latency 302.42us 2.05ms 113.10ms 98.98% Req/Sec 118.12k 12.98k 233.67k 89.18% Latency Distribution 50% 109.00us 75% 162.00us 90% 353.00us 99% 2.42ms 7063194 requests in 30.10s, 734.22MB read Requests/sec: 234632.93 Transfer/sec: 24.39MB liangfeng@Golovins-MacBook-Pro ~ %

2.