wrk 性能测试工具

常用的性能测试工具,如 Apache ab, Apache JMeter (互联网公司用的较多),LoadRunner 等。
我们今天主要说一说轻量级性能测试工具 wrk。

一、什么是 wrk

wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。

二、 wrk 的优势&劣势

2.1 优势
在说 wrk 的优势之前,瞅一下 wrk 的 GitHub Star 数,也能侧面反映下它的可靠性:

wrk Star 数
Wow ! 截图为止, Star 数已经达到了 33.1k !!!
再来说说 wrk 的优势:

  • 轻量级性能测试工具;
  • 安装简单(相对 Apache ab 来说);
  • 学习曲线基本为零,几分钟就能学会咋用了;
  • 基于系统自带的高性能 I/O 机制,如 epoll, kqueue, 利用异步的事件驱动框架,通过很少的线程就可以压出很大的并发量;

2.2 劣势
wrk 目前仅支持单机压测,后续也不太可能支持多机器对目标机压测,因为它本身的定位,并不是用来取代 JMeter, LoadRunner 等专业的测试工具,wrk 提供的功能,对我们后端开发人员来说,应付日常接口性能验证还是比较友好的。

三、wrk 安装

wrk 只能被安装在类 Unix 系统上,所以我们需要一个 Linux 或者 MacOS 环境。Windows 10 安装需要开启自带的 Ubuntu 子系统。

3.1 Linux 安装
3.1.1 Ubuntu/Debian
apt-get install wrk
3.2.2 CentOS / RedHat / Fedora

依次执行如下命令:

sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git 
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 将可执行文件移动到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin

四、如何使用

安装成功了,要如何使用呢?

4.1 简单使用
wrk -t12 -c400 -d30s http://www.baidu.com

这条命令表示,利用 wrk 对 www.baidu.com 发起压力测试,线程数为 12,模拟 400 个并发请求,持续 30 秒。

4.2 wrk 子命令参数说明

除了上面简单示例中使用到的子命令参数,wrk 还有其他更丰富的功能,命令行中输入 wrk --help, 可以看到支持以下子命令:

[root@VM_0_5_centos ~]# wrk --help
Usage: wrk <options> <url>                            
  Options:                                            
    -c, --connections <N>  Connections to keep open   
    -d, --duration    <T>  Duration of test           
    -t, --threads     <N>  Number of threads to use   

    -s, --script      <S>  Load Lua script file       
    -H, --header      <H>  Add header to request      
        --latency          Print latency statistics   
        --timeout     <T>  Socket/request timeout     
    -v, --version          Print version details      

  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)

翻译一下:

使用方法: wrk <选项> <被测HTTP服务的URL>                            
  Options:                                            
    -c, --connections <N>  跟服务器建立并保持的TCP连接数量  
         连接数(connection)可以理解为并发数
         一般在测试过程中,这个值需要使用者不断向上调试,直至 QPS 达到一个临界点,便可认为此时的并发数为系统所能承受的最大并发量
         实际上,wrk 会为每个线程分配(c/t)个 socket 连接
         每个连接会先执行请求动作,然后等待直到收到响应后才会再发送请求,所以每个时间点的并发数大致等于连接数(connection)
    -d, --duration    <T>  压测时间           
    -t, --threads     <N>  使用多少个线程进行压测   
         一般是 CPU 核数,最大不要超过 CPUx2 核数,否则会带来额外的上下文切换,将线程数设置为 CPU 核数主要是为了 WRK 能最大化利用 CPU,使结果更准确(截取网上,暂时没看到官方推荐)
          和并发数没有直接关系
          查看 Linux CPU 总核数:
          grep processor /proc/cpuinfo |wc -l

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

  <N>代表数字参数,支持国际单位 (1k, 1M, 1G)
  <T>代表时间参数,支持时间单位 (2s, 2m, 2h)

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

4.3 测试报告

执行压测命令:

wrk -t12 -c400 -d30s --latency http://www.baidu.com

执行上面的压测命令,30 秒压测过后,生成如下压测报告:

root@dell:~# wrk  -t8  -c800  -d 60s --latency  https://openc2p.cn/web/login
Running 1m test @ https://openc2p.cn/web/login
  8 threads and 800 connections        #8个线程建立了800个tcp连接
                       (平均值)              (标准差)            (最大值) (正负一个标准差所占比例)
   Thread Stats          Avg                   Stdev                 Max       +/- Stdev
    Latency(延迟)        1.37s(平均处理时间)      140.50ms(标准差值)    1.98s      90.12%  #公式   Avg-stdev=标准时间/avg
 Req/Sec(每秒处理的请求)  11.64                   9.65                 151.00     88.92%
  Latency Distribution
     50%    1.35s 
     75%    1.40s 
     90%    1.49s 
     99%    1.88s #百分之99的请求在1.88s内处理完成
  3839 requests in 1.00m, 53.54MB read   #在一分钟之内 完成了3839个请求 读取了53.54MB数据
  Socket errors: connect 0, read 0, write 0, timeout 2018   #socket连接   connect 连接0,read 读取0,write 写入0,timeout 超时2018。
  Non-2xx or 3xx responses: 206
Requests/sec:     63.88  #一秒处理63.88个请求 QPS是63.88
Transfer/sec:      0.89MB #一秒返回的数据量时0.89MB
posted @ 2022-10-20 14:45  老夫聊发少年狂88  阅读(213)  评论(0编辑  收藏  举报