jmeter master/slave環境 構築～実施まで

## 構成

- 負荷テスト用webサーバ : 192.168.119.99
- jmeter master/slave環境
	- masterサーバ : 192.168.119.100
	- slaveサーバ(複数台可能) : 192.168.119.101

マスターサーバに設定ファイルを置いて実行することで、ログなどmasterサーバへ集約
今回は、ローカル環境で構築しております。
**firewallなどのセキュリティの設定は**、各自適切に設定してください。

## masterの設定

### サーバの前準備

- SELinux無効化

```
sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
```

- firewallの無効化

```
systemctl stop firewalld
systemctl disable firewalld
```

- パッケージのインストール

```
yum -y update
yum -y install wget
yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
```

- javaの動作確認

```
java -version
==========
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
==========
```

### masterサーバのセットアップ

#### jmeterインストール

- jmeterのダウンロードURLを確認

[Apache JMeter 本体をオフィシャルサイト](https://jmeter.apache.org/) のDownloadから取得

![無題 - ペイント 2020-09-29 10.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/67aedcd8-d0b4-8481-0cfa-116770f8449b.png)


- jmeterのインストール

```
cd /usr/local/
wget http://www.trieuvan.com/apache//jmeter/binaries/apache-jmeter-5.3.zip
```

- 解凍

```
yum -y install unzip
unzip apache-jmeter-5.3.zip
```

#### jmeterの設定

- slaveサーバの設定(slaveサーバのIPアドレスを記載)

```
vi /usr/local/apache-jmeter-5.3/bin/jmeter.properties
==========
remote_hosts=192.168.119.101
==========
```

- クラスタ内をSSL通信させない設定

```
vi /usr/local/apache-jmeter-5.3/bin/jmeter.properties
==========
server.rmi.ssl.disable=true
==========
```

- hostsの変更

```
vi /etc/hosts
==========
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
↓
192.168.119.100   localhost localhost.localdomain localhost4 localhost4.localdomain4
==========
```


### 起動

- jmeterが動作することを確認

```
/usr/local/apache-jmeter-5.3/bin/jmeter -v
==========
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.3

Copyright (c) 1999-2020 The Apache Software Foundation
==========
```

- 起動

```
/usr/local/apache-jmeter-5.3/bin/jmeter-server &
```

- プロセス確認

```
ps ax | grep jmeter
==========
16373 pts/1    S      0:00 /bin/sh /usr/local/apache-jmeter-5.3/bin/jmeter-server
16375 pts/1    S      0:00 /bin/sh /usr/local/apache-jmeter-5.3/bin/jmeter -Dserver_port=1099 -s -j jmeter-server.log
16398 pts/1    Sl     0:01 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -jar /usr/local/apache-jmeter-5.3/bin/ApacheJMeter.jar -Dserver_port=1099 -s -j jmeter-server.log
16420 pts/1    R+     0:00 grep --color=auto jmeter
==========
```

- 自動でjmeter起動行う設定

```
vi /etc/rc.d/rc.local
==========
追加
/usr/local/apache-jmeter-5.3/bin/jmeter-server &
==========

chmod +x /etc/rc.d/rc.local
```

## slaveの設定

### サーバの前準備

- SELinux無効化

```
sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
```

- firewallの無効化

```
systemctl stop firewalld
systemctl disable firewalld
```

- パッケージのインストール

```
yum -y update
yum -y install wget
yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
```

- javaの動作確認

```
java -version
==========
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
==========
```

### slaveサーバのセットアップ

#### jmeterインストール

- jmeterのダウンロードURLを確認

[Apache JMeter 本体をオフィシャルサイト](https://jmeter.apache.org/) のDownloadから取得

![無題 - ペイント 2020-09-29 10.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/65cbbe34-a1a6-6f8b-c168-a5625d065883.png)


- jmeterのインストール

```
cd /usr/local/
wget http://www.trieuvan.com/apache//jmeter/binaries/apache-jmeter-5.3.zip
```

- 解凍

```
yum -y install unzip
unzip apache-jmeter-5.3.zip
```

#### jmeterの設定

- ipアドレスの設定(自分自身、slaveサーバのIPアドレスを記載)

```
vi /usr/local/apache-jmeter-5.3/bin/jmeter-server
==========
追加
RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.119.101
==========
```

- クラスタ内をSSL通信させない設定

```
vi /usr/local/apache-jmeter-5.3/bin/jmeter.properties
==========
server.rmi.ssl.disable=true
==========
```

- hostsの変更

```
vi /etc/hosts
==========
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
↓
192.168.119.100   localhost localhost.localdomain localhost4 localhost4.localdomain4
==========
```


### 起動

- jmeterが動作することを確認

```
/usr/local/apache-jmeter-5.3/bin/jmeter -v
==========
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.3

Copyright (c) 1999-2020 The Apache Software Foundation
==========
```

- 起動

```
/usr/local/apache-jmeter-5.3/bin/jmeter-server &
```

- プロセス確認

```
ps ax | grep jmeter
==========
16373 pts/1    S      0:00 /bin/sh /usr/local/apache-jmeter-5.3/bin/jmeter-server
16375 pts/1    S      0:00 /bin/sh /usr/local/apache-jmeter-5.3/bin/jmeter -Dserver_port=1099 -s -j jmeter-server.log
16398 pts/1    Sl     0:01 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -jar /usr/local/apache-jmeter-5.3/bin/ApacheJMeter.jar -Dserver_port=1099 -s -j jmeter-server.log
16420 pts/1    R+     0:00 grep --color=auto jmeter
==========
```

- 自動でjmeter起動行う設定

```
vi /etc/rc.d/rc.local
==========
追加
/usr/local/apache-jmeter-5.3/bin/jmeter-server &
==========

chmod +x /etc/rc.d/rc.local
```


## webサーバの作成

### 前準備

- 最新化

```
yum update
```

- セキュリティ無視

```
systemctl stop firewalld
systemctl disable firewalld
```

- selinuxをoff

```
vi /etc/selinux/config
==========
削除
SELINUX=enforcing
追加
SELINUX=disabled
==========
```

- 反映

```
reboot
```

### webサーバの設定

- httpdのインストール

```
yum install httpd
```

- 設定ファイル変更

```
# コメントアウトを外す
ServerName www.example.com:80
```

- httpdの起動

```
systemctl start httpd
systemctl enable httpd
```

### 負荷テスト用ファイルの設定

- ファイルを作成

```
vi /var/www/html/index.html
==========
hello world
==========
```

- ブラウザから確認

```
http://IPアドレス/index.html
```

## 負荷テスト実施

- 負荷テストについて

負荷テストについては、全てmaster側で操作を行う
今回は事前に負荷テスト用のjmxファイルを用意いたしました。
`http://192.168.119.99/index.html` を5回叩く設定を`test.jmx`に書き込んでおります。
jmxファイルはGUIで作成するのをおすすめします。

- テスト計画ファイルの作成の際に作ったテスト計画のファイルをjmeterサーバの**masterのみ**に設置

```
ll /usr/local/apache-jmeter-5.3/bin/templates/test.jmx 
```

- 実施

```
slaveのjmeterを使って、test.jmxファイルに記述したことをCUIモードで実行する

cd /usr/local/apache-jmeter-5.3/bin
./jmeter -n -t templates/test.jmx -r
----------
-n : CUIモードで実行
-t : シナリオファイル(ここで言うtest.jmx)を指定
-r : slaveのjmeterを利用する
---以下ここでは使っていないがよく使うオプション---
-l : 結果ファイルを指定
-e : レポートを作成
----------
```

```
cd /usr/local/apache-jmeter-5.3/bin/
./jmeter -n -t templates/test.jmx -r
==========
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Creating summariser <summary>
Created the tree successfully using templates/test.jmx
Configuring remote engine: 192.168.119.101
Starting distributed test with remote engines: [192.168.119.101] @ Tue Sep 29 14:06:52 JST 2020 (1601356012593)
Remote engines have been started:[192.168.119.101]
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary =      5 in 00:00:01 =    5.7/s Avg:     2 Min:     1 Max:     3 Err:     0 (0.00%)
Tidying up remote @ Tue Sep 29 14:06:54 JST 2020 (1601356014825)
... end of run
==========
```

- webサーバ側のlog

```
tail -f /var/log/httpd/access_log 
==========
192.168.119.101 - - [29/Sep/2020:14:06:34 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:34 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:34 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:54 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:54 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:54 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:54 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
192.168.119.101 - - [29/Sep/2020:14:06:54 +0900] "GET /index.html HTTP/1.1" 200 12 "-" "Apache-HttpClient/4.5.12 (Java/1.8.0_262)"
==========
slaveのjmeterから5回、index.htmlにアクセスがあった
```


## 参考

### 構築時に参考

- [クラスター構成のJmeterで負荷試験](https://qiita.com/sh_tomato/items/77963c733a572c8acafd)
- [AWSでJMeterのMaster/Slave環境を構築（CentOS 7）](https://qiita.com/marumaru/items/1c79b9fef5bbeb1adb42)
- [JMeterで負荷試験をやって詰まったところ](https://qiita.com/takarin0711/items/691f6fa933dd846f0bf4)
- [/usr/local と /opt の使い分け](https://qiita.com/akiakishitai/items/69bb68f4f6fbd6a88016)
- [AWSでJMeterを使った負荷テスト環境を構築する手順（WindowsありのMaster/Slave構成）](https://dev.classmethod.jp/articles/jmeter-master-slave/)
- [JMeter Server 起動が java.rm.server.ExportException でFailするときのFix を考える](https://qiita.com/TsuyoshiUshio@github/items/f24bf4d12e2280fe16d6)
- [テスト実施#2_CentOS環境へのJMeterインストールと実行コマンド](https://ptune.jp/tech/load-test-execution-by-cui/)
- [テスト実施#7_マスタスレーブ構成を用いた負荷テストの行い方](https://ptune.jp/tech/how-to-perform-a-load-test-using-a-master-slave-configuration/)
- [JMeter の Master/Slave 構成のコンフィグレーションと実行](https://qiita.com/TsuyoshiUshio@github/items/f8752b08e3b2267878f2)
- [Linuxコマンドラインで JMeter を実行する方法](https://www.checksite.jp/jmeter-on-linux/)
- [複数台でJmeterの負荷試験を行う](https://cloudpack.media/14290)

### 詰まったときに参考

- [JMeterのリモートクライアントでテストする方法](https://tomoyamkung.hatenadiary.org/entry/20090205/1233797910)
- [Vm Centosのjmeterで配布テストを実行する](https://stackoverrun.com/ja/q/7591520)
- [サーバーの起動に失敗しました:java.rmi.server.ExportException](https://www.perfmatrix.com/server-failed-to-start-java-rmi-server-exportexception/)