designetwork

ネットワークを軸としたIT技術メモ

Tornado for Apache JMeterでBOSH環境で負荷試験する

f:id:daichi703n:20190120002223p:plain

パフォーマンス測定・負荷テストツールのApache JMeterをBOSHを用いて構築し、テストを実施する。Apache JMeter自体は通常のアプリケーションなので、Windows, Mac, Linux等にインストールして実行することができる。また、複数台で並列実行することで高負荷を発生させることができる。

複数台でJMeterを実行する方法も多く紹介されているが、今回はJMeterをBOSHで構築・管理する。BOSH環境の構築にはやや手間がかかるものの、既にCloud FoundryやKubernetesなどをBOSHで運用している場合は、デプロイメントを一つ追加するだけなので、それほどの手間ではない。BOSHであれば、ワーカーのスケールアップ・スケールアウトが簡単なので、JMeterサーバ側のスペックで悩む必要がなくなる。

Tornado for Apache JMeter(TM)

PivotalのエンジニアブログでApache JMeterをBOSHで使用する方法が紹介されている。

テストの実行は以下の二つのモードが用意されている。

Storm Mode: シナリオを実行する。

Tornado Mode: 負荷をかけ続ける。

設定項目

設定項目および設定例はこちらにある通り。GET, POSTやヘッダなど、基本的なHTTPの設定ができる。

今回はBOSH-Liteでの簡易な試験しかできないので、以下の設定とする。(Storm Mode)

$ cat jmeter.yml
---
name: jmeter

releases:
- name: jmeter-tornado
  version: "2.1.1"
  url: https://bosh.io/d/github.com/jamlo/jmeter-bosh-release?v=2.1.1
  sha1: c47ae7cd0094c5d9275ec083a8cdeef894f0064a

stemcells:
- alias: default
  os: ubuntu-xenial
  version: latest

update:
  canaries: 50
  max_in_flight: 50
  canary_watch_time: 5000-60000
  update_watch_time: 5000-60000

instance_groups:
- name: storm-workers
  azs: [z1]
  instances: 5
  jobs:
  - name: jmeter_storm_worker
    release: jmeter-tornado
    properties:
      jvm:
        xms: 512m
        xmx: 512m
  vm_type: default
  stemcell: default
  networks:
  - name: default

- name: storm
  lifecycle: errand
  azs: [z1]
  instances: 1
  jobs:
  - name: jmeter_storm
    release: jmeter-tornado
    properties:
      wizard:
        configuration:
          users: 20
          ramp_time: 120
          duration: 180
          simple_delay: 1000
          #gaussian_random_timer:
          #  constant_delay_offset: 1000
          #  deviation: 1000
        targets:
        - name: Nginx Test
          url: "http://nginx.bosh.local"
          http_method: GET
  vm_type: default
  stemcell: default
  networks:
  - name: default

デプロイする。

$ bosh deploy -d jmeter jmeter.yml
...

$ bosh vms
Using environment '192.168.1.222' as client 'admin'

Deployment 'jmeter'

Instance                                            Process State  AZ  IPs          VM CID                                VM Type  Active
storm-workers/9a400bab-8dc4-4546-8726-e78c4628f976  running        z1  10.244.0.7   91a376fb-e39b-4516-5f02-9ffd6a1c11ea  default  true
storm-workers/9eb08734-5212-46bf-89b3-9a2a31bd6697  running        z1  10.244.0.6   5cc877b6-dd9e-46ed-6c2f-c3c374ee2114  default  true
storm-workers/c4e6ad6e-6c41-44a7-a9a9-4dd531890680  running        z1  10.244.0.8   740e7621-18a3-4039-7ec4-5a63656e0149  default  true
storm-workers/d6872c84-9208-4192-961e-3b8474a9abdf  running        z1  10.244.0.9   df3ad346-032e-4bd6-6045-c7f50d205199  default  true
storm-workers/e8064360-e316-4abb-a9be-ad320be887f0  running        z1  10.244.0.10  2c3b6e4a-4a62-4b37-4d41-b47f010d895a  default  true

5 vms

テストの実行はErrandを実行する。--keep-aliveしておくとErrand VMの再作成の時間が省ける。

$ bosh run-errand -d jmeter storm --download-logs --keep-alive
Using environment '192.168.1.222' as client 'admin'

Using deployment 'jmeter'

Task 32

Task 32 | 10:41:45 | Preparing deployment: Preparing deployment
Task 32 | 10:41:46 | Preparing package compilation: Finding packages to compile (00:00:00)
Task 32 | 10:41:46 | Preparing deployment: Preparing deployment (00:00:01)
Task 32 | 10:41:46 | Creating missing vms: storm/e5b0dc90-139c-4827-9525-0311f919670d (0) (00:00:15)
Task 32 | 10:42:01 | Updating instance storm: storm/e5b0dc90-139c-4827-9525-0311f919670d (0) (canary) (00:00:33)
Task 32 | 10:42:34 | Running errand: storm/e5b0dc90-139c-4827-9525-0311f919670d (0) (00:03:52)
Task 32 | 10:46:27 | Fetching logs for storm/e5b0dc90-139c-4827-9525-0311f919670d (0): Finding and packing log files (00:00:04)

Task 32 Started  Sat Jan 19 10:41:45 UTC 2019
Task 32 Finished Sat Jan 19 10:46:31 UTC 2019
Task 32 Duration 00:04:46
Task 32 done

Instance   storm/e5b0dc90-139c-4827-9525-0311f919670d
Exit Code  0
Stdout     /var/vcap/packages/jmeter/bin /var/vcap/bosh

Stderr     -

1 errand(s)

Downloading resource 'b69ca9dc-adfb-4f06-65c2-cd6fd084c3a1' to '/Users/daichi703n/project/bosh-deployment/vbox/storm-20190121-011418-556246.tgz'...

###############################                                49.32% 7.02 MiB/s
Succeeded

Errand(テスト)が終了すると、手元にログファイルが転送される。

$ ls -l
-rw-------   1  3088938  1 19 20:18 storm-20190121-011418-556246.tgz

解凍すると結果が参照できる。

$ tar zxf ./storm-20190121-011418-556246.tgz -C ./logs
$ open ./logs/jmeter_storm/dashboard/index.html

f:id:daichi703n:20190121011625p:plain

f:id:daichi703n:20190121011640p:plain

Tornado Mode

Tornadoモードで実行する場合は、instance_groupsで以下のようにノードを作成する。負荷の増減は、instancesを増やした上で、bosh start, bosh stopにより起動台数を変更する。

- name: tornado-launcher
  azs: [z1]
  instances: 1
  jobs:
  - name: jmeter_tornado
    release: jmeter-tornado
    properties:
      wizard:
        configuration:
          users: 20
          ramp_time: 120
          simple_delay: 1000
        targets:
        - name: Nginx Test
          url: "http://nginx.bosh.local"
          http_method: GET

Tornadoモードではログやダッシュボードは生成されないため、別の方法で負荷状況等を確認する必要がある。

設定サンプル

test配下の一式が設定サンプルとして参考になる。

https://github.com/jamlo/jmeter-bosh-release/tree/master/test/assets/ops

要確認点

まとめ - Tornado for Apache JMeterでBOSH環境で負荷試験する

Tornado for Apache JMeterをBOSH環境にデプロイして負荷試験の環境を構築した。シンプルなHTTPであれば、デプロイYAMLの中のシンプルな定義で試験することができる。