最近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を使ってみたいと思います。
お客様の課題ヒアリングと提案活動をメインに行っていましたが、2021年からはマーケティング担当として活動しています。技術ブログはもちろん、様々な形でディーネットの取り組みについて発信していきますので、よろしくお願いします!
LINK
クラウドベリージャム:プロフィールページ