ブログ
これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。
負荷試験ツール「Gatling」を試してみた。【Windows 10 編】
仕事でGatlingという負荷試験ツールを聞いたので、実験がてらに触ってみる事に。
このツールの事を調べると、よくApache Jmeterより使いやすい、軽い、見やすいだのと比較されて説明されているのですが、さてさて。
最初の問題はまだ新しいのか、日本語のドキュメントが整理されてないご様子。
この時点でオールドタイプの私として戦略的撤退を具申したいのですが、悲しいけどこれ、仕事なのよね。
実行環境はとりあえずLinuxは面倒臭いので、Windows10を選択。
ローカルPCでパパっと確認したい。
なお、参考にしたのは下記のサイト
参考:https://qiita.com/haru_tp/items/e213a93f5b3a3cd3c96f
①まずはソースをダウンロード
とりあえずGatling本家の「 https://gatling.io/open-source/ 」からダウンロード
※私が落とした時点ではバージョンは3.3.1 (gatling-charts-highcharts-bundle-3.3.1-bundle.zip) でした。
②Gatlingの実行
「D:\gatling-charts」にダウンロードしたソースを解凍し、「gatling-charts\bin」直下にある「gatling.bat」を実行
当然の如くエラー!
GATLING_HOME is set to "C:\Program Files\gatling-charts"
JAVA = "java"
'java' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
続行するには何かキーを押してください . . .
この手のサーバ系のツールはただ入れるだけだと、まずまともに動かない。メンドクサイ! 実行環境を整えてあげないといけません。
私的にはこの時点で、素人お断りって言ってるようでなんだかなと思います。 まぁ、フリーなので仕方がないとは思いますが・・・
ドキュメントも英語な時点で私にはチンプンカンプンです。 日本での普及を目指してる訳ではないでしょうから仕方ないでしょうが。
本家のインストールマニュアルをWeblio翻訳で翻訳しますが、さっぱりです。
翻訳能力がまだ低い、というか専門のページなんてまともに翻訳できないと思います。
とりあえずエラーメッセージでググるとJDKを入れろって事でしょう。
一応本家のサイトにも説明が書いてました。・・・機械翻訳だとこんな感じ。まぁ読めなくもない…読めなくはないけど、ねぇ・・・
ガトリングを立候補させるために、あなたは、JDKをインストールしておく必要があります。
ガトリングは、少なくともJDK8を必要とします。それから、あなたが最新のバージョンを使うことをおすすめします。
③JDKのインストール
とりあえずJDK本家の「 https://www.oracle.com/java/technologies/javase-jdk14-downloads.html 」に行って最新版をダウンロード
※日本語版のページから落としに行くとユーザ登録的な手続きが必要でメンドクサイので、英語のサイトから落とす。
インストーラーは一杯あって紛らわしいのですが、Windows10なので、「Windows x64 Installer」を選択。 落とした「jdk-14.0.1_windows-x64_bin.exe」を何も考えずにインストール。
さぁ、これでGatlingを実行だ! 当然の如く②のエラー!メンドクセェ!
・・・どうやら入れるだけだとダメらしくPATHを通さないといけないらしい。 インストーラーでその辺りしといて欲しいんだが、セキュリティのせいか何故か出来ない。気が利かない!天下のOracleだろ! ダラシネェな!オィ!
しぶしぶ下記のサイトを参考にPATHを設定する。
参考:https://eng-entrance.com/java-install-jdk-windows
④再度実行
とりあえずこれで動くかを確認。
再び「gatling-charts\bin」直下にある「gatling.bat」を実行
もにょもにょとしたログの後に、下記の内容が表示。どうやら動いているようである。
Choose a simulation number:
[0] computerdatabase.BasicSimulation
[1] computerdatabase.advanced.AdvancedSimulationStep01
[2] computerdatabase.advanced.AdvancedSimulationStep02
[3] computerdatabase.advanced.AdvancedSimulationStep03
[4] computerdatabase.advanced.AdvancedSimulationStep04
[5] computerdatabase.advanced.AdvancedSimulationStep05
とりあえずサンプルを動かしたい。って事で「0」を押下しEnter!
「Select run description (optional)」と表示されたら、再びEnter!
これで、BasicSimulationに定義された負荷試験シナリオが実行されるらしい。
※BasicSimulationは「gatling-charts\user-files\simulations\computerdatabase」以下にあるデフォルトのシナリオとの事。
結果は下記の通り。
---- Global Information --------------------------------------------------------
> request count 37 (OK=35 KO=2 )
> min response time 46 (OK=46 KO=91 )
> max response time 1205 (OK=1205 KO=100 )
> mean response time 173 (OK=177 KO=96 )
> std deviation 293 (OK=300 KO=5 )
> response time 50th percentile 73 (OK=68 KO=96 )
> response time 75th percentile 91 (OK=88 KO=98 )
> response time 95th percentile 1084 (OK=1088 KO=100 )
> response time 99th percentile 1172 (OK=1174 KO=100 )
> mean requests/sec 9.25 (OK=8.75 KO=0.5 )
---- Response Time Distribution ------------------------------------------------
> t < 800 ms 32 ( 86%)
> 800 ms < t < 1200 ms 2 ( 5%)
> t > 1200 ms 1 ( 3%)
> failed 2 ( 5%)
---- Errors --------------------------------------------------------------------
> status.find.in(200,201,202,203,204,205,206,207,208,209,304), f 2 (100.0%)
ound 400
Htmlでの結果は[gatling-charts\results\recordedsimulation-[実行日時]」のディレクトリのindex.htmlに 出力されているので見てみると下図のようになってます。
⑤独自シナリオを組んでテスト
とりあえず、サンプルが動いたら次は簡単にテストURLを実行するシナリオを作成して試してみる。
とりあえず、参考サイトを元に「gatling-charts\user-files\simulations\computerdatabase」に「SampleSimulation.scala」という名前でファイルを作成。内容の下記の通り。
これはテストで作った「 http://localhost:8080/test 」に対してGETリクエストを5秒間10ユーザが投げ続けるシナリオです。
package computerdatabase
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class SampleSimulation extends Simulation {
val httpProtocol = http
.baseUrl("http://localhost:8080/test") // Here is the root for all relative URLs
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // Here are the common headers
.doNotTrackHeader("1")
.acceptLanguageHeader("en-US,en;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
val scn = scenario("Sample Scenario")
.exec(http("request_1")
.get("/")
.check(status.is(200)))
setUp(
scn.inject(rampUsers(10) during(5 seconds)) .protocols(httpProtocol)
)
}
再び「gatling-charts\bin」直下にある「gatling.bat」を実行
Choose a simulation number:
[0] computerdatabase.BasicSimulation
[1] computerdatabase.SampleSimulation ← 作成したファイルが追加されてるので、これを選択
[2] computerdatabase.advanced.AdvancedSimulationStep01
[3] computerdatabase.advanced.AdvancedSimulationStep02
[4] computerdatabase.advanced.AdvancedSimulationStep03
[5] computerdatabase.advanced.AdvancedSimulationStep04
[6] computerdatabase.advanced.AdvancedSimulationStep05
とりあえず実行してみる。
---- Global Information --------------------------------------------------------
> request count 10 (OK=10 KO=0 )
> min response time 46 (OK=46 KO=- )
> max response time 83 (OK=83 KO=- )
> mean response time 57 (OK=57 KO=- )
> std deviation 11 (OK=11 KO=- )
> response time 50th percentile 54 (OK=54 KO=- )
> response time 75th percentile 60 (OK=60 KO=- )
> response time 95th percentile 78 (OK=78 KO=- )
> response time 99th percentile 82 (OK=82 KO=- )
> mean requests/sec 2 (OK=2 KO=- )
---- Response Time Distribution ------------------------------------------------
> t < 800 ms 10 (100%)
> 800 ms < t < 1200 ms 0 ( 0%)
> t > 1200 ms 0 ( 0%)
> failed 0 ( 0%)
細かいパラメータはまだよくわかりませんが、とりあえず動いたという事で一旦は検証終了!
具体的な試験段階に入ったら、レスポンスからパラメータ受け取ったり、受け取ったパラメータでまた別のAPIを叩いたりと面倒なシナリオを作成する必要があるのですが、とりあえず叩く事に成功したのでこの時点では満足。
◆感想
軽く使った感想ですが、シナリオ作成では、GUIで視覚的に作れるJmeterの方が使いやすい気がしました。 GatlingでのシナリオもRecorderを使えば少しはマシかもしれませんが、結局手でごちょごちょしないといけないので、面倒なんではないでしょうか。
まぁ、目的はシナリオの作りやすさではなく負荷試験なので、実行時の負荷が重要で、その辺りが軽い(・・・らしいです)Gatlingの選択はありかもしれません。 でもそれ言っちゃうともっと早い「The Grinder」というツールも今はあるそうなので、ぶっちゃけ答えは出ない! ただ、Gatligは試験結果の見た目の評価も高いらしく、見た感じかなり見やすかったです。ただ、最近はJmeterも綺麗になってきてるので、そう大差はないかもしれません。
やってみた感じ、導入の手間はどっちもどっちであんまし変わらない気がしました。 短期間での結果を求められる場合は、素直に手慣れたツール使った方がいいと思います。
この手のツールは、シナリオ周りの作り方や、実行環境の構成等、覚えるのが多くてメンドイので、全くその手のツール触った事がない! って人はGatlingでいいんじゃね?って程度の認識が素直な感想でした。
コメントはありません。