zoukankan      html  css  js  c++  java
  • wrk

    wrk 它是一个 HTTP 性能测试工具,内置了 LuaJIT,方便你根据实际需求,生成所需的请求负载,或者自定义响应的处理方法。为了得到应用程序的实际性能,就要求性能工具本身可以模拟用户的请求负载,而 iperf、ab 这类工具就无能为力了。幸运的是,我们还可以用 wrk

    安装

    wrk 工具本身不提供 yum 或 apt 的安装方法,需要通过源码编译来安装。比如,你可以运行下面的命令,来编译和安装 wrk:

    $ git  clone https://github.com/wg/wrk
    $ cd wrk
    $ apt-get install build-essential -y
    $ make
    $ sudo cp wrk /usr/local/bin/

    测试

    比如,我们可以用 wrk ,来重新测一下前面已经启动的 Nginx 的性能。

    # -c表示并发连接数1000,-t表示线程数为2
    $ wrk -c 1000 -t 2 http://192.168.0.30/
    Running 10s test @ http://192.168.0.30/
      2 threads and 1000 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    65.83ms  174.06ms   1.99s    95.85%
        Req/Sec     4.87k   628.73     6.78k    69.00%
      96954 requests in 10.06s, 78.59MB read
      Socket errors: connect 0, read 0, write 0, timeout 179
    Requests/sec:   9641.31
    Transfer/sec:      7.82MB

    这里使用 2 个线程、并发 1000 连接,重新测试了 Nginx 的性能。你可以看到,每秒请求数为 9641,吞吐量为 7.82MB,平均延迟为 65ms,比前面 ab 的测试结果要好很多。这也说明,性能工具本身的性能,对性能测试也是至关重要的。不合适的性能工具,并不能准确测出应用程序的最佳性能。

    当然,wrk 最大的优势,是其内置的 LuaJIT,可以用来实现复杂场景的性能测试。wrk 在调用 Lua 脚本时,可以将 HTTP 请求分为三个阶段,即 setup、running、done,如下图所示:

     比如,你可以在 setup 阶段,为请求设置认证参数(来自于 wrk 官方示例):

    -- example script that demonstrates response handling and
    -- retrieving an authentication token to set on all future
    -- requests
    
    token = nil
    path  = "/authenticate"
    
    request = function()
       return wrk.format("GET", path)
    end
    
    response = function(status, headers, body)
       if not token and status == 200 then
          token = headers["X-Token"]
          path  = "/resource"
          wrk.headers["X-Token"] = token
       end
    end

    而在执行测试时,通过 -s 选项,执行脚本的路径:

    $ wrk -c 1000 -t 2 -s auth.lua http://192.168.0.30/

    wrk 需要你用 Lua 脚本,来构造请求负载。这对于大部分场景来说,可能已经足够了 。不过,它的缺点也正是,所有东西都需要代码来构造,并且工具本身不提供 GUI 环境。像 Jmeter 或者 LoadRunner(商业产品),则针对复杂场景提供了脚本录制、回放、GUI 等更丰富的功能,使用起来也更加方便。

  • 相关阅读:
    Codeforces 379 F. New Year Tree
    「NOI2018」屠龙勇士
    「NOI2018」归程
    深入理解Java枚举类型(enum)
    2018.6.9-学习笔记
    String、StringBuffer与StringBuilder介绍
    HashMap和HashTable到底哪不同?
    HashMap详解
    List,Set和Map详解及其区别和他们分别适用的场景
    Java中高级面试题(1)
  • 原文地址:https://www.cnblogs.com/fanggege/p/14314412.html
Copyright © 2011-2022 走看看