ウェブサイトの負荷を計測するために Tsung を試してみた。
CentOS 7.x を導入し、firewalldとSELinux無効化、アップデートして再起動
# systemctl disable firewalld
# systemctl stop firewalld
# setenforce 0
# sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
# yum upgrade -y && shutdown -r now
EPELかソースから導入する。Tsungを構成するノードが複数ある場合は、全ノードにて同様にインストールを行う。
EPELにあったのでEPELから導入、AmazonLinuxなど依存関係でダメな場合は次項のソースから導入を参照
# yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# sed -i s/enabled=1/enabled=0/g /etc/yum.repos.d/epel.repo
# yum --enablerepo=epel install tsung
最新は1.6.0のようだけど、EPELから導入出来たのは "tsung-1.5.1-2.el7.x86_64" だった
# ssh-keygen -N '' -t rsa -b 2048
# cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
# ssh localhost
# ssh <IPADDRESS> #<-構成ノードの全IPを叩いてホスト鍵を保存
authorized_keys, known_hosts, id_pub などを全ノードに展開する
設定に合わせて適当に作って全ノードに展開する
# vi /etc/hosts
XXX.XXX.XXX.XXX A
XXX.XXX.XXX.XXX B
XXX.XXX.XXX.XXX C
# vi ~/tsung.xml
<?xml version="1.0"?>
<!-- インストールしたTsungのPathとあっていること -->
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<!-- 負荷テストを実施するTsungクライアントの設定 -->
<clients>
<client host="A" weight="1" cpu="2" maxusers="40000">
<ip value="XXX.XXX.XXX.XXX"/>
</client>
<client host="B" weight="1" cpu="2" maxusers="40000">
<ip value="XXX.XXX.XXX.XXX"/>
</client>
<client host="C" weight="1" cpu="2" maxusers="40000">
<ip value="XXX.XXX.XXX.XXX"/>
</client>
</clients>
<!-- テスト対象のサーバー -->
<servers>
<server host="<httpサーバのIPorドメイン>" port="80" type="tcp"/>
</servers>
<!-- コネクション数の指定 -->
<load>
<!--
5分間で毎秒8ユーザーずつ最大1000ユーザーまでクライアントを生成する。
-->
<arrivalphase phase="1" duration="5" unit="minute">
<users maxnumber="1000" arrivalrate="8" unit="second"/>
</arrivalphase>
<!--
10分間で毎秒8ユーザーずつ最大3000ユーザーまでクライアントを生成する。
-->
<arrivalphase phase="2" duration="10" unit="minute">
<users maxnumber="3000" arrivalrate="8" unit="second"/>
</arrivalphase>
<!--
15分間で毎秒10ユーザーずつ最大10800ユーザーまでクライアントを生成する。
-->
<arrivalphase phase="3" duration="15" unit="minute">
<users maxnumber="10800" arrivalrate="10" unit="second"/>
</arrivalphase>
</load>
<!--
実際のクライアントの処理内容
生成されたクライアントはいずれかのsessionを行うことになるため、probabilityの合計値は100とする必要がある
-->
<sessions>
<!--
接続時に index.html を 100回 リクエストする。
-->
<session probability="100" name="ab" type="ts_http">
<for from="1" to="5" var="i">
<request> <http url="/index.html" method="GET" version="1.1"/> </request>
</for>
</session>
<!-- 他、画像やソケットなどトップページを構成する要素があれば追記する -->
</sessions>
</tsung>
# tsung -f ~/tsung.xml start
アタックされた側・・・
[root@vm154 httpd]# w
13:41:36 up 1 day, 2:37, 2 users, load average: 142.11, 47.35, 16.88
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
senokuch pts/0 11:11 4.00s 0.82s 9.87s /bin/xfce4-terminal
senokuch pts/1 13:12 1.00s 0.54s 0.43s ssh -XC -o ServerAliveInterval=
楽しい!!! ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
=ERROR REPORT==== 16-Oct-2015::11:09:02 ===
** Node tsung2@vm170 not responding **
** Removing (timedout) connection **
tsung_stats.pl にてログファイルからHTML形式のレポートを生成する。
# yum install perl-App-cpanminus @development gnuplot
# cpanm Template
# mkdir report ; cd $_
# /usr/lib64/tsung/bin/tsung_stats.pl --stats /root/.tsung/log/YYYYMMDD-HHMM/tsung_controller\@<hostname>.log
カレントディレクトリにレポートのHTML・画像などが生成されるので適当に見る。