jmeter負荷試験

こんにちは角田(tsunoda)です。
毎日暑いですね〜。

先日jmeterによる負荷試験を行ったので、ハマった部分などをご紹介します。

jmeterインストール

今回はjmeter-3.3を入れました。
ローカルのmacに入れてみる。
jmeterのソースが置いてあるページから3.3をインストールしました。
https://archive.apache.org/dist/jmeter/binaries/
上記URLよりapache-jmeter-3.3.tgzをダウンロード。
そしてインストールすると、
apache-jmeter-3.3/というディレクトリができます。
jmeter-3.3を起動

apache-3.3/bin/jmeter

起動するかと思いきや!
javaのバージョンが違っていたのでjavaの1.8.0を入れました。
javaの過去のバージョンをインストールして、
以下を.bashrcに追加して、source ~/.bashrc

export JAVA_HOME=`/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.8"`
PATH=$JAVA_HOME/bin:$PATH

いざ起動!
apache-meter-3.3/bin/jmeter
動きました。
使い方は詳しく説明してくれているサイトがあるので、
参考URLに貼っておきます。

今回は、

・ 記憶コントローラを使ってシナリオ作成
・ 自分がハマった部分
・ 今回の負荷試験のやり方
・ 先輩に教わった小技

を紹介します。

記憶コントローラを使ってシナリオ作成

jmeterを利用して、たくさんの画面にアクセスするシナリオを実施する場合、
画面の数だけサンプラーでHTTPリクエストを登録する必要があります。
これは、画面が多ければ多いほど面倒です。。
ところがどっこい、記憶コントローラを使うことで、 ブラウザで操作した動きをシナリオとして記憶してくれます!
 
記憶コントローラでシナリオを作成してみましょう。

図のようにワークベンチから選択します。
次に、対象となるコントローラの欄から、
ワークベンチ>記憶コントローラ
を選択します。
ブラウザのプロキシ設定をします。
HTTPプロキシサーバをstart!!
そのままアクセス先を最後までスクロールすると全て取得できます。
gif,css,jsファイルも入ります。
 
注意点としては、
HTTPプロキシサーバを停止しない限り記憶し続ける点です。
やたらとスクロールしちゃうと取得し過ぎるので気をつけなはれや!

それから、cssやjsファイルが取得できない事があります。
ローカルのキャッシュのようです。
シークレットモードでアクセスすると取得できます。

記憶コントローラを使ってシナリオを作成すると、
より実際のアクセスに近い状況で負荷試験ができるので、
結果もよりリアルなものを取れて便利だと思います。

ハマった事-jmxファイルを実行できない

テスト計画を作成し、動作確認後、 保存したjmxファイルを実行したら、実行できませんでした。
以下のエラーが出ました。

$ apache-jmeter-3.3/bin/jmeter -n -t sample.jmx
Creating summariser <summary>
Created the tree successfully using sample.jmx
Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan class!

これはなかなか苦戦しました。

結論を言うと、親要素が無い不完全なjmxファイルを作成していたからです。
回避するためには、

ファイルメニューの「テスト計画に名前をつけて保存」を使う。
テスト計画を選択した状態で「別名で保存」ボタンを押す。

自分はまず「テスト計画を保存」を利用。
その後、条件を変更したので「別名で保存」を使いました。
ここがミスでした。

実はこの「別名で保存」は、選択されたものを別名で保存するという意味の保存でした。
子要素を選択した状態で「別名で保存」をすると部分的な保存になってしまうのでした。
思っていた「別名で保存」とは違った。。
ファイルメニューの「テスト計画に名前をつけて保存」を使えば大丈夫です。

負荷試験の方法

今回はjmxファイルディレクトリを作り、そこにファイルを置いて、
同じディレクトリにlogファイルが作成されるようにスクリプトを作って負荷試験を行いました。

$ ls jmeter/
  sample.jmx top.jmx test.jmx run.sh

下図のようにthread、ramp、loopを変数にして、jmxファイルを作成しています。
スクリプト(run.sh)の引数で毎回指定できるように組んでいます。

$ ./run.sh sample.jmx 10 10 10

という感じです。
run.shの中身ではこのコマンドが実行されています。(一部抜粋)

~/apache-jmeter-3.3/bin/jmeter -n -t ${jmx_file} -l result_file/result-20180730 -e -o log/log-20180730 -JLoop=$2 -JThread=$3 -JRamp=$4

結果をfileに書き出しています。 引数でスレッド数などを変えて指定URLの負荷試験を行いました。

小技

小技を1つご紹介します。

テスト計画に他のファイルも追加して、1度に全部ではなく、1つずつ全部流したい。

そんな時はこうします。
jmeterの編集を押す→併合(マージ)を押して、追加するファイルを選択。

テスト計画を選択して、「各スレッドグループを別々に実行」にチェックを入れます。

こうすると1つずつ流してくれます。

またこの時、結果を1つの統計レポートに入れたければ、
それぞれのスレッドグループから削除して、 スレッドグループと同じ階層に統計レポートを置く。
すると全部その統計レポートに入ります。
緑の実行ボタンを押せば、1スレッドグループずつ全部やってくれます。

スレッドグループ毎に流してくれて、かつ結果を1つにまとめてくれるので、
データの共有などがしやすくて良いですね!

まとめ

あまりjmeterは触った事がなかったのですが、 負荷試験ツールとしては分かりやすいツールだと思いました。
grafanaなどと合わせて使うとより負荷の状況が明確に見えますね。
jmeterにはまだ他にも機能がありそうなので、 もう少し掘って♂勉強してみようかと思います。

参考URL jmeterシナリオ作成