検証ツール

Webのログイン(POST)負荷試験ツール curl-loader の使い方

Web の負荷試験ツールとしては Jmeter 等が有名ですが、今回紹介するのは curl-loader というツールです。この記事ではある Web サイトへのログイン負荷を測定するサンプルを示します。

シナリオ

ユーザ ID および IP アドレスの異なる 100 ユーザが同時に 1 つの Web サイトへログイン画面のリクエスト (http GET) を送出し、戻ってきたログイン画面に対してログイン処理 (http POST) を行う。

用意するもの

  • CentOS7 * 1台(それなりのスペックのもの。インターネットへ出る環境も必要)
  • ログイン負荷試験の対象となる Web サーバ(認証をするためのサーバやテスト用アカウント含む)

CentOS へのインストール

1. CentOS7 をミニマムインストールで実施します。

2. curl-loader インストールに必要な各種ツールをインストールします。

yum -y install wget
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 へ移動します。

cd /usr/local/src

4. wgetによりソースファイルをダウンロードします。

wget https://sourceforge.net/projects/curl-loader/files/curl-loader-stable/curl-loader-0.56/curl-loader-0.56.tar.bz2/download

5. tar.bz2 ファイルが download というファイルになっているのでリネームします。

mv download curl-loader-0.56.tar.bz2

6. 解凍します。

tar jxvf curl-loader-0.56.tar.bz2

7. 解凍したディレクトリに移動します。

cd curl-loader-0.56

8. make して make install します。

make
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の暗号化通信はローカルであっても確認できませんので)

"PtUser=[User ID]&PtPwd=[Password]&PtButton=Logon"

1つ目の%sはcsvの1列目、つまりユーザIDを示し、2つ目の%sはcsvの2列目、つまりパスワードを示します。

これで準備完了です。

curl-loader の実行

以下コマンドで実行します。

curl-loader -f web-login-load-test.conf

実行結果は同じディレクトリに web-login-load-test.log というファイルが生成されます。

less web-login-load-test.conf

コメント

タイトルとURLをコピーしました