こんにちは。ここ最近は負荷テスト三昧な浅見です。
ディーネットで負荷テストをさせていただくときには、JMeterを良く利用しています。JMeterは、ECサイトの会員登録や購入など複雑なシナリオを手軽に作成できるオープンソースの負荷テストツールです。
JMeterを使うことで、簡単に負荷をかけることができるのですが、サーバのCPUやメモリなどのリソース状況は別の手段で把握する必要があります。CloudWatch等の監視ツールを使うことでも対応できるのですが、取得間隔が1分と長く荒い情報になりがちです。
ディーネットでは、1秒間隔で精度の高いリソース情報を取得するために、sarを利用しています。と、いうことで、負荷テスト時にsarとkSarを使ってリソース情報を取得する方法をご紹介していこうと思います。
目次
リソース取得の全体概要
負荷テスト対象サーバは複数台あることがほとんどだと思います。それぞれのサーバで取得してもいいのですが、大変手間がかかります。
ディーネットでは、図のように、JMeterのマスタサーバを起点に、各サーバのsar情報を取得し、最終的にはkSarでグラフ化するようにしています。
グローバルIPを持っているサーバからsarの情報を取得する
グローバルIPを持っているサーバについては、JMeterのマスタサーバからssh経由でsarを実行し、kSarでグラフ化を行います。
WEBサーバへJMeterマスタの公開鍵を登録
JMeterマスタ上で鍵を作成します。
# ssh-keygen -t rsa
作成した公開鍵の情報をコピーします。
# cat ~/.ssh/id_rsa.pub
WEBサーバへログインして、公開鍵の登録を行います。
# mkdir ~/.ssh
# chmod 700 ~/.ssh
# vi ~/.ssh/authorized_keys
id_rsa.pubでコピーした内容を追記
# chmod 600 ~/.ssh/authorized_keys
JMeterマスタサーバからログインの確認を行い、無事sshログインできれば完了です。
実行コマンド
リソース情報取得の実行には下記コマンドを利用します。
# /usr/bin/java -jar /usr/local/kSar/kSar.jar -input "cmd://ssh web_server sar -bBdqrRSuvwWy -I SUM -I XALL -u -P ALL -n DEV 1" -outputPDF /tmp/ksar/web_server.pdf
※対象サーバがCentOS5の場合は、Sオプションを除外した「-bBdqrRuvwWy」オプションとし、実行回数と繰り返し回数の指定を「1」ではなく、「1 0」と指定する必要があります
kSarを使って、sarで取得できる情報をグラフ化しています。グラフは、「/tmp/ksar」ディレクトリに、「web_server.pdf」という形で保存されます。
負荷テスト中はなるべく細かい粒度で情報を取得したいので、sarコマンドの実施間隔は1秒です。また、テスト完了の時間を予測するのが難しいため、回数無制限で実行しています。
上記コマンドを実行すると、次のようなプロセスが生成されます。
[JMeterマスタ]
# ps auwxxx|grep sar
/usr/bin/java -jar /usr/local/kSar/kSar.jar -addHTML -input cmd://ssh 127.0.0.1 sar -bBdqrRSuvwWy -I SUM -I XALL -u -P ALL -n DEV 1 -outputPDF /tmp/ksar/web_server.pdf
ssh 127.0.0.1 sar -bBdqrRSuvwWy -I SUM -I XALL -u -P ALL -n DEV 1
[対象WEBサーバ]
# ps auwxxx|grep sar
sar -bBdqrRSuvwWy -I SUM -I XALL -u -P ALL -n DEV 1
終了コマンド
回数無制限で実施しているため、明示的に終了させる必要があります。
終了させるためには、対象WEBサーバのsarコマンドのプロセスkillが必要です。sarのプロセスを確認して、killコマンドで終了させましょう。
# ssh root@web_server "kill -9 ps auwxx|grep 'sar -bBdqrRSuvwWy'|grep -v grep |grep -v java|awk '{print $2}'
"
sarのプロセスをkillすると、下記のようなメッセージが表示されて「/tmp/ksar/web_server.pdf」へpdfが生成されます。
# time to parse: 23235ms number of line: 16331 line/msec: 0.0
グローバルIPを持っていないサーバからsarの情報を取得する
グローバルIPを持っていないサーバの場合は、踏み台サーバでポートフォワードを行うことで、グローバルIPを保持するサーバと同様の方法でグラフ化を行っています。
DBサーバへJMeterマスタの公開鍵を登録
WEBサーバのときと同様に、DBサーバへ公開鍵の登録を行います。
ポートフォワード設定
WEBサーバからDBサーバへポートフォワードの設定を行います。
実行時にポートフォワードを意識する必要がないように、.ssh/configへ設定を記載していきます。
# vi ~/.ssh/config
Host web_server
HostName XXX.XXX.XXX.XXX
User username
GatewayPorts yes
LocalForward 10022 127.0.0.1:10022
IdentityFile ~/.ssh/id_rsa
Host db_server
HostName 192.168.1.10
User username
GatewayPorts yes
IdentityFile ~/.ssh/id_rsa
LocalForward 10022 192.168.1.10:22
ProxyCommand ssh -CW %h:%p web_server
dbサーバへssh接続確認を行います。
# ssh db_server
コマンドの実行
コマンドの実行は、グローバルIPを持っているサーバのときと同様です。
ホスト名の指定を、~/.ssh/configのHostに指定した名前で行うことで、自動的にポートフォワードして実行されます。
参考:sarとkSarのインストール方法
sysstatのインストール方法
CentOSの場合、標準リポジトリからインストールが可能です。
# yum install -y sysstat
kSarのインストール方法
kSarはsourceforgeからダウンロードの後、解凍して利用が可能です。
https://sourceforge.net/projects/ksar/ へアクセスしてzipファイルをダウンロードします。
ダウンロードしたファイルをサーバへアップしてunzipコマンドで解凍して利用が可能です。
※または、wgetで直接取得が可能です。
# wget https://downloads.sourceforge.net/project/ksar/ksar/5.0.6/kSar-5.0.6.zip
# unzip kSar-5.0.6.zip
まとめ
今回は負荷テスト中のサーバリソースの情報を取得する方法を紹介しました。
都度コマンド実行するのは大変なので、シェルやphp等で自動化させて実行すると便利だと思います。