Tableau Serverの負荷テストを実行できるツール「Tabjolt」を使ってみた #tableau

jolt 【名】 〔突然の激しい〕動き、振動
2019.01.24

はじめに

どうも。DI部@大阪オフィスのtamaです。

Tableau Serverをインストールする環境のスペックについて悩んだことはありますか?

もちろん、Tableau Serverにはシステム要件が定められており、基本的にはそれを満たすハードウェアを用意することになります。

しかし、Tableau Serverにパブリッシュするワークブック・ビューは組織によって千差万別、そしてそれを閲覧するユーザー数も組織によって千差万別…。「これらのワークブックを同時に10人が見ても快適なサーバースペックってどのくらいやねん…」と迷うと思います。

そんな時に役立つのが、Tableau社が開発したオープンソースのツール「Tabjolt」です。JMeterをTableau Server用に魔改造したツールで、何らかのスクリプトを書くことなくTableau Serverに対して負荷テストを行うことが出来ます。Tabjoltで負荷テストを行うことで、その組織のTableau Serverに必要なスペックを検討することができます。

今回はそんなTabjoltを使ってみたエントリとなります(今回はとりあえず使ってみた…ということで、あまり細かい設定等は触れてません)。

当エントリの環境

  • Tableau Server
  • AWS EC2
  • Windows Server
  • v2018.3.2
  • 作業PC
  • macOS Mojave 10.14.2
  • VMware Windows 10 pro

インストールしてみる

インストール可能な環境

最低必須要件としては下記の通りです。

  • Windows OS
  • 2コア以上のCPU
  • 8GB以上のメモリ

ちなみに、同マシンにTableau Desktopもインストールしておくのが良いです(負荷テストの結果がTableauワークブックなので)。

インストール手順

インストーラーをダウンロード

下記よりGETします(本エントリでは「tabjolt_2018.2.0_x64.exe」をインストールします)。

インストーラーを実行

ウィザードをポチポチしていきます。

初めてインストールする時は気にしなくていいのですが、アップデートする場合(以前にTabjoltをインストールしている環境の場合)は、インストーラー実行時に旧Tabjoltをアンインストールしていいかどうか聞いてきます。ファイルが全て上書きされるので、Configファイル(C:\TabJolt\config)は別途バックアップをとっておいて、インストール完了後に移動させるなどして再利用することをオススメします。

また、アップデートする場合は、PostgreSQLもアンインストール(した後に新規インストール)されることになります。負荷テストの結果はPostgreSQLに格納されるため、アップデート前は、こちらもバックアップをとっておく必要があります。

初期設定を行う

ウィザードを進めると、Tabjoltの初期設定画面に移動します。最初は、負荷テストを行いたいTableau ServerのURLとサーバー管理者アカウント情報を入力します。

入力後、Nextを押すと、先程のTableau Serverを読み込み、負荷テストの対象となるビューが洗い出されます。問題なく一覧が取得できていることを確認したら、さらにNextをクリック。

最後は「OS Login」情報の入力画面です。OSのログイン情報…要するにTSMを使用する時のアカウント情報を入力すればOKです。

これでインストールは完了です。

Tabjoltで行う負荷テストについて

3種類のテストが用意されている

Tableau Serverにおける負荷テストで重要なのは「複数人が同時にビューを表示したり操作したとき」のパフォーマンスがどんなもんか…です。Tabjoltはそういったテストがすぐ行えるように、3種類のテストが用意されています。

  • InteractVizLoadTest.jmx
  • テスト対象のビューを読み込み、各操作を行うテスト
  • まずスライダーとかドロップダウンがあるかどうかをチェックする
  • そういったインタラクション要素がある場合は、それらを実行する
  • ない場合はビュー上のマークを選択する
  • ViewVizLoadTest.jmx
  • テスト対象のビューを読み込むだけのテスト
  • ビューに対する操作は行わない
  • ViewInteractVizLoadTest.jmx
  • テスト時間の50%はインタラクション(ビューに対する操作)込のテストを実行する
  • 残りの50%は読み込むだけのテストを実行する

簡単にいうと、「InteractVizLoadTest.jmx」はしっかりやるテスト、「ViewVizLoadTest.jmx」は簡易なテスト、「ViewInteractVizLoadTest.jmx」はリアルな利用状況に似せたテスト(ビューを操作する人もいれば、見るだけの人もいる)…といったところでしょうか。

ちなみに、これら以外にも、ユーザー自らカスタムしたテストを使用することもできます。…が、本エントリではそれらは一旦置いておきます(それだけで結構ボリュームがありそうなので)。

負荷テストを実行してみる

実行方法

テストを実行するには、Tabjoltのインストールフォルダに移動してgoコマンドを実行します。コマンドにはいくつかオプションがあります。

  • —t
  • 実行したいテストファイルを指定する
  • —d
  • テストにかける時間を指定する
  • 秒単位
  • —c
  • ビューを操作する同時ユーザー数を指定する

今回は同時に10人が3分間ビューを操作する時の負荷をテストしてみたいと思います。ずばり実行するコマンドはこちら。

go --t=testplans\InteractVizLoadTest.jmx --d=180 --c=10

いざ実行

>cd C:\TabJolt
>go --t=testplans\InteractVizLoadTest.jmx --d=180 --c=10
INFO [2019-01-23 18:26:07,751][main] (Main.java:54) - Perf harness is started with parameters: --rootPath=C:\TabJolt --t=testplans\InteractVizLoadTest.jmx --d=180 --c=10
INFO [2019-01-23 18:26:07,918][main] (Main.java:68) - Loading PerfTestConfig yaml file C:\TabJolt\config\PerfTestConfig.yaml
INFO [2019-01-23 18:26:08,051][main] (Main.java:73) - Loading ServerTestConfig yaml file C:\TabJolt\config\ServerTestConfig.yaml
INFO [2019-01-23 18:26:08,286][main] (PerfRunHelper.java:274) - C:\TabJolt\bin\dataretriever.exe -configpath=C:\TabJolt\config\dataretriever.config -duration=180 -outputpath=C:\TabJolt\results\2019-01-23_18-26-07\wincounter.tsv
INFO [2019-01-23 18:26:08,926][main] (Main.java:248) - No jmx counter groups found for any host. Skipping jmx data retriever.
-------------start windows performance counters collection-------------
Output File:c:\tabjolt\results\2019-01-23_18-26-07\wincounter.tsv
INFO [2019-01-23 18:26:38,948][main] (PerfRunHelper.java:188) - Waiting for processes "Windows Perf Counter Data Retriever" to start. 30 seconds have elapsed.
INFO [2019-01-23 18:26:54,970][main] (PerfRunHelper.java:474) - -------------start Jmeter load test run-------------
INFO [2019-01-23 18:26:54,970][main] (PerfRunHelper.java:475) - Output file: C:\TabJolt/results/2019-01-23_18-26-07/result-HL00241-WIN-0.jtl
INFO [2019-01-23 18:26:54,971][main] (PerfRunHelper.java:476) - Command: [C:\TabJolt/bin/jmeter.bat, , , , , , -n, -t=C:\TabJolt\testplans\InteractVizLoadTest.jmx, -j=C:\TabJolt/logs/jmeter_2019-01-23_18-26-07.log, -JthreadCount=10, -Jduration=180, -JloginWeight=1.0, -JconfigFolderPath=C:\TabJolt/config/, -Jlogpath=C:\TabJolt/results/2019-01-23_18-26-07/result-HL00241-WIN-0.jtl, -JserverUrl=http://54.250.223.87, ]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/TabJolt/lib/ext/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/TabJolt/lib/ext/slf4j-log4j12-1.7.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
INFO [2019-01-23 18:26:55,616][main] (ResultProcessor.java:137) - -------------start processing perf counters and run result-------------
-------------start processing perf counters and run result-------------
INFO [2019-01-23 18:26:55,618][main] (ResultProcessor.java:141) - Perf run result is saving to result repository. Please use this RUN ID 2 to view your result in Tableau
Perf run result is saving to result repository. Please use this RUN ID 2 to view your result in Tableau
INFO [2019-01-23 18:26:55,772][Thread-5] (PerfRunMonitor.java:37) - Starting Perfrun monitor thread
Created the tree successfully using C:\TabJolt\testplans\InteractVizLoadTest.jmx
Starting the test @ Wed Jan 23 18:26:56 JST 2019 (1548235616452)
Waiting for possible shutdown message on port 4445
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/TabJolt/lib/slf4j-nop-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/TabJolt/lib/ext/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/TabJolt/lib/ext/slf4j-log4j12-1.7.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]
#0 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 4645 Errors: 0
#1 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 4998 Errors: 0
#2 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 5409 Errors: 0
#3 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 2268 Errors: 0
#4 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2733 Errors: 0
#5 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 3506 Errors: 0
#6 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2594 Errors: 0
#7 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2201 Errors: 0
#8 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2674 Errors: 0
#9 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2153 Errors: 0
#10 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2244 Errors: 0
#11 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2910 Errors: 0
#12 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2540 Errors: 0
#13 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2672 Errors: 0
#14 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2419 Errors: 0
#15 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2159 Errors: 0
#16 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2034 Errors: 0
#17 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2285 Errors: 0
#18 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2411 Errors: 0
#19 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2393 Errors: 0
#20 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2514 Errors: 0
#21 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2047 Errors: 0
#22 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2533 Errors: 0
#23 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2504 Errors: 0
#24 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2264 Errors: 0
#25 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2179 Errors: 0
#26 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2012 Errors: 0
#27 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2216 Errors: 0
#28 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2327 Errors: 0
#29 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2279 Errors: 0
#30 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 2793 Errors: 0
#31 Threads: 10/10 Samples: 9 Latency: 0 Resp.Time: 2421 Errors: 0
#32 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 1354 Errors: 0
#33 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2089 Errors: 0
#34 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2583 Errors: 0
#35 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2451 Errors: 0
#36 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2727 Errors: 0
#37 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 1965 Errors: 0
#38 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1588 Errors: 0
#39 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2394 Errors: 0
#40 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2028 Errors: 0
#41 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 1899 Errors: 0
#42 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2192 Errors: 0
#43 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1972 Errors: 0
#44 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2322 Errors: 0
#45 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2238 Errors: 0
#46 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2377 Errors: 0
#47 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2082 Errors: 0
#48 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2079 Errors: 0
#49 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1993 Errors: 0
#50 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2196 Errors: 0
#51 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2469 Errors: 0
#52 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2361 Errors: 0
#53 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2421 Errors: 0
#54 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2084 Errors: 0
#55 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2352 Errors: 0
#56 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2381 Errors: 0
#57 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2604 Errors: 0
#58 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2234 Errors: 0
#59 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2231 Errors: 0
#60 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2206 Errors: 0
#61 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2641 Errors: 0
#62 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2410 Errors: 0
#63 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2692 Errors: 0
#64 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2233 Errors: 0
#65 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2357 Errors: 0
#66 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2158 Errors: 0
#67 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 1958 Errors: 0
#68 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2808 Errors: 0
#69 Threads: 10/10 Samples: 8 Latency: 0 Resp.Time: 2024 Errors: 0
#70 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2566 Errors: 0
#71 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2047 Errors: 0
#72 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2539 Errors: 0
#73 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2022 Errors: 0
#74 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2331 Errors: 0
#75 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1993 Errors: 0
#76 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2206 Errors: 0
#77 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2585 Errors: 0
#78 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2070 Errors: 0
#79 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2189 Errors: 0
#80 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 1993 Errors: 0
#81 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 2239 Errors: 0
#82 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2281 Errors: 0
#83 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1883 Errors: 0
#84 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 1818 Errors: 0
#85 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2357 Errors: 0
#86 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2427 Errors: 0
#87 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 1826 Errors: 0
#88 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2052 Errors: 0
#89 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2239 Errors: 0
#90 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 1766 Errors: 0
#91 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2476 Errors: 0
#92 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2133 Errors: 0
#93 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2381 Errors: 0
#94 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2532 Errors: 0
#95 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 1678 Errors: 0
#96 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2440 Errors: 0
#97 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2600 Errors: 0
#98 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2556 Errors: 0
#99 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2731 Errors: 0
#100 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2702 Errors: 0
#101 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 1811 Errors: 0
#102 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2163 Errors: 0
#103 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2525 Errors: 0
#104 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2498 Errors: 0
#105 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2677 Errors: 0
#106 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2251 Errors: 0
#107 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2136 Errors: 0
#108 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1758 Errors: 0
#109 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2153 Errors: 0
#110 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1493 Errors: 0
#111 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 1987 Errors: 0
#112 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1846 Errors: 0
#113 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2322 Errors: 0
#114 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2327 Errors: 0
#115 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 1347 Errors: 0
#116 Threads: 10/10 Samples: 8 Latency: 0 Resp.Time: 2543 Errors: 0
#117 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1971 Errors: 0
#118 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 1651 Errors: 0
#119 Threads: 10/10 Samples: 8 Latency: 0 Resp.Time: 2608 Errors: 0
#120 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 2284 Errors: 0
#121 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2123 Errors: 0
#122 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2348 Errors: 0
#123 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1677 Errors: 0
#124 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1755 Errors: 0
#125 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2803 Errors: 0
#126 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2414 Errors: 0
#127 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2051 Errors: 0
#128 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2575 Errors: 0
#129 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1974 Errors: 0
#130 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2261 Errors: 0
#131 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2482 Errors: 0
#132 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2315 Errors: 0
#133 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2450 Errors: 0
#134 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2533 Errors: 0
#135 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2272 Errors: 0
#136 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2763 Errors: 0
#137 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2383 Errors: 0
#138 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2203 Errors: 0
#139 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2671 Errors: 0
#140 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2242 Errors: 0
#141 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 1801 Errors: 0
#142 Threads: 10/10 Samples: 7 Latency: 0 Resp.Time: 2210 Errors: 0
#143 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1763 Errors: 0
#144 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2001 Errors: 0
#145 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2432 Errors: 0
#146 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1915 Errors: 0
#147 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2176 Errors: 0
#148 Threads: 10/10 Samples: 8 Latency: 0 Resp.Time: 2316 Errors: 0
#149 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 1634 Errors: 0
#150 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2339 Errors: 0
#151 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2239 Errors: 0
#152 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2105 Errors: 0
#153 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2380 Errors: 0
#154 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2559 Errors: 0
#155 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2513 Errors: 0
#156 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2661 Errors: 0
#157 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2399 Errors: 0
#158 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2138 Errors: 0
#159 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1798 Errors: 0
#160 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2033 Errors: 0
#161 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 2531 Errors: 0
#162 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2397 Errors: 0
#163 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2082 Errors: 0
#164 Threads: 10/10 Samples: 1 Latency: 0 Resp.Time: 2243 Errors: 0
#165 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2158 Errors: 0
#166 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1495 Errors: 0
#167 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 1992 Errors: 0
#168 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2094 Errors: 0
#169 Threads: 10/10 Samples: 3 Latency: 0 Resp.Time: 1523 Errors: 0
#170 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 2498 Errors: 0
#171 Threads: 10/10 Samples: 2 Latency: 0 Resp.Time: 2386 Errors: 0
#172 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2573 Errors: 0
#173 Threads: 10/10 Samples: 4 Latency: 0 Resp.Time: 4447 Errors: 0
#174 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 2155 Errors: 0
#175 Threads: 10/10 Samples: 6 Latency: 0 Resp.Time: 2249 Errors: 0
#176 Threads: 10/10 Samples: 5 Latency: 0 Resp.Time: 1871 Errors: 0
#177 Threads: 4/10 Samples: 5 Latency: 0 Resp.Time: 1847 Errors: 0
#178 Threads: 2/10 Samples: 2 Latency: 0 Resp.Time: 1721 Errors: 0
Tidying up ... @ Wed Jan 23 18:30:01 JST 2019 (1548235801094)
... end of run
INFO [2019-01-23 18:30:15,776][main] (PerfRunHelper.java:220) - Jmeter process has exited. Waiting for the other processes to exit.
INFO [2019-01-23 18:30:15,777][main] (PerfRunHelper.java:238) - All processes have exited.
INFO [2019-01-23 18:30:15,778][main] (PerfRunMonitor.java:57) - Perfrun is completed - ending monitor thread
INFO [2019-01-23 18:30:16,171][Thread-3] (PerfCounterDBSender.java:72) - Finished processing all perf counter records
INFO [2019-01-23 18:30:17,023][Thread-1] (JmeterResultDBSender.java:81) - Finish processeing all Jmeter perf result samples.
INFO [2019-01-23 18:30:17,057][main] (ResultProcessor.java:198) - -----------------------------------------------------
-----------------------------------------------------
INFO [2019-01-23 18:30:17,060][main] (ResultProcessor.java:203) - Perf run result have been stored. Please use this RUN ID 2 to view your result in Tableau
Perf run result have been stored. Please use this RUN ID 2 to view your result in Tableau

テストの結果を確認する

テストの結果もTableauで

さて、本番はここからです。負荷テストの結果はどうだったのでしょうか。結果はTableauワークブックの形で閲覧することができます。そのワークブックは下記の通り。

C:\TabJolt\PerformanceViz.twb

こいつを開いてみます。

…思ってたより複雑だった(そして思ったよりダッシュボードが多い)。

想像以上に詳しい結果が表示され、逆になかなか解釈するのが難しいです。このワークブックの詳しい調査は別の機会にじっくりやるとして、とりあえず比較的簡単な使い方を記したいと思います。

テストIDを指定する

コマンドプロンプトからテストを実行後、実行結果の最後らへんに「RUN ID」というものが出ると思います。このIDをワークブック上でフィルタリングできるようになっており、確認したいテストを指定することができます(もちろん複数のテスト結果を同時に見ることもできます)。

私が考える超基本的な使い方

まず、とりあえずエラーが出るかどうか…に着目してテストを進めていけばいいのではないかと思います。下記は同時ユーザー1人と10人のテスト結果です。どちらもerror rateは0…つまり、このTableau Serverは10人が同時にビューを操作しても(パフォーマンスはともかく)大丈夫なことがわかりました。

徐々にユーザー数を増やしていって、まずは純粋な限界同時ユーザー数を見つけましょう。もし、その人数が自組織の要件に満たない場合は、Tableau Serverのスペックを増強することを考えましょう(もちろんエラー内容によります。エラーは「Test Failures」というダッシュボードで詳細を確認することができます)。

あとはAVG response timeなどの値を見て、どれだけビューの表示や操作に時間がかかるか…といった事を確認します。「同時ユーザーが○○人でこれだけの時間だったら今のスペックでいい」みたいな判断ができるかと思います。

ここらへんの項目の解説は、本エントリ下部の参考リンク先に説明があります。

おわりに

とりあえずTabjoltのインストールと実行をやってみました。実行ができたというだけで、他の設定等の理解が全然できてません。もう少し時間をかけていろいろと調べていきたいと思います。

参考