zoukankan      html  css  js  c++  java
  • wrk(一)

    github地址:https://github.com/wg/wrk

    简介

    wrk是一种现代HTTP基准测试工具,C语言实现,自身性能好,能够在单个多核CPU上运行时产生大量负载。它结合了多线程设计和可扩展的事件通知系统,使用了一些操作系统特定的高性能 io 机制,如select、epoll、kqueue,以及复用了redis的'ae'异步事件驱动框架(确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知),可以用很少的线程压出很大的并发量。wrk除了能针对单个url进行测试外,还能构造不同的url、不同的参数进行测试,或者发送携带body的POST请求。

    wrk高级的地方就是使用了luajit,在不同阶段抛出来几个回调函数,只需要针对这些函数操作即可构造想要请求。典型的回调函数有以下几个:

    • function setup(thread) 在创建线程时调用
    • function init(args) 在线程启动时调用
    • function request() 每个请求都会调用,特别说明,此函数调用频繁,所以不要在这里写入耗时的操作,如果复杂的请求,在init函数就构造好,这里直接引用。
    • function delay()
    • function response(status, headers, body) 频繁调用

    环境搭建

    wrk支持大多数类UNIX系统(linux, mac, solaris等),需要操作系统支持LuaJIT和OpenSSL,大多数类Unix系统都支持。
    题外话,为什么很多人说 mac 是最好的开发环境. 因为可以同时得到 windows 和 linux 的优点. 多数 linux 下的开发工具都可以在 mac 上使用.

    要用 wrk,首先要编译 wrk,需要在机器上安装 git 和基本的c编译环境。 wrk 用 C 语言实现,代码很少,并且没有使用很多第三方库,所以编译基本不会遇到什么问题。
    make 成功以后在目录下有一个 wrk 文件,就是它了,可以把这个文件复制到其他目录, 比如 bin 目录或者在这个目录下执行。

    CentOS/RedHat/Fedora

    sudo yum groupinstall 'Development Tools'
    sudo yum install openssl-devel
    sudo yum install git
    git clone https://github.com/wg/wrk.git wrk
    cd wrk
    make  # 执行后会生成wrk可执行文件,执行./wrk 即可运行wrk
    # 配置软连接/把生成的wrk移到一个PATH目录下面(下面操作做一个即可)
    ln -s /xxx/xxx/wrk/wrk /usr/local/bin/wrk
    sudo cp wrk /usr/local/bin
    

    Ubuntu/Debian

    sudo apt-get install build-essential libssl-dev git -y
    git clone https://github.com/wg/wrk.git wrk
    cd wrk
    make   # 执行后会生成wrk可执行文件,执行./wrk 即可运行wrk
    # 配置软连接/把生成的wrk移到一个PATH目录下面(下面操作做一个即可)
    ln -s /xxx/xxx/wrk/wrk /usr/local/bin/wrk
    sudo cp wrk /usr/local/bin
    

    注:默认情况下wrk会使用自带的LuaJIT和OpenSSL,如果你想使用系统已安装的版本,可以使用WITH_LUAJIT和WITH_OPENSSL这两个选项来指定它们的路径。比如:

    make WITH_LUAJIT=/usr WITH_OPENSSL=/usr
    

    Windows

    wrk可以通过“Windows的Linux子系统”功能在Windows 10机器上使用(在Windows上的Ubuntu上也称为Bash)。
    打开Windows 10计算机的“开发人员模式”。
    在“打开或关闭Windows功能”中打开“Windows Subsystem for Linux”功能。
    在命令行中运行“bash”命令。将安装Ubuntu映像,并且很快就可以在Windows中运行。
    遵循Linux安装步骤,需要sudo make不仅仅是运行make。

    MacOS

    brew install wrk
    

    查看版本

    $ wrk -v
    wrk 4.1.0-4-g0896020 [epoll] Copyright (C) 2012 Will Glozer
    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版本是4.1.0-4-g0896020,使用了epoll。这意味着我们可以用少量的线程来跟被测服务创建大量连接,进行压测。

    基本使用

    命令行敲下wrk,可以看到使用帮助

    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连接数量,每个线程处理N =连接/线程
        -d, --duration    <T>  测试持续时间,如2s, 2m, 2h           
        -t, --threads     <N>  要使用的线程总数   
                                                          
        -s, --script      <S>  指定LuaJIT脚本路径       
        -H, --header      <H>  添加到请求中的HTTP报头。"User-Agent: wrk"     
            --latency          在压测结束后,打印详细的延迟统计信息   
            --timeout     <T>  超时时间(如果内部未接收到响应,则记录超时),也作-T
        -v, --version          打印正在使用的wrk的详细版本信息
                                                          
      <N>代表数字参数,支持国际单位 (1k, 1M, 1G)
      <T>代表时间参数,支持时间单位 (2s, 2m, 2h)
    

    做一次简单压测,分析下结果:

    wrk -t8 -c200 -d30s -T30s --latency  "http://www.bing.com"
    

    输出:

    Running 30s test @ http://www.bing.com
      8 threads and 200 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    46.67ms  215.38ms   1.67s    95.59%
        Req/Sec     7.91k     1.15k   10.26k    70.77%
      Latency Distribution
         50%    2.93ms
         75%    3.78ms
         90%    4.73ms
         99%    1.35s 
      1790465 requests in 30.01s, 684.08MB read
    Requests/sec:  59658.29
    Transfer/sec:     22.79MB
    

    以上使用8个线程200个连接,对bing首页进行了30秒的压测,并要求在压测结果中输出响应延迟信息。以下对压测结果进行简单注释:

    Running 30s test @ http://www.bing.com (压测时间30s)
      8 threads and 200 connections (共8个测试线程,200个连接)
      Thread Stats   Avg      Stdev     Max   +/- Stdev
      (线程状态) (平均值) (标准差)(最大值)(正负一个标准差占比)#标准差太大说明样本本身离散程度比较高,系统性能波动很大
        Latency    46.67ms  215.38ms   1.67s    95.59%
      (响应时间)
        Req/Sec     7.91k     1.15k   10.26k    70.77%
    (每个线程每秒钟的完成的请求数)
      Latency Distribution (延迟统计)
         50%    2.93ms    有50%的请求执行时间是在2.93ms内完成
         75%    3.78ms
         90%    4.73ms
         99%    1.35s    (99分位的延迟)
      1790465 requests in 30.01s, 684.08MB read (30.01秒内共处理完成了1790465个请求,读取了684.08MB数据)
      Socket errors: connect 0, read 5, write 0, timeout 64  (5个读错误,64个超时)
    Requests/sec:  59658.29 (平均每秒处理完成59658.29个请求,即QPS)
    Transfer/sec:     22.79MB (平均每秒读取数据22.79MB)
    

    说明:
    1、线程数 -t:一般线程数不宜设置过多,核数的2到4倍即可,线程过多反而因为线程切换造成效率降低,因为 wrk 不是使用每个连接一个线程的模型, 而是通过异步网络 io 提升并发量,所以网络通信不会阻塞线程执行,这也是 wrk 可以用很少的线程模拟大量网路连接的原因。而现在很多性能工具并没有采用这种方式, 而是采用提高线程数来实现高并发,并发量一旦设的很高,测试机自身压力就很大,测试效果反而下降。
    2、超时时间 -T:wrk 默认超时时间是1秒,这个有点短,一般设置为30秒。添加超时时间后运行,超时数就降低了。
    3、测试持续时间 -d:时间越长样本越准确,如果想测试系统的持续抗压能力,建议采用 loadrunner 这样的专业测试工具。
    4、响应时间延迟统计 --latency:具体查看响应时间分布情况。

    综上可以看出,wrk使用方便,结果简单清晰。并且因为非阻塞IO的使用,可以在普通的测试机上创建出大量的连接,从而达到较好的压测效果。

    参考文档:
    https://blog.csdn.net/zhiyuan_2007/article/details/78369066
    https://blog.csdn.net/xx123er/article/details/52401296
    https://blog.csdn.net/qq_41907450/article/details/87911520
    https://segmentfault.com/a/1190000014591330?utm_source=tag-newest
    https://blog.csdn.net/qq_38507328/article/details/86714496

  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/mika-blogs/p/11661292.html
Copyright © 2011-2022 走看看