gatling

Page content

webのストレステストのツールで、 jmeter よりも色々できるらしいもの。

Gatling の特徴

scalaで様々なシナリオを書くことが出来、レポート、ログ機能も充実している。インストールは簡単で、 zip を持ってきて展開するだけですぐ使える。

何ができそう・出来たか

  • post, get, delete などをつなげることができる
  • rps (request/second) の調整や実行時間を設定できるだけでなく、 ramp up も可能 (ある rps から始めて 一定時間で線形にレートを増やし、ある rps まで到達させる、など
  • レポートは直下の reports ディレクトリにできて、 index.html にアクセスすれば、 highcharts を使った美しいグラフで充実のレポートを閲覧可能。

setup

AMI の設定ログ

sudo yum remove -y java-1.7.0-openjdk-1.7.0.201-2.6.16.0.78.amzn1.x86_64
sudo yum update -y
sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
sudo yum clean all
cd ~/
wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/2.3.1/gatling-charts-highcharts-bundle-2.3.1-bundle.zip && \
  unzip gatling-charts-highcharts-bundle-2.3.1-bundle.zip && \
  mv -f gatling-charts-highcharts-bundle-2.3.1 gatling

設定箇所

  • ディレクトリツリー

    gatling
    ├── bin
    ├── conf
    │   ├── logback.xml  # debug log setting
    │   └── gatling.conf  # performance tuning
    ├── lib
    │   └── zinc
    ├── results
    │   └── my-scenario1-1528429451035  # generated result html items
    │       ├── index.html
    │       ├── js
    │       └── style
    ├── target
    │   └── test-classes
    │       └── computerdatabase
    │           └── advanced
    └── user-files
        ├── bodies
        ├── data
        │   └── mydata.csv  # input parameters
        ├── log
        └── simulations
            ├── myproject  # scala scenario
            └── computerdatabase
                └── advanced
    
  • gatling.conf

    • gatling > http > ahc > requestTimeout あたりが GET リクエストの待ち時間かなぁ(結局まだ触ったこと無い)

実行方法

  • 詳細リファレンス: command line option

  • -s で自分のシナリオを指定できます

    $ cd gatling
    $ ./bin/gatling.sh -s computerdatabase.MySimulation
    
  • クラス名はシナリオファイルの先頭の方を見ればわかる。以下の例なら computerdatabase.my_test_24h:

    package computerdatabase
    
    import io.gatling.core.Predef._
    import io.gatling.http.Predef._
    import scala.concurrent.duration._
    
    class my_test_24h extends Simulation {
        ...
    }
    

チューニング

  • エラー時のreq/res出力: logback.xml を覗くと、エラーのときだけrequest, responseを出力してくれる設定がコメントアウトされているから、それ使ってデバッグ出力だった。 (参考は公式: Debugging – Gatling Open-Source Load Testing Documentation)

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern>
            </encoder>
            <immediateFlush>false</immediateFlush>
        </appender>
    
        <!-- uncomment and set to DEBUG to log all failing HTTP requests -->
        <!-- uncomment and set to TRACE to log all HTTP requests -->
        <!-- <logger name="io.gatling.http.engine.response" level="DEBUG" /> -->  ここを uncomment するのと、 DEBUG か TRACE に変更
    
        <root level="WARN">
            <appender-ref ref="CONSOLE" />
        </root>
    
    </configuration>
    
    • 解説
      • 確認したバージョン: 2.3.1 -> 3.3.1 で変わったようなので、 3.3.1 で確認した。
      • logger タグ: 以下の level に応じて出力レベルを変える
        • DEBUG: エラー時の req/res を出力
        • TRACE: すべての req/res を出力
      • appender タグ
        • コンソールに 標準出力(標準エラー出力?)として出す(デフォルト) か ファイルに出すかなどが指定できる
      • root タグ: ここで appender-ref で正しく appender を参照するひつようがあるそうです(雑
  • ソケット枯渇・ファイルディスクリプタ枯渇対策のチューニング: https://qiita.com/shokos@github/items/78d994d6673d8eb44348

  • timeout 値の チューニング: conf/gatling.conf にて

  • 複数台に scale out する方法: まだ手動だが公式参照