【 jmeter 使い方 】Macでシナリオ作成を行いAmazonliunx2で実行する方法を解説
「 jmeter 使い方 」で検索した方々。初めまして笑
業務で jmeter の使い方を調べることになったのですがなかなか苦労したのでまとめて記事にしました。
参考になれば幸いです。
今回は jmeter を使ってwebサーバに対して負荷テストを実行します。
jmeter とは
jmeter は、apache の提供するテストツールです。
負荷試験に使われます。
Apache JMeter(アパッチ ジェイメーター)はApacheソフトウェア財団にて開発されているソフトウェアで、クライアントサーバシステムのパフォーマンス測定および負荷テストを行うJavaアプリケーションである。HTTPレスポンスの内容の妥当性を判定することもできるため、パフォーマンステストのみならず、機能テストに使用することも可能である。当初はJakarta Projectにて開発されていたが、2011年にApacheのトップレベルプロジェクトに昇格した[1]。オープンソースかつ多数の機能を備えていることから、WebアプリケーションおよびWebサーバの性能測定に広く利用されている。
https://ja.wikipedia.org/wiki/JMeter
今回の構成
本記事では、下記の構成で進めます。
こちらにec2を指定した数作成するterraformのテンプレートを用意しましたのでご利用ください。
シンプルな構成なので手動で作成しても問題ありませんが、terraformを使ったことがない場合こちらの記事でインストールから解説しています。ぜひIaCを体験してみてください。
サーバ名 | 役割 |
jmeter-client | シナリオ実行を指示するサーバ。 |
jmeter-server | jmeter-clientから指示を受けてテストを実行するサーバです。 |
web-server | テスト対象のwebサーバ。httpdがインストールされています。 |
なお、web-serverの構築はこちらの記事では取り上げません。
また、サーバ間の通信には許可が必要なポートがありますので構成図を参考に各自設定をお願いします。
Macでの jmeter のシナリオ作成
jmeterでテストを実行するためには、内容を定義するjmxという定義ファイルが必要です。
jmxファイルの内容は非常に長いのですが、GUIで簡単に作成できます。
今回は、macにjmeterをインストールしてGUIからテストシナリオを作成します。
Macに jmeter をインストール~起動まで
コマンド一発でインストール可能です。流石のMac。。。
# インストール
$ brew install jmeter
# 起動
$ jmeter
GUIの設定変更
初期状態のGUIのテーマはDarklaf-Darculaになっています。(グレーっぽい画面)
このままですと、新規作成や保存ができないので先に変更しましょう。
変更方法は以下の通りです。
[Options]>[LookAndFeel]>[Systemを選択]
私の場合Systemに変更して問題なく利用できることを確認できました。
Systemでなくても利用できれば問題ありませんので確認の上自分の好きなテーマを選択してください。
Darklaf-Darculaのまま保存を行おうとすると、このようなエラーが出ます。
Uncaught Exception java.lang.IllegalAccessError: class com.github.weisj.darklaf.ui.filechooser.DarkFilePaneUIBridge$DetailsTableModel (in unnamed module @0x4c40b76e) cannot access class sun.awt.shell.ShellFolder (in module java.desktop) because module java.desktop does not export sun.awt.shell to unnamed module @0x4c40b76e in thread Thread[AWT-EventQueue-0,6,main]. See log file for details.
シナリオの作成
GUIの準備ができたらシナリオを作成していきます。
この記事で作成するシナリオは、1秒間で100回httpリクエストを送信するテストです。
ThreadGroupの作成
ThreadGroupは、複数のテストをひとまとめにするためのグループです。
本記事では、1つのテストしか作成しませんが、テストはThreadGroupに紐づきますので必要になります。
作成方法は以下の通りです。
[TestPlanを右クリック]>[Add]>[Threads(User)]>[ThreadGroupをクリック]
クリックすると、左ペインに歯車のアイコンが表示されると思います。
その画面から「1秒間に100回リクエストを送信する」と言うシナリオになるように設定します。
これでThreadGroupの作成は完了です。
テストの作成
続いて作成したThreadGroupの中にテストを定義します。
テストは、ある程度枠が用意されているのでそれを選択した後にリクエストの送信先などを設定するという流れです。
まずは、テストの作成を行います。
[ThreadGroupを右クリック]>[Add]>[Sampler]>[HttpRequest(上から二番目)をクリック]
スポイドのアイコンが表示されれば作成できています。
続いて、リクエストの送信先や種類を設定します。
作成したテストを左ペインから選択すると以下のような画面になるかと思います。
設定箇所は赤枠の箇所です。
項目 | 設定値 |
Protocol | http |
Server Name or IP | [テスト対象のIP] |
HTTP Request | GET |
Path | indexhtml |
設定できたら任意の場所に保存してシナリオ作成は完了です。
jmeterのダウンロードと設定
ここからの設定はjmeter-clientとserverで実施します。
ansibleが使える場合、こちらにplaybookがありますのでご利用ください。
javaのインストール
jmeterは、javaで動作しますのでインストールが必要です。
$ yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
javaがインストールされていないの以下のようなエラーが出ます。
$ apache-jmeter-5.3/bin/jmeter -v
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
jmeterのダウンロード
公式からダウンロードしたものを展開するだけで完了です。
$ wget http://www.trieuvan.com/apache//jmeter/binaries/apache-jmeter-5.3.zip
$ unzip apache-jmeter-5.3.zip
jmeterの編集
ダウンロードしてすぐの状態ではヒープ領域を1GB確保する設定になっているためt2.microでは動作しません。
jmeter起動前にヒープ領域を削減する必要があります。
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availability:
# : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}" # 166行目をコメントアウト
: "${HEAP:="-Xms128m -Xmx256m -XX:MaxMetaspaceSize=256m"}" # 追記 ヒープ領域確保を128MB~256MBの範囲に制限
そのまま実行すると、下記のようなエラーが出ます。
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
jmeter.propertiesの編集(ssl無効化)
sslが有効のままだと通信に必要な秘密鍵を作成したりと手間がかかるので今回は無効にします。
行数 | 項目 | 変更前 | 変更後 |
336 | server.rmi.ssl.disable | #server.rmi.ssl.disable=false | server.rmi.ssl.disable=true |
jmeter-clientのみの設定
ここからは、テスト実行を指示するjmeter-client側で実施する設定をこないます。
テストシナリオの配置
先ほど、Macで作成したテストシナリオのファイルをjmeterのディレクトリに配置します。
配置先は、apache-jmeter-5.3/bin/templates/
です。
templates配下に置いたjmxファイルを参照してシナリオ実行の指示を出します。
jmeter.propertiesの編集(remote_serverの追加)
jmeter.propertiesにjmeter-serverのIPアドレスを記載します。
行数 | 項目 | 変更前 | 変更後 |
260 | remote_hosts | remote_hosts=127.0.0.1 | remote_hosts=[jmeter-serverのIP] |
今回は、1台のみなので、remote_hostsで指定しているIPは1つですが、複数ある場合はカンマ区切りで全て記載します。
ここに記載されたサーバに対して1099番ポートでアクセスしてシナリオを実行させます。
jmeter-serverのみの設定
jmeter-serverの編集
次の一行を末尾に追記します。
RMI_HOST_DEF=-Djava.rmi.server.hostname=<jmeter-serverのローカルIP>
jmeterの起動
jmeterの起動はclient/serverの両方で行う必要があります。
起動コマンドは以下の通りです。
$ ~/apache-jmeter-5.3/bin/jmeter-server &
「&」はバックグラウンドで実行するための記号です。実行後Enterを押すとプロンプトに戻れます。
psコマンドでjmeterの起動確認ができます。
$ ps ax | grep jmeter
6522 pts/2 S 0:00 /bin/sh ./jmeter-server
6524 pts/2 S 0:00 /bin/sh ./jmeter -Dserver_port=1099 -s -j jmeter-server.log
6547 pts/2 Sl 0:01 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms128m -Xms256m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -jar ./ApacheJMeter.jar -Dserver_port=1099 -s -j jmeter-server.log
6629 pts/2 S+ 0:00 grep --color=auto jmeter
テストの実行
jmeter-client/serverでjmeterの起動が確認できたら実行します。
実行コマンドは下記の通りです。
$ ~/apache-jmeter-5.3/bin/jmeter -n -t templates/http_request.jmx -r
それぞれオプションは以下のような意味です。
オプション | 意味 |
-n | CLIでの実行を意味します。 |
-t | jmxファイルの内容を実行することを意味します。引数にjmxファイルを指定します。 |
-r | リモートサーバ(jmeter-server)を使ってシナリオを実行することを意味します。 |