Tsung で負荷試験

Tsung を使用して 3 台のサーバから Web サーバに GET リクエストを送ってみました

## Tsung の実行環境の準備

Erlang R16B03-1 をインストールしておきます

### Tsung のインストール

3 台のサーバそれぞれに下記の手順で Tsung をインストールします

```
$ sudo aptitude -y install autoconf gnuplot libtemplate-perl
$ git clone https://github.com/processone/tsung.git
$ cd tsung
$ ./configure
$ make && sudo make install
```

### /etc/environment に Erlang の PATH を追加する

slave の Erlang VM を実行するために、下記のファイルの PATH に Erlang の PATH を追加しておきます

```
/etc/environment
```

### hosts の設定

次に、DNS サーバ、または、それぞれの /etc/hosts にホスト名と IP アドレスを書いおきます

今回は、手元の環境に Unbound がありましたので、下記を追記しました

```
    local-data: "ubuntu1 A 192.168.1.135"
    local-data: "ubuntu2 A 192.168.1.131"
    local-data: "ubuntu3 A 192.168.1.132"
    local-data: "ubuntu4 A 192.168.1.133"
```

### ssh の準備

master の Tsung から slave の Tsung を実行する際には、ssh でアクセスします

そのため、master のサーバから slave のサーバへ、パスワード無しでログインできるようにしておきます

master で passphrase 無しの鍵を作成しておくか、または、ssh-agent を実行したうえで試験をおこないます


### 設定ファイルの準備

git clone したディレクトリの tsung/examples ディレクトリ内に設定ファイルの例が用意されていますので、
ドキュメントとこの設定例を参考にして負荷試験の内容を XML ファイルに書いていきます


下記の設定ファイルを準備しました

```xml:http.xml
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/opt/erlang/R16B03-1/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
  <clients>
    <client host="ubuntu1" use_controller_vm="true" />
    <client host="ubuntu2" />
    <client host="ubuntu3" />
  </clients>
  <servers>
    <server host="ubuntu4" port="80" type="tcp"></server>
  </servers>
  <load>
   <arrivalphase phase="1" duration="1" unit="minute">
     <users interarrival="0.1" unit="second"></users>
   </arrivalphase>
  </load>
  <options>
    <option type="ts_http" name="user_agent">
    <user_agent probability="100">Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36</user_agent>
   </option>
  </options>
  <sessions>
    <session name="http-example" probability="100" type="ts_http">
      <request> <http url="/index.html" method="GET" version="1.1" ></http> </request>
    </session>
  </sessions>
</tsung>
```

ホスト ubuntu1, ubuntu2, ubuntu3 から ubuntu4 に GET リクエストを送信します
ubuntu4 のサーバには Apache2 をインストールしてあります

## 実行

master のサーバ上で Tsung を実行します

```
$ mkdir log
$ tsung -l log -f http.xml start
```

### access.log で確認

ログから、3 つの Tsung からの GET リクエストを処理していることが確認できました

```
192.168.1.131 - - [13/Apr/2014:12:09:35 +0000] "GET /index.html HTTP/1.1" 200 427 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
192.168.1.131 - - [13/Apr/2014:12:09:35 +0000] "GET /index.html HTTP/1.1" 200 427 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
192.168.1.135 - - [13/Apr/2014:12:09:35 +0000] "GET /index.html HTTP/1.1" 200 427 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
192.168.1.135 - - [13/Apr/2014:12:09:35 +0000] "GET /index.html HTTP/1.1" 200 427 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
192.168.1.135 - - [13/Apr/2014:12:09:35 +0000] "GET /index.html HTTP/1.1" 200 427 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
192.168.1.132 - - [13/Apr/2014:12:09:36 +0000] "GET /index.html HTTP/1.1" 200 427 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
```

### レポートの作成

Tsung の tsung_stats.pl を使用してレポートを作成します

tsung_stats.pl は <Erlang のインストールディレクトリ>/lib/tsung/bin/ にあります

```
$ tsung_stats.pl --stats ./log/20140413-1208/tsung.log
```

#### report.html
![スクリーンショット 2014-04-13 22.29.45.png](https://qiita-image-store.s3.amazonaws.com/0/36202/df96fe16-297d-744f-e251-90c6daf6d709.png)

#### graph.html 
![スクリーンショット 2014-04-13 22.29.29.png](https://qiita-image-store.s3.amazonaws.com/0/36202/ac834855-a995-4baa-92b0-3ee3fd178eca.png)


## 参考

- [Welcome to Tsung’s documentation! &mdash; Tsung 1.5.1 documentation](http://tsung.erlang-projects.org/user_manual/index.html)