Gatlingを使って負荷テストをしよう!

Masashi Yamamoto
Dec 20, 2019 · 18 min read

この記事は「eureka Advent Calendar 2019」20日目の記事です。昨日の記事は Daichi Haradaによる EC2 Image Builder + ansible + awscli を用いたゴールデンAMIの更新/反映自動化の検討でした。

こんにちはこんにちは、猫がより平和に暮らせる世界を作りたい
@marnieです。

ここ最近はデータベースやウェブサーバーなどなどの負荷・性能をコードを改善したり、DB側をいじいじしたり、cache入れたりなどなど
性能改善をする日々を過ごしています。

Pairsの性能改善と猫の関連性について、首をかしげたかもしれませんね。
Pairsの安定稼働は巡り巡って、人の役に立ち、猫達の平和に繋がるはずなので問題ありません。
信じましょう。

さて、性能改善を行うためにミドルウェアやOSなどの実行環境を入れ替えてみた,etc…などなどを行なった際にそもそも性能はどのくらい改善したんだろう…?

など知りたい事はないでしょうか?

今回は、そんなあなたの助けになるGatlingというツールを使った負荷テストのやり方について簡単な紹介をしてみようと思います。

Gatling?

GatlingはJVM上で動作する軽量な負荷テストツールで、以下のような特徴があります。

  • 軽量
  • Scalaを使ってテストシナリオを記述できる
  • レポートの自動生成
  • recorderを使ってブラウザ操作からテストシナリオが自動生成が可能。

環境構築

Gatlingを動作させる環境を構築します 🐼

  • ダウンロード
curl -O https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.3.1/gatling-charts-highcharts-bundle-3.3.1-bundle.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 — : — : — — : — : — — : — : — 0
100 60.1M 100 60.1M 0 0 33.4M 0 0:00:01 0:00:01 — : — : — 33.3M
  • 解凍
unzip gatling-charts-highcharts-bundle-3.3.1-bundle.zip

他にJDK8のインストールが必要なので、Oracleのサイトからダウンロードしてインストールをしてください。

バンドル版の場合はたったこれだけで完了です 🐱

ディレクトリ構成

実際に動かして見る前にディレクトリの構成を簡単にまとめてみました。

├── LICENSE
├── bin
│ └── gatlingやrecorderの実行ファイルが格納されている。
├── conf
│ └── 設定ファイル全般
├── lib
│ └── gatling自身が利用するjarファイルなど
├── results
└── テスト結果のログ、レポートの生成先
└── user-files
└── resources
│ └── search.csv
└── simulations
└── 実行するシュミレーション用のスクリプトを格納する場所

scalaでテストシナリオを記述する

まずはデフォルトで用意されている BasicSimulation.scala の中身を見て

空気感を掴みましょう 🐾

cd gatling-charts-highcharts-bundle-3.3.1/user-files/simulations/
cat computerdatabase/BasicSimulation.scala

中身はこんな感じです。

主だった設定部分に注釈をつけてみました。

package computerdatabase

大雑把な流れとしては、以下を記述するような形となります。

  • シュミレーションクラスの定義
  • url,headerなどテストに使用するhttp関連の設定をするオブジェクトの定義
  • テストシナリオオブジェクトの定義
  • setUp処理の呼び出し

BasicSimulation.scalaをコピーして簡単なテストを作ってみます。

mkdir example
cp computerdatabase/BasicSimulation.scala example/ExampleSimulation.scala
vim example/ExampleSimulation.scala

内容を編集して以下のようにします。

package example
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

Gatling発射(テスト実行)

さて、ようやく弾(テスト)の装填もできたので、早速Gatlingを発射してみましょう 。さぁパーティの始まりだァ! 😎

cd ../

無事実行されていれば、最後にレポートが作成された旨が出力されていますので、レスポンスタイムの分布などの統計情報を含むレポートがhtml形式で出力されます。便利。

今回はサンプルレベルですが、多機能なので、テストシナリオやセットアップ時の指定オプションを変更すれば、より高度なテストをする事も可能です。

例えば

.exec(
http("request_2")
.get("/xxx")
.check(status.is(200))
)

のように書くと特定ステータスだけをOKに分類したりする事もできますし、特定の結果が含んでいる場合のみを成功とみなすような書き方もできます。

また、実行数や並列での負荷のかけ方についても以下のように変更する事で柔軟な変更が行えます。

atOnceUsers(100) // 今回指定したタイプ 100回一気に起動する
constantConcurrentUsers(10) during (10 seconds), // 10秒間10Userを維持
rampConcurrentUsers(10) to (20) during (10 seconds) // 10秒かけて10User -> 20Userに増やす

詳細な設定や記法などは公式サイトのセットアップの説明ページ

チートシートが参考になります。

また、user-files/simulations/computerdatabase/advanced/配下にもサンプルがありますので、雰囲気を掴みたい時はサラっと見てみると良いと思います 😸

Recorderを使って操作からテストシナリオを生成する

とはいえ、scala書くのつらいよ…..もっと簡単にできないの?

と言う方向けに、Recorderというブラウザ操作からテストシナリオを生成できる機能があります。

bin/recorder.sh
GATLING_HOME is set to xxxx/test/gatling/gatling-charts-highcharts-bundle-3.3.1

GUIが立ち上がるので、startを押します。

RecorderがProxyとなって通信を記録してくれるので、利用しているPCと

ブラウザの設定を変更してHTTP/HTTPS通信がRecorderのPortを向くように設定してあげてください。

(上の例だとlocalhost:8000を指定する)

ブラウザ上で操作を行い、Stopするだけで以下のようなテストファイルが出来上がります。

cat user-files/simulations/RecordedSimulation.scala

BlackList/WhiteListを指定しておけば余計な通信を捕まえずに済みます。

scalaでの記述をガリガリ頑張るのが億劫な方はRecorderでまずテストシナリオを生成して、そこから変更を加える方が捗るかと思います 🐼

まとめ

簡単に、負荷テストツールであるGatlingの使い方を紹介してみました :)

最終的に本番の負荷をより実現していきたいとなってくると、本番で発生しているリクエスト分布や頻度にどれだけ近づけられるか?という課題とぶつかり、シナリオ構築の難しさと戦う事になると思います。

もし本当にそのようなテストがしたい場合はシナリオベースというよりもshadowProxyのような仕組みを導入してテスト環境にリクエストを流すような方が楽かもしれません。

ただ、多くの場合、そこまでのテストをしたいわけではなく、ボトルネックの抽出のために特定の処理を並列・連続させてみたい、とか例えば単純なベンチーマーク的な検証をしたい事の方が多いと思いますので、そう言ったシーンでは有効に活用できると思います 😃

注意として高頻度で大量のテストを行う際は、外部ホスティング環境の場合、内容によってはDDoSなどの攻撃として検知されて通信がブロックされてしまう可能性もありますので、その辺は事前に確認しておく方が良いと思います。

簡単な負荷試験をすぐに始められるのが良いところだと思いますので、是非使って見てください!

それでは良い年末を :)

Eureka Engineering

Learn about Eureka’s engineering efforts, product developments and more.

    Masashi Yamamoto

    Written by

    猫と猫が平和に暮らす社会の実現のために働いているエンジニアです。主にバックエンドアプリケーションとインフラのお世話を趣味にしています。趣味はロケ地を調べる事です。

    Eureka Engineering

    Learn about Eureka’s engineering efforts, product developments and more.

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade