実行は 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    1486312.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 程度で落ち着きました。

f:id:K-jun1221:20211119034416p:plain

ベンチマークツールは 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 を使うようにしようと思います。それでは今回はこのへんで。