Web の負荷試験ツールとしては Jmeter 等が有名ですが、今回紹介するのは curl-loader というツールです。この記事ではある Web サイトへのログイン負荷を測定するサンプルを示します。
- シナリオ
- 用意するもの
- CentOS へのインストール
- curl-loader の設定
- BATCH_NAME=web-login-load-test
- CLIENTS_NUM_MAX=100
- CLIENTS_RAMPUP_INC=0
- INTERFACE=eth0
- NETMASK=24 IP_ADDR_MIN=10.1.1.101 IP_ADDR_MAX=10.1.1.200
- URLS_NUM=2
- CYCLES_NUM= 1
- URL=https://www.example.com/
- FORM_USAGE_TYPE="RECORDS_FROM_FILE"
- FORM_RECORDS_FILE= ./userinfo.csv
- FORM_STRING="PtUser=%s&PtPwd=%s&PtButton=Logon"
- curl-loader の実行
- IT/インフラエンジニアの地位とスキル向上のために
シナリオ
ユーザ ID および IP アドレスの異なる 100 ユーザが同時に 1 つの Web サイトへログイン画面のリクエスト (http GET) を送出し、戻ってきたログイン画面に対してログイン処理 (http POST) を行う。
用意するもの
- CentOS7 * 1台(それなりのスペックのもの。インターネットへ出る環境も必要)
- ログイン負荷試験の対象となる Web サーバ(認証をするためのサーバやテスト用アカウント含む)
CentOS へのインストール
1. CentOS7 をミニマムインストールで実施します。
2. curl-loader インストールに必要な各種ツールをインストールします。
yum -y install bzip2
yum -y install gcc
yum -y install patch
yum -y install openssl
yum -y install openssl-devel
3. カレントディレクトリを /usr/local/src へ移動します。
4. wgetによりソースファイルをダウンロードします。
5. tar.bz2 ファイルが download というファイルになっているのでリネームします。
6. 解凍します。
7. 解凍したディレクトリに移動します。
8. make して make install します。
make install
インストールは以上です。
curl-loader の設定
curl-loader は基本的には -f の後に conf ファイルを指定すれば動作します。
# curl-loader -f /usr/local/src/curl-loader-0.56/conf-examples/bax.conf
conf ファイルを以下のように作ります。(上記サンプルの bax.conf を元にしています。)
---web-login-load-test.conf---
########### GENERAL SECTION ################################ BATCH_NAME=web-login-load-test CLIENTS_NUM_MAX=100 CLIENTS_RAMPUP_INC=0 INTERFACE=eth0 NETMASK=24 IP_ADDR_MIN=10.1.1.101 IP_ADDR_MAX=10.1.1.200 URLS_NUM=2 CYCLES_NUM= 1 ########### URL SECTION #################################### ### Login URL - cycling # GET-part URL=https://www.example.com/ URL_SHORT_NAME="Login-GET" REQUEST_TYPE=GET TIMER_URL_COMPLETION = 0 # In msec. When positive, Now it is enforced by cancelling url fetch on timeout TIMER_AFTER_URL_SLEEP =0 LOG_RESP_BODIES=1 LOG_RESP_HEADERS=1 # POST-part URL="" URL_SHORT_NAME="Login-POST" URL_USE_CURRENT=1 REQUEST_TYPE=POST FORM_USAGE_TYPE="RECORDS_FROM_FILE" FORM_RECORDS_FILE= ./userinfo.csv FORM_STRING="PtUser=%s&PtPwd=%s&PtButton=Logon" TIMER_URL_COMPLETION = 0 # In msec. When positive, Now it is enforced by cancelling url fetch on timeout TIMER_AFTER_URL_SLEEP =1000 LOG_RESP_BODIES=1 LOG_RESP_HEADERS=1
BATCH_NAME=web-login-load-test
単なるラベルです。任意の文字列で構いません。実行後にこのラベルでのログファイル等関連ファイルが生成されます。
CLIENTS_NUM_MAX=100
最大100クライアントを実行できます。
CLIENTS_RAMPUP_INC=0
1秒ごとに何クライアント同時に起動するかを指定します。例えば20とすれば最初に20クライアント同時に起動し、その1秒後にさらに20、2秒後に20、3秒後に20、4秒後に20と起動していきます。4秒後には100に達するため、CLIENTS_NUM_MAX=100 としていれば1サイクルが終了となります。
0 の場合はいきなり 100 クライアントを起動します。
INTERFACE=eth0
パケットを送出するインタフェースを指定します。
NETMASK=24 IP_ADDR_MIN=10.1.1.101 IP_ADDR_MAX=10.1.1.200
クライアントの範囲とサブネットマスクを指定します。
上記設定であれば 10.1.1.101/24 ~ 10.1.1.200/24 を使って100台立ち上げることができます。
URLS_NUM=2
URL SECTION で記載するURLの数です。今回は「1. Web画面を表示する(GET)」、「2. Webログイン画面でログインする(POST)」の2つです。
CYCLES_NUM= 1
繰り返すサイクル数です。0の場合は無限ループとなり、Ctrl + C を押すまで止まりません。
URL=https://www.example.com/
アクセスするURLを指定します。
URL_USE_CURRENT=1 の場合はURLを空欄にすることができ、この場合は現在表示されているページに対して実行します。
FORM_USAGE_TYPE="RECORDS_FROM_FILE"
ログインに使うIDパスワード情報をどこから持ってくるかを指定します。
今回はRECORDS_FROM_FILE というパラメータにより、CSV形式にIDパスワード情報が書かれているファイルを読み込みます。
なお、"UNIQUE_USERS_SAME_PASSWORD" や "UNIQUE_USERS_AND_PASSWORDS" というパラメータでも実現できそうなのですが、実際にやってみると%dというところがうまく数字が上がらず、100ユーザ同じIDになってしまったため、断念しました。
FORM_RECORDS_FILE= ./userinfo.csv
前述した、ログインに使うIDパスワード情報のファイルを指定します。confファイルと同ディレクトリに userinfo.csv というファイルを配置し、そこにCSV形式[ID,Password]で100アカウント分の情報を記載しました。
testuser1,testpassword1
testuser2.testpassword2
.....
FORM_STRING="PtUser=%s&PtPwd=%s&PtButton=Logon"
これはログイン画面へPOSTする際のFormそのものの形式に則る必要があります。今回試したログイン画面ではPOSTメソッドで以下文字列を送っていることをFirefoxの開発者ツール(F12ボタンで起動)を使って確認しました。(Wireshark だと httpsの暗号化通信はローカルであっても確認できませんので)
1つ目の%sはcsvの1列目、つまりユーザIDを示し、2つ目の%sはcsvの2列目、つまりパスワードを示します。
これで準備完了です。
curl-loader の実行
以下コマンドで実行します。
実行結果は同じディレクトリに web-login-load-test.log というファイルが生成されます。
コメント