wrk 简介

wrk 是一款针对 HTTP 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。wrk 是复用了 redis 的 ae 异步事件驱动框架,准确来说 ae 事件驱动框架并不是 redis 发明的,它来自于 Tcl 的解释器 jim,这个小巧高效的框架,因为被 redis 采用而被大家所熟知

wrk 安装

# Ubuntu/Debian
apt-get install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git wrk
cd wrk && make -j4
cp wrk /usr/local/bin

# CentOS/RedHat
yum groupinstall 'Development Tools'
yum install -y openssl-devel git
git clone https://github.com/wg/wrk.git wrk
cd wrk && make -j4
cp wrk /usr/local/bin

验证安装是否成功

wrk -v    # 查看版本
wrk  [epoll] Copyright (C) 2012 Will Glozer
Usage: wrk <options> <url>                            
  Options:                                            
    -c, --connections <N>  Connections to keep open 跟服务器建立并保持的TCP连接数量
    -d, --duration    <T>  Duration of test 压测时间           
    -t, --threads     <N>  Number of threads to use 使用多少个线程进行压测   

    -s, --script      <S>  Load Lua script file 指定Lua脚本路径       
    -H, --header      <H>  Add header to request 为每一个HTTP请求添加HTTP头      
        --latency          Print latency statistics 在压测结束后打印延迟统计信息   
        --timeout     <T>  Socket/request timeout 超时时间     
    -v, --version          Print version details 打印wrk的详细版本信息      

  Numeric arguments may include a SI unit (1k, 1M, 1G) 代表数字参数支持国际单位
  Time arguments may include a time unit (2s, 2m, 2h) 代表时间参数支持时间单位

关于线程数:并不是设置得越大,压测效果越好,线程设置过大,反而会导致线程切换过于频繁,效果降低,一般来说,推荐设置成压测机器 CPU 核心数的 2 倍到 4 倍

wrk 测试

wrk -t2 -c10 -d20s --latency http://10.244.169.184
Running 20s test @ http://10.244.169.184
  2 threads and 10 connections
  Thread Stats   Avg(平均值)      Stdev(标准差)     Max(最大值)   +/- Stdev(正负一个标准差所占比例)
    Latency(延迟)     7.08ms    9.11ms  85.30ms   88.17%
    Req/Sec(每秒请求数)     1.08k   524.84     2.34k    59.13%
  Latency Distribution (延迟分布)
     50%    3.34ms(50%的请求在3.34ms效应)
     75%    7.07ms
     90%   18.22ms
     99%   45.30ms
  42574 requests in 20.10s, 34.51MB read
Requests/sec:   2117.96(QPS 即平均每秒处理请求数为 2117.96)
Transfer/sec:   1.72MB(平均每秒流量)

这仅仅是一个 get 请求的测试。如果想进行 POST 请求,或者每一次请求的参数都不一样,用来模拟用户使用的实际场景,可以使用 Lua 脚本来进行一系列更复杂的测试