プロキシ環境下で JMeter を CLI から Server-Client 構成で実行する

Docker
この記事は約8分で読めます。

こんにちは、小柳津です。
docker であれこれ環境構築を自動化したり、Jenkins で手作業やビルド・デプロイを自動化したり、サーバを構築したり、たまに開発をしたり、いろいろなことに取り組んでいるエンジニアです。

この記事を読んでほしい方

この記事は下記にあてはまる方にぜひ読んでほしいです。
(特にプロキシ環境下の方は作業の参考としたい記事にプロキシについての記載がされていないことも多く、時間をかけてしまった経験もあるかと思います)

  • docker の知識をある程度持っている、触ったことがある、業務で使用している
  • JMeter でさくっと Web アプリの負荷テストをやってみたい
  • JMeter を Server – Client 構成で実行してみたい
  • 作業場はプロキシ環境下である

本記事の概要

本記事のテーマは Apache が公開している Web アプリの負荷テストツールの JMeter を Server – Client 構成で実行したい、というものです。
Server、 Client はそれぞれ docker コンテナとして作成し、 Client となるコンテナからよりスペックの高いサーバにある Server 役コンテナに命令を送り JMeter を実行させます。
また別記事で取り上げますが、実行中の JMeter メトリクスを InfluxDB に送り、その結果を Grafana で可視化させることも目標とします。

環境

  • RedHat 7.3
  • Docker v19.03.13
  • Docker-Compose v1.27.4
  • justb4/docker-jmeter v5.4
  • JMeter v5.4.3
  • (InfluxDB v2.2.0)
  • (Grafana v8.4.5)

参考にしたページ

JMeter の docker イメージを作成している Git リポジトリを Clone

今回 JMeter の docker コンテナを作成するにあたり、 justb4/docker-jmeter の v5.4 (2022.06 時点の最新) を使用しました。
こちらのリポジトリをサーバに Clone します。
https://github.com/justb4/docker-jmeter
使い方については README にわかりやすく記載されているため参照ください。

justb4/jmeter イメージをビルド

サーバに JMeter の docker イメージをビルドします。
本来であればリポジトリ内の build.sh を叩くだけでイメージをビルドしてくれるのですが、私の現場はプロキシ配下の環境であるため実際は下記のようにプロキシ情報を docker build コマンドに渡すよう少し手を入れています。
また、タイムゾーンもデフォルトでは Europe/Amsterdam となっているため Asia/Tokyo に変更します。

#!/bin/bash

JMETER_VERSION="5.4"
IMAGE_TIMEZONE="Asia/Tokyo"

docker build --build-arg JMETER_VERSION=${JMETER_VERSION} \
--build-arg TZ=${IMAGE_TIMEZONE} \
--build-arg http_proxy=${proxy} \
--build-arg https_proxy=${proxy} \
-t "justb4/jmeter:${JMETER_VERSION}" .

適当に変更したら build.sh を 実行します。

JMeter Server の起動

Server 役のサーバ上で下記を実行。
実行すると Client からの命令を待ってくれます。

sudo docker run -it --rm \
     -p20000:20000 \
     justb4/jmeter:5.4 \
     -s -n -j /dev/stdout \
     -Dserver_port=20000 -Dserver.rmi.localport=20000 \
     -Dserver.rmi.ssl.disable=true \
     -Djava.rmi.server.hostname=$(host $(hostname)| awk '{print $4}') \
     -Jmode=Statistical

-p20000:20000 20000 番ポートを空ける
-Dserver_port=20000 -Dserver.rmi.localport=20000 使用するポートを指定する
-Dserver.rmi.ssl.disable=true SSLを無効化
-Djava.rmi.server.hostname=$(hostname -i | awk '{print $1}')

RMI(Remote Method Invocation)の設定。自身のホストサーバのIPアドレスを取得する
-Jmode=Statistical Cleint – Server間の通信量が多いため Statistical を設定して通信量を削減

JMeter Client の起動

test.sh から JMeter Client コンテナを起動できるよう修正

test.sh から呼ばれる run.sh は docker コンテナを起動させるシェルとなっています。
コンテナが JMeter の Client として起動されるよう引数部分を修正します。

# JMeterClient の起動
./run.sh -Dlog_level.jmeter=DEBUG \
        -Djava.rmi.server.hostname=$(hostname -i | awk '{print $1}') \
        -Dclient.rmi.localport=20001 \
        -Dserver.rmi.ssl.disable=true \
        -Jremote_hosts=${server-IPAddress}:20000 \
        -Jmode=Statistical \
        -n -t test/test.jmx -l test/test.jtl \
        -j test/jmeter.log \
        -e -o report -r -X

-Dlog_level.jmeter=DEBUG JMeter のログレベル
-Djava.rmi.server.hostname=$(hostname -i | awk '{print $1}')
RMI(Remote Method Invocation)の設定。自身のホストサーバのIPアドレスを取得する
-Dclient.rmi.localport=20001 デフォルトではポート番号が動的に使用されてしまうため固定化する
-Dserver.rmi.ssl.disable=true SSLを無効化
-Jremote_hosts=${server-IPAddress}:20000 リモートサーバのIPアドレスとポート番号を指定(リモートサーバは 20000 ポートを空けます)
-Jmode=Statistical Cleint – Server間の通信量が多いため Statistical を設定して通信量を削減
-n JMeter をCLIモードで実行
-t JMeter のシナリオファイルを指定
-l JMeter の結果ファイルを指定
-j JMeter のログファイルを指定
-e JMeter 実行後にダッシュボードのレポートファイル作成
-o ダッシュボードのレポートファイルを指定
-r remote_hosts で指定されたサーバでテストを実行
-X テスト終了時にサーバを終了(ログアウト)する

run.sh を修正

test.sh から呼ばれる run.sh を修正します。

#!/bin/bash
# Run JMeter Docker image with options

NAME="jmeter"
JMETER_VERSION="5.4"
IMAGE="justb4/jmeter:${JMETER_VERSION}"

# Finally run
docker run --rm --name ${NAME} --network=external-jmeter -i -v ${PWD}:${PWD} -w ${PWD} -p20001:20001 -p20002:20002 -p20003:20003 ${IMAGE} $@
d
  • -p20001:20001 -p20002:20002 -p20003:20003 リモートサーバとやり取りするポートは最大3つ使われるためこのオプションでポートを空ける
  • -network=external-jmeter JMeter のメトリクスを InfluxDB に送るための docker の使用ネットワーク
    ※別記事で説明します

test.sh を実行し Client を起動すると Server に実行命令が送られ JMeter が実行されます。
テスト終了まで待つと test.sh に指定したディレクトリにログやレポートファイルが作成されます。
レポートファイルについては下記を参照ください。すべて英語です。
Apache JMeter – User’s Manual: Generating Dashboard Report

ちなみに、環境さえ整えればシェルを実行するだけなので Jenkins ジョブから実行させてレポートファイルもジョブから確認する、なんてこともできます。(いつか Jenkins についての記事も書けたら。。)
また別の記事で JMeter メトリクスを InfluxDB に送り、Grafana でリアルタイムで結果を可視化させるようにする手順を紹介します。
ぼちぼち記事投稿できるようがんばります。

タイトルとURLをコピーしました