Docker

JMeterのスレーブをDocker上に立ててみた

最近Dockerを触り始めた浅見です。

前回は、DOCKERの全体イメージとコマンドについてまとめてみたという記事を書き、少しだけDockerのことが分かった気がします。

最終的には、負荷テストシステムをクラウドネイティブな感じに作り替え、JMeterのスレーブはFagate上で動かしたいと思っています。が、知識が乏しいので、単純にDocker上にJMeterのスレーブを立ててみました。という記事です。

千里の道も一歩から。一つ一つ要素を分解して学習していきましょう。

ホストOSの設定

ホストOSは、Amazon Linux2で構築しました。

Dockerの設定

AWS公式を参考に、Dockerをインストールしていきます。CentOSの場合とは異なる手順になるので注意しましょう。

$ sudo yum update -y
$ sudo amazon-linux-extras install docker
$ sudo yum install docker
$ sudo service docker start
$ sudo usermod -a -G docker ec2-user
$ docker info

JMeterマスタの設定

今回は、ホストOS上にJMeterのマスタを構築します。

$ cd /usr/local/src
$ sudo wget https://ftp.kddi-research.jp/infosystems/apache//jmeter/binaries/apache-jmeter-5.3.tgz
$ sudo tar -xvzf apache-jmeter-5.3.tgz
$ sudo ln -s /usr/local/src/apache-jmeter-5.3/ /usr/local/jmeter
$ sudo sed -i_date +%Y%m%d -e s/#server.rmi.ssl.disable=false/server.rmi.ssl.disable=true/g /usr/local/jmeter/bin/jmeter.properties
$ TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
&& IP=curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 \
&& sudo sed -i_date +%Y%m%d -e "s/remote_hosts=127.0.0.1/remote_hosts=$IP"/g /usr/local/jmeter/bin/jmeter.properties
$ sudo sed -i_date +%Y%m%d -e 's/: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"/: "${HEAP:="-Xms64m -Xmx64m -XX:MaxMetaspaceSize=64m"}"/g' /usr/local/jmeter/bin/jmeter
$ sudo /usr/local/jmeter/bin/jmeter -v
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.3

Copyright (c) 1999-2020 The Apache Software Foundation

JMeterスレーブをDocker上に構築

Dockerfile作成

まずは、Dockerfileを作成します。centos7イメージをもとにカスタマイズしていきます。

「rmi.server.hostname」はホストOSのローカルIPの指定が必要だったので、引数で指定できるようにしました。

$ vi Dockerfile
-------------------------------------------
# centos7イメージを利用
FROM centos:centos7

# JMeterをインストール
RUN cd /usr/local/src/ \
    && yum update -y \
    && yum install -y wget \
    && yum install -y jre \
    && wget https://ftp.kddi-research.jp/infosystems/apache//jmeter/binaries/apache-jmeter-5.3.tgz \
    && tar -xvzf apache-jmeter-5.3.tgz \
    && rm apache-jmeter-5.3.tgz \
    && ln -s /usr/local/src/apache-jmeter-5.3/ /usr/local/jmeter

# IPアドレスは引数で指定
ARG IP

# JMeterスレーブの起動設定
# - SSL通信無効化
# - rmi.localport指定
# - rmi.server.hostname指定
# - メモリ調整(t3.microを利用しているので64MBとしています
RUN sed -i_date +%Y%m%d -e s/#server.rmi.ssl.disable=false/server.rmi.ssl.disable=true/g /usr/local/jmeter/bin/jmeter.properties \
    && sed -i_date +%Y%m%d -e s/#server.rmi.localport=4000/server.rmi.localport=4000/g /usr/local/jmeter/bin/jmeter.properties \
    && sed -i_date +%Y%m%d -e s/#RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx/RMI_HOST_DEF=-Djava.rmi.server.hostname=$IP/g /usr/local/jmeter/bin/jmeter-server \
    && sed -i_date +%Y%m%d -e 's/: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"/: "${HEAP:="-Xms64m -Xmx64m -XX:MaxMetaspaceSize=64m"}"/g' /usr/local/jmeter/bin/jmeter

# JMeterスレーブの起動
CMD [ "/usr/local/jmeter/bin/jmeter-server" ]
-------------------------------------------

イメージのビルド

ローカルのIPアドレスを取得して、イメージのビルドを行います。ローカルIPはEC2のメタデータから取得しています。

$ TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
&& IP=curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 \
&& docker build -t ptune/jmeter:5.3 --build-arg IP=$IP .

イメージの確認をしてみます。無事にイメージが作成されました。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ptune/jmeter        5.3                 2ef1e9dc2e43        50 seconds ago      647MB
centos              centos7             b5b4d78bc90c        2 months ago        203MB

コンテナの起動

イメージからコンテナを起動させます。JMeterで利用するポートをプロキシさせています。

$ docker run -d -it --name jmeter-slave -p 1099:1099 -p 4000:4000 ptune/jmeter:5.3

起動したことを確認してみます。

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
2db50642565c        ptune/jmeter:5.3   "/usr/local/jmeter/b…"   19 seconds ago      Up 17 seconds       0.0.0.0:1099->1099/tcp, 0.0.0.0:4000->4000/tcp   jmeter-slave

無事にコンテナが起動したようです。コンソール上の出力も確認してみます。

$ docker logs jmeter-slave
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
Jul 09, 2020 6:51:52 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Using local port: 4000
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.40.70:4000](local),objID:[77c16b3e:17332584450:-7fff, 8621487680625807682]]]

動作確認

適当なJMeterシナリオを使ってスレーブで実行させてみます。無事にスレーブから実行ができました。

$ sudo /usr/local/jmeter/bin/jmeter -n -t sample.jmx -l result.jtl -r
Creating summariser <summary>
Created the tree successfully using sample.jmx
Configuring remote engine: 192.168.40.70
Starting distributed test with remote engines: [192.168.40.70] @ Thu Jul 09 06:53:57 UTC 2020 (1594277637591)
Warning: Nashorn engine is planned to be removed from a future JDK release
Remote engines have been started:[192.168.40.70]
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary +      1 in 00:00:01 =    1.2/s Avg:   474 Min:   474 Max:   474 Err:     0 (0.00%) Active: 1 Started: 1 Finished: 0
summary =      1 in 00:00:01 =    1.2/s Avg:   474 Min:   474 Max:   474 Err:     0 (0.00%)
Tidying up remote @ Thu Jul 09 06:54:01 UTC 2020 (1594277641367)
... end of run

まとめ

文字通り「JMeterのスレーブをDocker上に立ててみた」だけの記事でした。

はまりポイントとしては、「rmi.server.hostname」の設定値です。DockerのIPアドレスではなく、ホストOSのIPアドレスを指定しましょう。

単体で、Dockerのコンテナを立てて動かすことができたので、ECRやECSを使ってみたいと思います。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA