理系学生日記

おまえはいつまで学生気分なのか

JMeterまわりの設定について

このゴールディンウィークに何をしていたのかというと、ずっとJMeterを勉強しています。

自分が参画しているプロジェクトにおいて性能テストを計画した際、もともとはabを使ってシステムをいじめてしまえば良いと考えていました。一方で、計画作業をしている中で、やはり複数ユーザを模してシナリオを流すようなテストは必要であろうと判断しました。そうすると、abではない別のツールが必要になります1

この手のテストシナリオを流すツールを考える際、やはりまずは歴史を重ねたJMeterのことを知っておきたいと思い、JMeterの勉強に勤しんでいます。

なお、いま使っているのはJMeterの5.5です。

$ jmeter -v
WARNING: package sun.awt.X11 not in java.desktop
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.5

Copyright (c) 1999-2022 The Apache Software Foundation

設定ファイルの考え方

まず、JMeterでは大きく分けてシステムプロパティ、JMeterのプロパティという2つの設定が存在します。両者は、user.propertiesプロパティで設定するか、あるいは、jmeterのコマンドラインオプションで指定する形になります。

システムプロパティ

system.propertiesにはjava.net.preferIPv4Stack等、主としてJVMの動作を決めるプロパティが記載されます。しかし、このファイルはユーザが編集するタイプのものではなく、変更したい設定をuser.propertiesにコピーし修正する運用が想定されています。実際、system.propertiesファイルには以下の記載があります。

#                      THIS FILE SHOULD NOT BE MODIFIED
#
# This avoids having to re-apply the modifications when upgrading JMeter
# Instead only user.properties should be modified:
# 1/ copy the property you want to modify to user.properties from jmeter.properties
# 2/ Change its value there

JMeterのプロパティ

JMeterそのものの挙動を決めるプロパティはjmeter.propertiesに記載があります。 例えば、反映したいプロパティを設定したファイルを指定するプロパティuser.propertiesもこのファイルに記載があります。

$ grep -B3 '^user.properties' /opt/homebrew/Cellar/jmeter/5.5/libexec/bin/jmeter.properties

# Should JMeter automatically load additional JMeter properties?
# File name to look for (comment to disable)
user.properties=user.properties

設定の読まれる順序

ざっと言ってしまえば、以下のような流れになります。

  1. JMeterのプロパティファイル (--propfileで明示的に指定しない場合は$JMETER_HOME/jmeter.properties)が読み込まれる
    • ここでuser.propertiessystem.propertiesプロパティが読み込まれる。初期値は、いずれもプロパティ名と同名のファイルです。
  2. user.propertiesに指定されたファイルが読み込まれる
  3. system.propertiesに指定されたファイルが読み込まれる
  4. コマンドラインオプションで指定されたプロパティが読み込まれる

ディレクトリの考え方

JMeterは環境変数JMETER_HOMEでそのインストールディレクトリを認識します。未指定の場合、jmeterあるいはjmeter.batのディレクトリがJMETER_HOMEとして設定されます。

このJMETER_HOMEを起点として、意識する必要があるのは以下の2つのディレクトリでしょう。

  1. $JMETER_HOME/lib
  2. $JMETER_HOME/lib/ext

前者にはJMeterのコアライブラリが配置され、後者にはJMeter用の拡張機能を配置します。 JMeterはプラグイン機構を持っており、様々な3rd. Party製のプラグインがネット上で配布されています。 このプラグイン(実体は.jarファイル)自体は$JMETER_HOME/lib/extへ配置することになるでしょう。

なお、JMeter Plugins :: JMeter-Plugins.orgではJMeter Plugin Managerも配布され、自前でjarファイルを配置していく作業をなくすことも可能です。 実際のところ、JMeter Plugin ManagerはデフォルトでJMeterにインストールされており、すぐ利用が可能です。便利ですね。

チームでJMeterを利用するときにプロパティファイルをどう配布するべきか

JMeterをチームで利用するにあたって難しそうだなと感じたのは、JMeterの設定(プロパティファイル)をどのようにチームで共有すべきかでした。

user.properties周りはJMETER_HOMEから読み込まれます。また、JMETER_HOMEはJMeterのインストールディレクトリです。したがって、user.propertiesをチームで共有する場合は以下の手間が発生します。

  1. リポジトリでuser.propertiesを管理
  2. メンバーにチェックアウトしてもらい、JMETER_HOMEに配置してもらう

また、メンバーがJMETER_HOME配下のuser.propertiesを変更したい場合、それをリポジトリにPUSHするのも面倒です。

この課題に対しては、-q (-addprop)オプションを利用するのが良さそうです。 このオプションを利用すると、jmeter.propertiesを読み込みつつ「追加のプロパティファイル」を読み込むことができます。チームで利用するuser.propertiesはリポジトリで管理し、メンバーはそれをチェックアウト。そしてJMeterを立ち上げる際に-qオプションでそのファイルを指定、という流れで運用は回りそうです。


  1. abでも可能でしょうが、abがテストシナリオに課す制約はかなり大きいと思われます。