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

はじめに

どうも。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のインストールと実行をやってみました。実行ができたというだけで、他の設定等の理解が全然できてません。もう少し時間をかけていろいろと調べていきたいと思います。

参考