nodejs-圧力テスト

6030 ワード

wrkはHTTP benchmarkテストを行うためのツールです.顕著な圧力を発生させることができる.Apache abよりも強力で、luaスクリプトを使用してPUTリクエストなどのより複雑なテストシーンをサポートできます.RestfulアーキテクチャのAPIインタフェースでは、テストがより便利です.
ソースアドレス:https://github.com/wg/wrk
brew install wrk

きほんしよう
コマンドラインがwrkを叩くと、ヘルプが表示されます.
    : wrk                              
  Options:                                            
    -c, --connections             TCP      
    -d, --duration                     
    -t, --threads                     
                                                      
    -s, --script          Lua           
    -H, --header            HTTP    HTTP       
        --latency                ,           
        --timeout                
    -v, --version                 wrk       
                                                      
        ,       (1k, 1M, 1G)
        ,       (2s, 2m, 2h)
  • 簡単な圧力測定を行い、分析の結果
  • wrk -t8 -c200 -d30s --latency  "http://www.bing.com"
    

    以上,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
         75%    3.78ms
         90%    4.73ms
         99%    1.35s (99     )
      1790465 requests in 30.01s, 684.08MB read (30.01        1790465   ,   684.08MB  )
    Requests/sec:  59658.29 (        59658.29   )
    Transfer/sec:     22.79MB (        22.79MB)
    

    wrkは使いやすく、結果がはっきりしていることがわかります.また、非ブロッキングIOの使用により、通常の試験機に大量の接続を作成することができ、より良い圧力測定効果を達成することができる.
    Luaスクリプトを使用してwrk圧力測定をカスタマイズ
    以上の2節ではwrkを取り付けて簡単に使用しましたが、このような簡単な圧力測定は私たちのニーズを満たすことができないかもしれません.たとえば、POST METHODを使用してサーバと対話する必要があります.サービスの実際の使用シーンなどをシミュレートするために、リクエストごとに異なるパラメータを使用する必要がある場合があります.wrkはユーザーが–scriptを使用してLuaスクリプトを指定することをサポートし、圧力測定プロセスをカスタマイズし、個性的なニーズを満たす.
    1.wrkのLuaスクリプトに対するサポートwrkのサポートを紹介します.wrkのサポートは、起動段階、運転段階、終了段階の3つの段階で圧力測定をカスタマイズします.各テストスレッドには、独立したLua実行環境があります.
    2.起動フェーズ
    function setup(thread)
    

    スクリプトファイルでsetupメソッドを実装すると、wrkはテストスレッドが初期化されているが起動していないときに呼び出されます.wrkは、テストスレッドごとにsetupメソッドを呼び出し、テストスレッドを表すオブジェクトthreadをパラメータとして送信します.setupメソッドでは、threadオブジェクトを操作し、情報を取得し、情報を格納し、スレッドを閉じることもできます.
    thread.addr             - get or set the thread's server address
    thread:get(name)        - get the value of a global in the thread's env
    thread:set(name, value) - set the value of a global in the thread's env
    thread:stop()           - stop the thread
    

    3.運転段階
    function init(args)
    function delay()
    function request()
    function response(status, headers, body)
    

    Initはテストスレッドによって呼び出され、実行フェーズに入ると1回だけ呼び出されます.wrkを起動するコマンドから、コマンドラインパラメータを取得することをサポートします.delayはrequestを送信するたびに呼び出され、delayが必要であれば、delayは対応する時間である.requestはリクエストを生成するために使用されます.リクエストのたびにメソッドが呼び出されるので、メソッドで時間のかかる操作をしないように注意してください.reponseは、応答が受信されるたびに呼び出される.パフォーマンスを向上させるために、この方法が定義されていない場合、wrkはheadersとbodyを解析しません.
    4.終了フェーズ
    function done(summary, latency, requests)
    

    この方法は試験中に1回しか呼び出されず,パラメータが与えられたオブジェクトから圧力測定結果を取得し,カスタマイズされた試験レポートを生成することができる.
                   
      :wrk
    
     wrk = {
        scheme  = "http",
        host    = "localhost",
        port    = nil,
        method  = "GET",
        path    = "/",
        headers = {},
        body    = nil,
        thread  = ,
      }
    

    tableタイプの変数wrkは、グローバル変数であり、tableを変更すると、すべてのリクエストに影響します.方法:wrk.fomat wrk.lookup wrk.connect
      function wrk.format(method, path, headers, body)
    
        wrk.format returns a HTTP request string containing the passed parameters
        merged with values from the wrk table.
                 wrk,    HTTP rquest string。
    
      function wrk.lookup(host, service)
    
        wrk.lookup returns a table containing all known addresses for the host
        and service pair. This corresponds to the POSIX getaddrinfo() function.
          host service(port/well known service name),              。
    
      function wrk.connect(addr)
    
        wrk.connect returns true if the address can be connected to, otherwise
        it returns false. The address must be one returned from wrk.lookup().
                               
    

  • POST METHOD
  • を使用
    //         wrk,         POST  ,    body Content-Type 。
    wrk.method = "POST"
    wrk.body   = "foo=bar&baz=quux"
    wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
    
  • requestごとにパラメータ
  • を交換
    //    request       1~10000000   uid,      uid    。
    request = function()
       uid = math.random(1, 10000000)
       path = "/test?uid=" .. uid
       return wrk.format(nil, path)
    end
    
  • 要求毎に10 ms
  • 遅延
    function delay()
       return 10
    end
    
  • 各スレッドは、まず認証を行い、認証後にtokenを取得して圧力測定
  • を行う.
    //    token    ,   /authenticate  。     ,  token   path /resource。
    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
    
  • 圧測HTTP pipelineをサポートするサービス
  • //    init      HTTP request       ,          ,   HTTP pipeline。
    init = function(args)
       local r = {}
       r[1] = wrk.format(nil, "/?foo")
       r[2] = wrk.format(nil, "/?bar")
       r[3] = wrk.format(nil, "/?baz")
    
       req = table.concat(r)
    end
    
    request = function()
       return req
    end
    

    http://zhaox.github.io/benchmark/2016/12/28/wrk-guidelines