寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

ab(ApacheBench) 的な負荷ツール hey を試す

f:id:chidakiyo:20190722182814j:plain

ちょっとした負荷試験をしたい場合に、abが入っていればいいのですが、そうも行かない場合も多いので、go製で簡単にインストールできる hey を試します。

負荷ツールのタイプは2種類ある

HTTPの負荷ツールには2タイプあります。

  1. レスポンスが返される限り全力でリクエストするタイプ(秒あたりのアクセス数が一定ではないタイプ)
  2. 時間あたり定められた数のリクエストを決められた時間実行するタイプ

簡単にするため、

  1. 全力タイプ

  2. 定量タイプ

とこの記事では呼んでみますw

全力タイプ には、この記事で紹介する hey や、 ab(ApacheBendh)などがあります。

定量タイプ には、Gatling や、以前私が記事を書いた Vegeta などがあります。

アプリケーションがどこまで耐えられるか死ぬまで殴るというテストの際には 1. の全力タイプ、 メモリリークや長期の動作の確認などのためのテストの際には 2. の定量タイプなどを利用する場合が多いと思います。

heyのインストール

閑話休題

heyはgo製ツールなので、goがインストールされた環境で以下のコマンドで簡単にインストールすることができます。

go get -u github.com/rakyll/hey

単純なGETリクエストをしてみる

単純なGETリクエストをしてみます。

hey https://chidakiyo.example.com // URLはサンプルです

結果はこんな感じ

Summary:
  Total:    0.2199 secs
  Slowest:  0.1970 secs
  Fastest:  0.0055 secs
  Average:  0.0539 secs
  Requests/sec: 909.5376


Response time histogram:
  0.005 [1] |
  0.025 [149]   |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.044 [0] |
  0.063 [0] |
  0.082 [0] |
  0.101 [0] |
  0.120 [0] |
  0.140 [0] |
  0.159 [0] |
  0.178 [0] |
  0.197 [50]    |■■■■■■■■■■■■■


Latency distribution:
  10% in 0.0068 secs
  25% in 0.0073 secs
  50% in 0.0080 secs
  75% in 0.1895 secs
  90% in 0.1921 secs
  95% in 0.1939 secs
  99% in 0.1969 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0241 secs, 0.0055 secs, 0.1970 secs
  DNS-lookup:   0.0169 secs, 0.0000 secs, 0.0693 secs
  req write:    0.0001 secs, 0.0000 secs, 0.0017 secs
  resp wait:    0.0291 secs, 0.0050 secs, 0.1010 secs
  resp read:    0.0004 secs, 0.0001 secs, 0.0021 secs

Status code distribution:
  [200] 200 responses

パラメータに関して

先程 hey https://chidakiyo.example.com という形で実行していますが、default値によるアクセス数(並列数)でリクエストが実行されています。

オプションはほぼabと同じ(ような気がしている)で、

-n オプションが送信するリクエスト数(デフォルトは200)

-c オプションが並列に実行する数(デフォルトは50)

となるので、オプションを省いても以下のコマンドと等価になります。

hey -n 200 -c 50 https://chidakiyo.example.com

その他オプションはこのような感じになります。

-q レートリミット。 最初に全力タイプとしていましたが、定量タイプとしても使えるようです。(デフォルトは設定されていません)

-z 期間指定。 -z 10s, -z 3m などのように実行する期間を指定できます。

-o 出力タイプ。 -o csv とすることでCSVでの出力もできます。

-m HTTP method。 GETのサンプルを実行していますが、POST, PUT, DELETE, HEAD, OPTIONSも実行できます。

-H HTTP Header。 HTTPヘッダーを付与することができます。

-t リクエストごとのタイムアウト。(デフォルトは20秒、0で無限とできる)

-A HTTP Accept header。

-d HTTP Request body。

-D HTTP Request body をファイルから入力する。

-T Content-type。

-a Basic認証 username:password の形式で渡す

-x HTTP Proxy

-h2 HTTP/2 を有効化する

そんなかんじ。