8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Docker】EC2インスタンスにJMeterを導入する【負荷試験】

Last updated at Posted at 2019-02-19

概要

やりたいこと

  • AWSのEC2インスタンス(Linux)にJMeterをdocker-composeで導入
  • jmxファイルを読み込んで負荷試験(実行できればとりあえずOK)

やることリスト

#EC2インスタンスを立ち上げる

AWSマネジメントコンソールよりEC2インスタンスを構築。手順は調べれば出てきますので割愛します。
スペックはt2.microで立ち上げました(導入試験的に低スペで)

#Docker,dokcer-composeをインストール

立ち上げたEC2インスタンスにSSHログインし、以下のコマンドでDocker, docker-composeを導入していく。


## yum の更新 & dockerをインストール(セキュリティアップデート等はよしなに)
sudo yum update -y
sudo yum install -y docker

## docker サービスの起動 & グループ割り当て
sudo service docker start
sudo usermod -a -G docker ec2-user

## sudoする
sudo -i

## docker-composeをダウンロード
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose コマンドに実行権限付与
chmod +x /usr/local/bin/docker-compose

# sudo抜ける
exit

# docker-compose コマンドの実行確認
docker-compose --version

#Jmeterを導入

EC2インスタンス内にjmeterフォルダを作成。(フォルダ名は自由です)
フォルダ内にdocker-compose.ymlを作成。

今回はDockerHubで公開されてたvinsdocker/jmmasterを使わせてもらいます。

version: '3.5'
services:
  master:
    image: vinsdocker/jmmaster
    container_name: master
    tty: true
    hostname: master
    networks:
      - jmeter_net
  slave:
    image: vinsdocker/jmserver
    tty: true
    networks:
      - jmeter_net
networks:
  jmeter_net:
    name: jmeter_net

起動させてみましょう。

docker-compose up -d

起動の確認

$ docker-compose ps
     Name                   Command               State          Ports       
-----------------------------------------------------------------------------
jmeter_slave_1   /bin/sh -c $JMETER_HOME/bi ...   Up      1099/tcp, 50000/tcp
master           bash                             Up      60000/tcp

#jmxファイルを読み込めるようにする

ローカルのjmxファイルをリモートサーバーへ転送(同期)する場合

rsync -e "ssh" ~/転送したいパス/ファイル名.jmx  [ユーザー名@ホスト or ホストalias]:~/転送先パス/ファイル名.jmx

#実行方法

jmxファイルを読み込めるようにする」の項目でローカルからリモートへjmxファイルを転送しましたね。
今度はリモートサーバーの中のjmxファイルをリモートのコンテナ内へとコピーしなくてはなりません。
(本当はしなくてもいいのかも。。。何かいい方法あれば教えてください。。。)

## コンテナへファイルをコピー(コンテナ名は「master」になっているかと)
docker cp パス/ファイル名.jmx コンテナ名:/コンテナ内のパス/ファイル名.jmx

## 実行
docker exec -ti master /bin/bash /jmeter/apache-jmeter-3.3/bin/jmeter -n -t /コンテナ内のパス/ファイル名.jmx

実はローカル(Mac)でも実行が可能です。

## ローカルでの実行(GUIモードで起動する)
jmeter

## コマンドラインでの実行
jmeter -n -t パス/ファイル名.jmx

※ローカルのJmeter(Dockerではない方)が起動してたっぽい。。。

試しにローカル環境でdocker-composeで立ち上げたコンテナのJMeterを実行してみると、怒られました。


$ docker exec -ti master /bin/bash   /jmeter/apache-jmeter-3.3//bin/jmeter
================================================================================
Don't use GUI mode for load testing, only for Test creation and Test debugging !
For load testing, use NON GUI Mode:
   jmeter -n -t [jmx file] -l [results file] -e -o [Path to output folder]
& adapt Java Heap to your test requirements:
   Modify HEAP="-Xms512m -Xmx512m" in the JMeter batch file
================================================================================

#スケール

JMeterではMaster/Slave構成での負荷試験が実施できます。
さらに、DockerであればSlave用コンテナの拡張(Scale)も容易なので楽できそう!!

スケールするには、docker-compose up -dを実行する際にオプション指定をします。

## slaveのスケール
docker-compose up -d --scale slave=コンテナ数

試してみましょう

$ docker-compose up -d
Creating network "jmeter_net" with the default driver
Creating master         ... done
Creating jmeter_slave_1 ... done

$ docker-compose ps
     Name                   Command               State          Ports       
-----------------------------------------------------------------------------
jmeter_slave_1   /bin/sh -c $JMETER_HOME/bi ...   Up      1099/tcp, 50000/tcp
master           bash                             Up      60000/tcp          

$ docker-compose up -d --scale slave=2
master is up-to-date
Starting jmeter_slave_1 ... done
Creating jmeter_slave_2 ... done

$ docker-compose ps
     Name                   Command               State          Ports       
-----------------------------------------------------------------------------
jmeter_slave_1   /bin/sh -c $JMETER_HOME/bi ...   Up      1099/tcp, 50000/tcp
jmeter_slave_2   /bin/sh -c $JMETER_HOME/bi ...   Up      1099/tcp, 50000/tcp
master           bash                             Up      60000/tcp 

コンテナが指定したスケールのサイズに増えましたね。
これで、masterコンテナでJMeterを実行すると、各slaveコンテナで並列実行するようにできます。

ただ注意点として、各slaveコンテナはデフォルトで1GBのメモリ上限が設けられているようです。
そのため、スケールサイズに5を設定してslaveコンテナが5つに増えたとしても、
t2.microなどのメモリを1GB程度しか積んでいないサーバーで実行するとメモリ不足になり、まともな検証ができないようです。

#4445ポートについて

Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445

jmeter実行時にこのようなエラーが出て以降、何も出力されない状態が続いた場合、
リクエスト先サーバーの4445ポートの受け入れを許可してみてください。

#終了方法

docker-compose down

#コンテナ監視

dockerコンテナのリソース監視はctopがおすすめです

8
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?