doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

JMeterのクラスタをゆるく立ててみる

仕事でJMeterクラスタを使う必要が出てきたので、割と簡単に立てられる方法無いかなと思い、実際にやった方法を忘備録的に残しておく。(まあ会社のwikiにちゃんとあるんだけれど)

GatlingやSaasなどが既に沢山ある状況で、なんで昔ながらのJMeterかというと、既にあるシナリオを使いたいというのが最大の理由。 とはいえJMeterが悪いわけでは全く無いので新しい何かにするモチベーションもなかったのも事実。

構築は全部AWS上。スレッド数がそこそこ多いので、Master-Slave構成とした。 東京リージョンを使用して建てたが、負荷が1つのAZに依るのはテスト的にも基盤的にも良くないだろうと考え、2つのAZに均等にまたがって建てるようにした。
Slave側をstop/startする度にパブリックDNSが変わるのも不便かと思い、本当はEIPをアタッチすべきであるが、aws shellを使ってPublicDNS名引けるよなと思ったこと、将来的にはクラスタサイズを自由に変えたいという思いがあったことなどから敢えてEIPは使用していない。

tag:Nameを適切に設定していれば、aws cliとjqを使用して以下のように取得することが可能である。
以下はtag:Nameを load-test-jmeter-slave-1c に設定していた場合の例。

$ aws ec2 describe-instances --filters="Name=tag:Name, Values=load-test-jmeter-slave-1c" | jq -r ".Reservations[].Instances[].PublicDnsName"
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

これが分かればMasterからSlaveに接続する際に困らないはず。

JMeterとJava8のインストールはAnsibleを使用。 JMeterインストールの主要部分を切り出したロールはこんな感じ。

---

- name: download Apache JMeter
  shell: >
    wget -O {{ jmeter.src_path }} {{ jmeter.pkg_url }}

- name: Unarchive Apache JMeter
  unarchive:
    src: "{{ jmeter.src_path }}"
    dest: "{{ jmeter.dst_path }}"
    remote_src: yes

vars配下には以下の内容を記したmain.ymlを配置してある。

## vars for Apache Jmeter
---
jmeter:
  src_path: /usr/local/src/source/apache-jmeter-3.3.tgz
  dst_path: /usr/local/src/script
  pkg_url: http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//jmeter/binaries/apache-jmeter-3.3.tgz

読むと分かるのだがこれはJMeterのインストールにしか使えない。メモリのアロケーションとかその他confをいじった状態で再度Ansibleを流してしまうと綺麗サッパリなくなってしまうので注意。
(本当はちゃんと主要ファイルをテンプレート化して撒く処理を追加するなりすれば良いのだけれど、ゆるくクラスタを立ててみるの趣旨からはそれてしまうので、今回はなしの方向で)

ここまで出来ればとりあえずJMeterをMaster-Slave構成で起動できるようになる。

Masterから実際に繋いでみる。コマンドは以下のようになるはず。

$ ./jmeter -n -t test.jmx -e -l log.jtl \
  -R ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com,ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com,ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

一応オプションを説明すると、

-n cliモードで起動(本テストでは基本的にGUIを起動しないように)
-t シナリオファイルの指定
-e 実行後のレポート出力
-l 実行後のログファイルの出力
-R 使用するSlaveのエンドポイント

もっとちゃんと設定すると、 このページのような GatlingライクなHTMLでグラフィカルなレポートも出力できたりするが、今回はとりあえず動かしたかったので。 今回はここまで。