nodejs-圧力テスト
6030 ワード
wrkはHTTP benchmarkテストを行うためのツールです.顕著な圧力を発生させることができる.Apache abよりも強力で、luaスクリプトを使用してPUTリクエストなどのより複雑なテストシーンをサポートできます.RestfulアーキテクチャのAPIインタフェースでは、テストがより便利です.
ソースアドレス:https://github.com/wg/wrk
きほんしよう
コマンドラインがwrkを叩くと、ヘルプが表示されます.簡単な圧力測定を行い、分析の結果
以上,8スレッド200個の接続を用いてbingトップページに対して30秒の圧力測定を行い,圧力測定結果に応答遅延情報の出力を要求した.以下では、測定結果について簡単に説明します.
wrkは使いやすく、結果がはっきりしていることがわかります.また、非ブロッキングIOの使用により、通常の試験機に大量の接続を作成することができ、より良い圧力測定効果を達成することができる.
Luaスクリプトを使用してwrk圧力測定をカスタマイズ
以上の2節ではwrkを取り付けて簡単に使用しましたが、このような簡単な圧力測定は私たちのニーズを満たすことができないかもしれません.たとえば、
1.wrkのLuaスクリプトに対するサポートwrkのサポートを紹介します.wrkのサポートは、起動段階、運転段階、終了段階の3つの段階で圧力測定をカスタマイズします.各テストスレッドには、独立したLua実行環境があります.
2.起動フェーズ
スクリプトファイルでsetupメソッドを実装すると、wrkはテストスレッドが初期化されているが起動していないときに呼び出されます.wrkは、テストスレッドごとにsetupメソッドを呼び出し、テストスレッドを表すオブジェクトthreadをパラメータとして送信します.setupメソッドでは、threadオブジェクトを操作し、情報を取得し、情報を格納し、スレッドを閉じることもできます.
3.運転段階
Initはテストスレッドによって呼び出され、実行フェーズに入ると1回だけ呼び出されます.wrkを起動するコマンドから、コマンドラインパラメータを取得することをサポートします.delayはrequestを送信するたびに呼び出され、delayが必要であれば、delayは対応する時間である.requestはリクエストを生成するために使用されます.リクエストのたびにメソッドが呼び出されるので、メソッドで時間のかかる操作をしないように注意してください.reponseは、応答が受信されるたびに呼び出される.パフォーマンスを向上させるために、この方法が定義されていない場合、wrkはheadersとbodyを解析しません.
4.終了フェーズ
この方法は試験中に1回しか呼び出されず,パラメータが与えられたオブジェクトから圧力測定結果を取得し,カスタマイズされた試験レポートを生成することができる.
tableタイプの変数wrkは、グローバル変数であり、tableを変更すると、すべてのリクエストに影響します.方法:
例 POST METHOD を使用 requestごとにパラメータ を交換要求毎に10 ms 遅延各スレッドは、まず認証を行い、認証後にtokenを取得して圧力測定 を行う.圧測HTTP pipelineをサポートするサービス
http://zhaox.github.io/benchmark/2016/12/28/wrk-guidelines
ソースアドレス: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().
例
// wrk, POST , body Content-Type 。
wrk.method = "POST"
wrk.body = "foo=bar&baz=quux"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
// request 1~10000000 uid, uid 。
request = function()
uid = math.random(1, 10000000)
path = "/test?uid=" .. uid
return wrk.format(nil, path)
end
function delay()
return 10
end
// 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
// 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