クラスター構成のJmeterで負荷試験

# はじめに
秒間1万リクエストの負荷を実施にあたって、
Jmeter単体では負荷が出せなかったのでクラスター構成のJmeterで実施しました。
Jmeterのローカルでのテスト実施方法などは以下を参照してください。
基本的な設定ファイルの作成も今回は省略します。

 [Jmeterをローカル環境でテスト](https://qiita.com/sh_tomiyama/private/3f62792fff4c0d4843f8)
 [負荷試験を確認するための基礎的で不可欠な知識](https://qiita.com/sh_tomiyama/private/fea183c3564e7df11b9e)

# クラスタ構成の概要
マスターサーバー、スレーブサーバー（複数台）という構成で実施します。
マスターサーバーに設定ファイルを置いて実行することで、
スレーブから結果ログなどをマスターサーバーへ集約する形で実行してくれます。
ですので、スレーブサーバー側ではJmeterの起動だけしておけばOKです。

# マスターサーバーのセットアップ
やることの大まかな流れとしては、
1. jmeterのインストール
2. 解凍
3. スレーブサーバーの設定

### jmeterのインストール
/home/ec2-userにて、


```bash

$ sudo yum update -y
$ wget http://ftp.riken.jp/net/apache//jmeter/binaries/apache-jmeter-5.1.1
```

### 解凍

```bash

$ tar zxvf apache-jmeter-5.1.1.tgz
```

### スレーブサーバーの設定
プロパティをいじります。
apache-jmeter-5.1.1のbin配下に行き、
vimでプロパティを開き、リモートホストの記載欄にスレーブサーバーのDNSネームを記載。
IPアドレスを記載するとエラーなどでこけることがあるそうなので注意。
なお、複数スレーブを記載する場合はカンマ区切りで記載すればOK。

```bash

cd apache-jmeter-5.1.1/bin/
sudo vim jmeter.properties
```

```vim

remote_hosts=ec2-aa-aa-aa-aa.ap-northeast-1.compute.amazonaws.com
```

# スレーブサーバーのセットアップ
1. jmeterのインストール
2. 解凍
3. Jmeterの起動

### jmeterの起動

起動前にプロセスを確認。立ち上がってない。

```bash

$ ps -aux | grep jemter
ec2-user 14418  0.0  0.0 119468   896 pts/1    S+   11:36   0:00 grep --color=auto jemter
```


起動

```bash

/home/ec2-user/apache-jmeter-5.1.1/bin/jmeter-server &
```

もう一度プロセスを確認。jmeterが立ち上がっている。

```bash 
$ ps -aux | grep jmeter
ec2-user  4324  0.0  0.0 119928  2856 pts/0    S    11:43   0:00 /bin/sh /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter-server
ec2-user  4326  0.0  0.0 119928  2892 pts/0    S    11:43   0:00 /bin/sh /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter -Dserver_port=1099 -s -j jmeter-server.log
ec2-user  4354  0.4  2.0 7934128 158084 pts/0  Sl   11:43   0:02 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms4g -Xmx4g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -jar /home/ec2-user/apache-jmeter-5.1.1/bin/ApacheJMeter.jar -Dserver_port=1099 -s -j jmeter-server.log
```

# いざ負荷試験
スレーブサーバーでJmeterを起動できれば、
マスターサーバーからの指示待ち状態になっているので、負荷試験を実施します。
今回プロセスを確認するために```/home/ec2-user/apache-jmeter-5.1.1/bin/jmeter-server &```コマンドのあとに
キャンセルしましたが、通常は立ち上げっぱなしで大丈夫です。
キャンセルしてもプロセスは上がり続けてるので大丈夫なのですが念の為。

sudoしないと怒られるのでしてください。
起動コマンドは```/home/ec2-user/apache-jmeter-5.1.1/bin/jmeter```で、
-nがCUIモードでの起動、-tが設定ファイルの指定のオプションです。
なお、設定ファイルは絶対パスで指定してあげないと怒られることがあります。

```bash

$ sudo su
$ /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter -n -t /home/ec2-user/test.jmx -r
Creating summariser <summary>
Created the tree successfully using /home/ec2-user/test.jmx
Configuring remote engine: ec2-aa-aa-aa-aa.ap-northeast-1.compute.amazonaws.com
Exception creating connection to: ec2-aa-aa-aa-aa.ap.ap-northeast-1.compute.amazonaws.com; nested exception is:
        java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
Failed to configure ec2-aa-aa-aa-aa.ap.ap-northeast-1.compute.amazonaws.com
Stopping remote engines
Remote engines have been stopped
Error in NonGUIDriver java.lang.RuntimeException: Following remote engines could not be configured:[ec2-aa-aa-aa-aa.ap.ap-northeast-1.compute.amazonaws.com]

```

Error in NonGUIDriver java.lang.RuntimeExceptionというやつがたまにでるのですが、
この場合はスレーブ側で何かしら問題が発生しているので、jmeterを再起動してあげるのがよいです。
もしrebootができないのであれば、プロセスをKillしましょう。
killするプロセスは3つ表示のうち1番下です。

```bash

$ ps -aux | grep jmeter
ec2-user  4324  0.0  0.0 119928  2856 pts/0    S    11:43   0:00 /bin/sh /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter-server
ec2-user  4326  0.0  0.0 119928  2892 pts/0    S    11:43   0:00 /bin/sh /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter -Dserver_port=1099 -s -j jmeter-server.log
ec2-user  4354  0.4  2.0 7934128 158084 pts/0  Sl   11:43   0:02 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms4g -Xmx4g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -jar /home/ec2-user/apache-jmeter-5.1.1/bin/ApacheJMeter.jar -Dserver_port=1099 -s -j jmeter-server.log
$ kill 4354
$ ps -aux | grep jmeter
ec2-user  4476  0.0  0.0 119468   976 pts/0    S+   11:59   0:00 grep --color=auto jmeter
[1]+  Exit 143                /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter-server
```

その後再起動

```bash

$ /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter-server &
```

マスターサーバーに戻り、再度実行

```bash

$ /home/ec2-user/apache-jmeter-5.1.1/bin/jmeter -n -t imp-test.jmx -r
Creating summariser <summary>
Created the tree successfully using imp-test.jmx
Configuring remote engine: ec2-aa-aa-aa-aa.ap-northeast-1.compute.amazonaws.com
Starting remote engines
Starting the test @ Fri Sep 13 12:07:54 UTC 2019 (1568376474892)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
```

このWaiting forが表示されたら無事負荷試験成功です！




# 参考
 [SpotInstanceとJMeterを使って400万req/minの負荷試験を行う](https://dev.classmethod.jp/cloud/apache-jmeter-master-slave-100mil-req-min/)