平和より自由より正しさより♪(Beyond The Time/TM Network より)… JMeter より ab より httperf より…のかっぱ (@inokara)です。
はじめに
JMeter よりもお手軽な Web 負荷テストツールを模索していて Siege があったのを思い出しました。
- docker + elasticsearch + kibana + siege でお手軽に web サイトのレスポンスタイムを可視化する試み
- fluentd + elasticsearch + kibana + siege でお手軽に web サイトのレスポンスタイムを可視化する試み
- fluentd + Elasticsearch + kibana + siege でお手軽に web サイトのレスポンスタイムを可視化する試み(2)
これらを書いた時にはあまり 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
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 負荷テスト」