![Tableau Serverの負荷テストを実行できるツール「Tabjolt」を使ってみた #tableau](https://devio2023-media.developers.io/wp-content/uploads/2018/11/tableau-logo-1200x630.png)
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のインストールと実行をやってみました。実行ができたというだけで、他の設定等の理解が全然できてません。もう少し時間をかけていろいろと調べていきたいと思います。