スマホサイトに使える負荷テストツールとは?
- 2009.09.10
- 開発環境/開発ツール テスト
- demo
パフォーマンスが求められるWebサイトだと、Webサイトの負荷テストを行う場合が多い。シンメトリックでも自社製品ラウンドアバウトやフットプリントの負荷テストをたびたび実施している。もちろん、アクセス数の見込まれるSI案件でも負荷テストは欠かせない。
こうした負荷テストを行うためのツールには無料・有償を含め、多くの種類があるけど、携帯サイトに適したツールと言えば何か?フリーの代表的なツール4つに的を絞って紹介したい。
関連記事:
ツールに求められる条件
携帯サイト向けに負荷テストを行う場合、ツールに求められる条件は次の通り。
- User-Agentヘッダを設定できること
- HTTP拡張ヘッダ(X-DCMGUID等)を設定できること
また、多数の端末からのアクセスをシミュレートする場合、User-AgentヘッダやX-DCMGUIDなどのHTTPヘッダ情報を外部ファイルから取り込んで設定できると便利だ。
Apache Bench
Apache Benchは、Apacheインストール時に標準装備されるコマンドライン型の負荷テストツール。ほとんどのサーバーで標準的にインストールされているため、お手軽に使える。
$ ab -n 1000 -c 100 http://xxx.xxx.xxx/xxx.html
Apache Benchの特徴と言えば、非常に高い負荷状態をシミュレートできること。C言語で組まれているため、ツール自体の負荷も軽い。
が、Apache BenchのUser-Agentヘッダを変更できない制限があるために、残念ながら携帯サイトではほとんど使う機会がない。
(2009/10/29追記)Apache 2.2.6以降に付属するApacheBenchでは、-HオプションでUser-Agentを指定すると、指定したUser-Agentヘッダのみが送信されるようになったようです。従来のバージョンでは-HオプションでUser-Agentを指定しても、「User-Agent: ApacheBench/2.2」というようなヘッダが必ず送信されていたため、サーバー側では正しく機種判別ができない場合がありました。今後はApacheBenchも携帯サイトの負荷テストツールとして活用できそうですね。
Apache JMeter
JMeterはJavaで作成された高機能な負荷テストツール。コマンドラインモードとGUIモードを備える。
JMeterではUser-Agentヘッダのカスタマイズはもちろん、前処理を定義したり、HTTPレスポンスの検証(アサーション)まで行うことができる優れものだ。ログや結果レポートも十分に得られる。JMeter 2.3では、CSVからのデータ取り込み機能も導入されたようだ。
しかし、Linux上でJMeterを実行するのは少々面倒・・・。運用サーバーではGUI環境が用意されていないことが多いから、JMeterはコマンドラインモードで使用することになる。が、設定ファイルが複雑なのでWindows上で作成した設定ファイルを持ってこなくてはならない。JMeterを使うなら、GUI環境は必須だろう。
Microsoft Web Application Stress Tool
10年位前から存在するMicrosoftの負荷テストツール。Windowsのみで動作する。
このツールもHTTPリクエストヘッダのカスタマイズが可能。レスポンスタイムなどのパフォーマンス測定をGUIでお手軽に実行できる。外部ファイルのインポート機能は備えていないが、mdb形式のデータベースファイルをAccessで編集すれば何とかなるかも?
Linux上で動作しないのが残念なところだ。
GNU wget
「wgetは負荷テストツールではないよ~」という声が聞こえてきそうだけど、確かにwgetは単なるダウンローダに過ぎない。けど、工夫次第でwgetを簡易負荷テストツールとしても使える。
wgetは通常、次のようにコマンドライン実行する。
$ wget -q -x --tries=1 -e robots=off -P out --user-agent="DoCoMo/2.0 N06A3(c500;TB;W20H13)" --header="X-DCMGUID: xxxxxxx" http://xxx.xxx.xxx/xxx.html
wgetのオプションは豊富で、コマンドラインオプションからHTTPヘッダを自由に設定できる。
wgetを簡易負荷テストツールとして使うには、まずwgetを連続的に実行するスクリプトを準備する。
#!/bin/sh i=0 while [ $i -lt 10000 ]; do wget -q -x --tries=1 -nH -e robots=off -P out --user-agent="DoCoMo/2.0 N06A3(c500;TB;W20H13)" --header="X-DCMGUID: xxxxxxx" http://xxx.xxx.xxx/xxx.html i=`expr $i + 1` done
で、このスクリプトを複数プロセスでバックグラウンド実行させる。簡易版だけど、これで複数クライアントからの同時アクセスをシミュレートできる。
#!/bin/sh i=0 while [ $i -lt 30 ]; do ./repeat.sh & sleep 1s i=`expr $i + 1` done
もちろん専用ツールほどの高負荷を与えるなんてことはムリ。でもその代わり、外部ファイルから読み込んだ値をUser-AgentやURLとして利用したり、負荷のタイミングをコントロールしたり・・・ってことができたりする。カスタマイズにはめっぽう強い。
まとめ
今回紹介した負荷テストツールをまとめるとこんな感じになる。
機能 | Apache
Bench |
JMeter | Web Application
Stress Tool |
wget |
---|---|---|---|---|
User-Agent変更 | × | ○ | ○ | ○ |
拡張ヘッダ設定 | ○ | ○ | ○ | ○ |
外部ファイル
取り込み |
△ | ○ | × | ○ |
高負荷の
シミュレート |
◎ | △ | ○ | × |
マルチスレッド | ○ | ○ | ○ | × |
設定しやすさ | ○ | △ | ○ | ○ |
JMeterは高機能なツールで、おそらくどんな用途にも使用できるけど、その反面使いこなすのが難しい。Web Application Stress Toolは設定しやすいツールだけど、Linuxでは使えない。wgetは外部ファイルの参照などの拡張性は高いけど、高負荷のシミュレートは苦手。用途によって使い分けるのが良さそうな感じだ。
ちなみに最近はwgetをフル活用して負荷テストを行うことが圧倒的に多い!やっぱりLinux上でコマンドラインからすぐに使える、という便利さが使い続けたくなる理由だ。スクリプト化が容易だから1回1回のテストの負担も軽い。複数台のLinuxでwgetを実行すれば、まずまずの高負荷も与えられる。シンプルなツールだけに可能性は無限大です。
(参考サイト)
関連記事: