平和より自由より正しさより♪(Beyond The Time/TM Network より)… JMeter より ab より httperf より…のかっぱ (@inokara)です。

はじめに

JMeter よりもお手軽な Web 負荷テストツールを模索していて Siege があったのを思い出しました。

これらを書いた時にはあまり Siege のことには触れていなかったと記憶しているので改めて Siege について書いてみたいと思います。

そもそも Siege とは

siege とは HTTP のロードテスト、ベンチマークユーティリティ。Basic 認証、cookie や HTTPS もサポートしていてブラウザのシュミレートや同時接続、稼働時間も指定可能でし、か、も、コマンドラインからサクッと使えるツールとなっておりやす。

以下、参考にさせて頂きました。

ありがとうございます。

導入

Amazon Linux に導入する場合には以下のような手順にて導入します。残念ながらパッケイジは用意されておりませんので自前でビルドします。

sudo yum install gcc make openssl-devel
wget http://download.joedog.org/siege/siege-3.0.5.tar.gz
tar zxvf siege-3.0.5.tar.gz
cd siege-3.0.5
./configure && make
sudo make install

導入後に .siegerc をホームディレクトリ以下にコピーします。

cd siege-3.0.5
cp doc/siegerc ~/.siegerc

以上です。

簡単ですな。

Hello Siege

とりあえずヘルプ

風呂から上がったらとりあえずビールのように、ツールをインストールしたらとりあえずヘルプ。

$ siege -h
SIEGE 3.0.5
Usage: siege [options]
       siege [options] URL
       siege -g URL
Options:
  -V, --version             VERSION, prints the version number.
  -h, --help                HELP, prints this section.
  -C, --config              CONFIGURATION, show the current config.
  -v, --verbose             VERBOSE, prints notification to screen.
  -q, --quiet               QUIET turns verbose off and suppresses output.
  -g, --get                 GET, pull down HTTP headers and display the
                            transaction. Great for application debugging.
  -c, --concurrent=NUM      CONCURRENT users, default is 10
  -i, --internet            INTERNET user simulation, hits URLs randomly.
  -b, --benchmark           BENCHMARK: no delays between requests.
  -t, --time=NUMm           TIMED testing where "m" is modifier S, M, or H
                            ex: --time=1H, one hour test.
  -r, --reps=NUM            REPS, number of times to run the test.
  -f, --file=FILE           FILE, select a specific URLS FILE.
  -R, --rc=FILE             RC, specify an siegerc file
  -l, --log[=FILE]          LOG to FILE. If FILE is not specified, the
                            default is used: PREFIX/var/siege.log
  -m, --mark="text"         MARK, mark the log file with a string.
  -d, --delay=NUM           Time DELAY, random delay before each requst
                            between 1 and NUM. (NOT COUNTED IN STATS)
  -H, --header="text"       Add a header to request (can be many)
  -A, --user-agent="text"   Sets User-Agent in request
  -T, --content-type="text" Sets Content-Type in request

Copyright (C) 2013 by Jeffrey Fulmer, et al.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

簡単にオプションをまとめました。

オプション 意味
-V, –version バージョン表示
-h, –help ヘルプ表示
-C, –config コンフィグファイルを指定
-v, –verbose アクセスの状態を標準出力に表示
-q, –quiet verbose をオフにしてテスト出力を抑制
-g, –get HTTP リクエストの GET メソッドを利用して
HTTP ヘッダを取得してトランザクションを表示する
-c, –concurrent=NUM 同時接続ユーザーを指定でデフォルトは 10
-i, –internet INTERNET ユーザーモードで URL のリストからランダムにアクセスする
-b, –benchmark ベンチマークモードでリクエスト間隔を置かない
(デフォルトは 1 秒間のリクエスト間隔を置く)
-t, –time=NUMm テストの時間を指定(S = 秒、M = 分、H = 時間)
-r, –reps=NUM テストにおける毎秒のリクエスト数
-f, –file=FILE URL のリストファイルを指定
-R, –rc=FILE siegerc ファイルを指定(デフォルトは ~/.siegerc)
-l, –log[=FILE] ログファイルのパスを指定する(指定が無い場合には PREFIX/var/siege.log)
-m, –mark=”text” ログファイル内にマーキング(区切り)文字を入れることが出来る
-d, –delay=NUM リクエスト間の間隔を指定(デフォルトは 1 秒)
-H, –header=”text” なんとリクエストヘッダを付与することが出来る
-A, –user-agent=”text” おまけに User-Agent の指定も可
-T, –content-type=”text” さらに、さらに Content-Type の指定も可能…

とまあ、JMeter よりも機能は簡素化されていますが同時ユーザーを指定したり試行時間を指定したり、ヘッダや UA の指定も出来たりでお手軽に使えるツールとしてはオプションは豊富ではないかなと思います。

とりあえず使う

例えば、example.com に対して、同時ユーザー数は 30 でリクエスト数 5 で 10 秒間の連続負荷を掛けたい場合には以下のように実行します。

siege -c 30 -r 5 --time=10S --log=/tmp/siege.log http://example.com

以下のように出力されます。
Siege の実行結果

Lifting the server siege... done. 以降が結果となります。結果については下記のような意味があります。

項目 意味 出力例
Transactions: リクエスト数 506 hits
Availability: 成功率 100.00 %
Elapsed time: 処理時間 9.51 secs
Data transferred: 転送量 0.13 MB
Response time: 平均のレスポンス時間 0.01 secs
Transaction rate: 毎秒のリクエスト数 53.21 trans/sec
Throughput: スループット 0.01 MB/sec
Concurrency: 平均の同時接続数 0.48
Successful transactions: 成功したリクエスト数 506
Failed transactions: 失敗したリクエスト数 0
Longest transaction: 1 リクエスト当たりの最長秒数 0.02
Shortest transaction: 1 リクエスト当たりの最短秒数 0.00

また、ログファイル(/tmp/siege.log)も指定しているので確認してみると以下のようなログが記録されています。

/tmp/siege.log
      Date & Time,  Trans,  Elap Time,  Data Trans,  Resp Time,  Trans Rate,  Throughput,  Concurrent,    OKAY,   Failed
2014-08-21 07:24:47,    506,       9.51,           0,       0.01,       53.21,        0.00,        0.48,     506,       0

出力結果をカンマ区切りで記録しています。ちなみに、このログにはデフォルトで追記となるので定期的に実行させることで実行時間時点のパフォーマンスを計測、記録して時間帯によるトレンドを追うことも可能です。

tips

ファイルディスクリプタ

--concurrent=NUM の値を大きくすればする程気を使う必要があるようです。ちなみに、ちょい大きめのリクエストを投げる場合には /etc/security/limits.conf を以下のようにして実行しています。

* soft nofile 65536
* hard nofile 65536

この値が適切かどうかは conncurrent やリクエストを投げる環境のリソース次第となるかと思います。

さいごに

JMeter はちょっと…(難しそう、めんどくさそう、そもそも負荷高そう)と考えている方にちょっとオススメです。

元記事はこちらです。
Siege でお手軽 Web 負荷テスト