ぬまろぐ

←戻る

Gatling | 負荷設定の種類とユーザの立ち上がり方について

2023/3/12

Gatlingで負荷をかける際には同時ユーザ数(多重度に近い)やランプアップ、実行時間などの条件をソースコードで設定する必要があります。ここでは、細かい設定条件やその時のユーザの立ち上がり方の違いについて記載します。

Gatlingの実行条件一覧

以下は公式ドキュメントに記載のあるコードで、これら1~10の設定を複合的に指定することができます。その下にそれぞれの説明を記載しますが、ユーザという表現はシナリオを1回実行するスレッドと同意になります。

setUp(
  scn.inject(
    nothingFor(4 seconds), // 1
    atOnceUsers(10), // 2
    rampUsers(10) over(5 seconds), // 3
    constantUsersPerSec(20) during(15 seconds), // 4
    constantUsersPerSec(20) during(15 seconds) randomized, // 5
    rampUsersPerSec(10) to 20 during(10 minutes), // 6
    rampUsersPerSec(10) to 20 during(10 minutes) randomized, // 7
    splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 8
    splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30), // 9
    heavisideUsers(1000) over(20 seconds) // 10
  ).protocols(httpConf)
)
設定説明
nothingFor(4 seconds)指定した時間だけ一時停止します。
atOnceUsers(10)同時に指定した数ユーザを起動します(左の例だと10多重で1回同時実行します)
rampUsers(10) over(5 seconds)指定した時間で線形に指定したユーザ数までランプアップします。(左の例だと5秒間で線形に10ユーザが立ち上がりシナリオを実行します)
constantUsersPerSec(20) during(15 seconds)指定した時間の間、1秒間に指定したユーザ数が一定間隔で起動します。(左の例だと15秒の間、秒間20ユーザが立ち上がりシナリオを実行します)
constantUsersPerSec(20) during(15 seconds) randomized上記と同様ですが、ユーザの立ち上がりがランダムな間隔になります。
rampUsersPerSec(10) to 20 during(10 minutes)指定した時間の間、秒間のユーザ数を指定した開始/終了の秒間ユーザ数の間でランプアップしていきます。(左の例だと最初は秒間10ユーザの頻度でユーザを起動し10分後には秒間20ユーザの頻度でユーザを起動するようにランプアップしていきます)
rampUsersPerSec(10) to 20 during(10 minutes) randomized上記と同様ですが、ユーザの立ち上がりがランダムな間隔になります。
splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds)指定した時間間隔で指定したユーザ投入を指定したユーザ数になるまで実行する。(左の例だと1000ユーザになるまで10秒間隔で10ユーザのランプアップを繰り返します)
splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30)指定した2種類のユーザ投入を指定したユーザ数になるまで交互に実行します(左の例だと、10秒間10ユーザのランプアップと30ユーザ同時起動を交互に1000ユーザになるまで繰り返します)
heavisideUsers(1000) over(20 seconds)ヘヴィサイド段階関数で指定した時間で指定したユーザ数になるように実行する(左の例だと20秒間で1000ユーザになるようにヘヴィサイド段階関数でユーザを実行していく)

実行例:atOnceUsers

atOnceUsersとnothingForを組み合わせた例です。下記の場合は5ユーザ同時に起動して10秒待機、その後に再度5ユーザを同時に起動します。

setUp(scn.inject(
  atOnceUsers(5),
  nothingFor(10 seconds),
  atOnceUsers(5)
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。

IMG

実行例:rampUsers

setUp(scn.inject(
  rampUsers(10) over(5 seconds)
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。毎秒2ユーザ実行されています。

IMG

実行例:constantUsersPerSec

constantUsersPerSecの例になります。前半は一定間隔、その後5秒空けて後半はrandomizedを指定しています。

setUp(scn.inject(
  constantUsersPerSec(5) during(10 seconds),
  nothingFor(5 seconds),
  constantUsersPerSec(5) during(10 seconds) randomized
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。前半は常に一定のユーザ数になっていますが、後半はユーザ数がランダムに上下しています。

IMG

実行例:rampUsersPerSec

rampUsersPerSecの例になります。前半は一定間隔、その後5秒空けて後半はrandomizedを指定しています。

setUp(scn.inject(
  rampUsersPerSec(1) to 5 during(30 seconds),
  nothingFor(5 seconds),
  rampUsersPerSec(1) to 5 during(30 seconds) randomized
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。前半は秒間のユーザ数がほぼ一定間隔で増加しており、後半はそれにランダムさが加わっています。

IMG

実行例:splitUsers

splitUsersの例になります。5秒で10ユーザ(秒間2ユーザ)のランプアップを10秒間隔で50ユーザになるまで実行する例になります。

setUp(scn.inject(
  splitUsers(50) into(rampUsers(10) over(5 seconds)) separatedBy(10 seconds)
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。定期的に負荷が繰り返されるのが分かります。

IMG

また、交互に2種類のユーザ投入をする場合は以下のようになります。

setUp(scn.inject(
  splitUsers(50) into(rampUsers(10) over(5 seconds)) separatedBy atOnceUsers(5)
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。ランプアップと同時起動が交互に繰り返されるのが分かります。

IMG

実行例:heavisideUsers

heavisideUsersの例になります。10秒で50ユーザになるような設定になります。

setUp(scn.inject(
  heavisideUsers(50) over(10 seconds)
)).protocols(httpProtocol)

ユーザ数のグラフは以下のようになります。徐々にユーザ数が増加していき、時間の半分でピークになりその後減少していきます。

IMG

ユーザ数の増やし方が下図のようなヘヴィサイド関数になるのかと思われます。

IMG