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

Masashi Yamamoto
Dec 20, 2019 · 18 min read

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

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

Image for post
Image for post

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

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

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

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

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

Gatling?

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

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

環境構築

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

  • ダウンロード
  • 解凍

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

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

ディレクトリ構成

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

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

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

空気感を掴みましょう 🐾

中身はこんな感じです。

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

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

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

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

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

Gatling発射(テスト実行)

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

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

Image for post
Image for post

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

例えば

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

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

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

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

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

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

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

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

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

Image for post
Image for post

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

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

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

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

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

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

まとめ

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

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

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

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

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

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

それでは良い年末を :)

Eureka Engineering

Learn about Eureka’s engineering efforts, product…

Masashi Yamamoto

Written by

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

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.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store