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

  • 相关阅读:
    20145124陈威名《java程序设计》 寒假学习总结
    20145124 《Java程序设计》第1 周学习总结
    20145124陈威名《java程序设计》 第二周学习总结·
    20145124陈威名 《Java程序设计》第3周学习总结
    20145124《Java程序设计》第5周学习总结
    C/C++拾遗(三)
    c#或js url传参中文乱码解决方案
    Java设计模式之代理模式
    关于Docker&kubernetes的一些问题
    前端存储之indexedDB
  • 原文地址:https://www.cnblogs.com/mika-blogs/p/11661292.html
Copyright © 2011-2022 走看看