実行は Terminal で結果は Web から!benchmark ツール plow で遊んでみる。
こんにちは k-jun です。今回は星の数ほどあるベンチマークツールの一つ plow を試してみます。
https://github.com/six-ddc/plow
特徴として結果がブラウザで閲覧できるというのをあげており、その点はたしかに便利そうです。
Setup
$ brew install plow
Run
ヘルプはこんな感じ。
$ plow --help usage: plow [<flags>] <url> A high-performance HTTP benchmarking tool with real-time web UI and terminal displaying Examples: plow http://127.0.0.1:8080/ -c 20 -n 100000 plow https://httpbin.org/post -c 20 -d 5m --body @file.json -T 'application/json' -m POST Flags: --help Show context-sensitive help. -c, --concurrency=1 Number of connections to run concurrently -n, --requests=-1 Number of requests to run -d, --duration=DURATION Duration of test, examples: -d 10s -d 3m -i, --interval=200ms Print snapshot result every interval, use 0 to print once at the end --seconds Use seconds as time unit to print --body=BODY HTTP request body, if start the body with @, the rest should be a filename to read --stream Specify whether to stream file specified by '--body @file' using chunked encoding or to read into memory -m, --method="GET" HTTP method -H, --header=K:V ... Custom HTTP headers --host=HOST Host header -T, --content=CONTENT Content-Type header --cert=CERT Path to the client's TLS Certificate --key=KEY Path to the client's TLS Certificate Private Key -k, --insecure Controls whether a client verifies the server's certificate chain and host name --listen=":18888" Listen addr to serve Web UI --timeout=DURATION Timeout for each http request --dial-timeout=DURATION Timeout for dial addr --req-timeout=DURATION Timeout for full request writing --resp-timeout=DURATION Timeout for full response reading --socks5=ip:port Socks5 proxy --auto-open-browser Specify whether auto open browser to show Web charts --version Show application version. Flags default values also read from env PLOW_SOME_FLAG, such as PLOW_TIMEOUT=5s equals to --timeout=5s Args: <url> request url
今回は、actix-web にご協力を頂きます。localhost:8088 で起動して、いざ尋常に勝負。
$ plow http://localhost:8088/ Benchmarking http://localhost:8088/ using 1 connection(s). @ Real-time charts is listening on http://[::]:18888 Summary: Elapsed 45.4s Count 317111 2xx 317111 RPS 6984.779 Reads 0.859MB/s Writes 0.386MB/s Statistics Min Mean StdDev Max Latency 117µs 141µs 32µs 6.059ms RPS 6430.9 6981.28 192.46 7248.04 Latency Percentile: P50 P75 P90 P95 P99 P99.9 P99.99 130µs 145µs 164µs 187µs 249µs 530µs 774µs Latency Histogram: 139µs 307060 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 182µs 8300 ■ 253µs 1317 376µs 294 556µs 102 694µs 28 1.104ms 4 1.416ms 6
なんかいい感じ。並列度を変更して実験してみる。
$ plow http://localhost:8088/ -c 100 Benchmarking http://localhost:8088/ using 100 connection(s). @ Real-time charts is listening on http://[::]:18888 Summary: Elapsed 16.2s Count 709390 2xx 709390 RPS 43788.941 Reads 5.387MB/s Writes 2.422MB/s Statistics Min Mean StdDev Max Latency 260µs 2.281ms 1.972ms 57.008ms RPS 38219.68 43751.67 4139.92 51467.19 Latency Percentile: P50 P75 P90 P95 P99 P99.9 P99.99 1.601ms 2.358ms 3.859ms 5.497ms 10.98ms 20.886ms 33.886ms Latency Histogram: 2.181ms 692236 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 5.123ms 14863 ■ 12.634ms 2101 23.926ms 109 31.328ms 51 39.959ms 7 48.915ms 2 54.739ms 21
他のツールと比較してもヌルヌル動くバーがあるので使用していて楽しいですね。そして、並列度 100 で 40k RPS を達成する actix-web のヤバさよ...。 ではでは、ブラウザに表示してみます。
$ plow http://localhost:8088/ -c 100 --listen :18888
良い感じにグラフ表示ができました。やはりグラフ化は良いですね。情報量が一気に増えます。40k RPS が達成されていたのは最初の方だけで時間とともに低下。 30k 程度で落ち着きました。
ベンチマークツールは wrk がお気に入りだったのですが、この plow も良さそうです。グラフを簡単に作成できるところは 単純で純粋な強みですね。 wrk も比較で試してみました。wrk のほうがやっぱり性能は良さそうですが、情報量の少なさにびっくりですね。時系列のグラフデータがいかに偉大化が分かります。
$ wrk -d 60 -t 6 -c 100 http://127.0.0.1:8088 Running 1m test @ http://127.0.0.1:8088 6 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 2.44ms 2.18ms 61.88ms 91.17% Req/Sec 7.48k 1.37k 11.15k 69.83% 2678038 requests in 1.00m, 329.46MB read Requests/sec: 44631.71 Transfer/sec: 5.49MB
グラフ化が正義なので、plow のほうが良さそうに思えてきました。急所だけ wrk を使うようにしようと思います。それでは今回はこのへんで。