コラム

[Lambda]スロットリング頻度・エラー発生について検証

Lambdaでは同時アクセス数の上限を超えるとスロットリングという受信拒否のエラーを発生する処理が行われますが、実際に同時アクセスの上限を超えるのはどのようなタイミング・頻度で発生するのか計測してみたいと思います。同時にリトライ処理を行った場合はどの程度スロットリング処理をエラーにしないようにカバー可能なのかも判定してみたいと思います。

前提条件

  • 同実行数上限は1000 (Lambdaの同時実行数は1秒当たりのコール数×平均実行時間(秒))
  • 同時実行の予約は行わない
  • プロビジョニングされた同時実行設定は行わない

検証項目

  • スロットリングの回数
  • 実行時間
  • リトライでのスロットリングのカバー可否

検証ケース

次の5つの項目毎に検証していきます。

  1. 1秒程度の処理を指定回数並列実行する。
  2. 1の処理を1秒毎に5回繰り返し実行する。
  3. 10秒の処理を指定回数並列実行する。
  4. 3の処理を1秒毎に10回繰り返し実行する。
  5. 100秒の処理を60秒間の間に指定回数実行する。

1.1秒程度の処理を指定回数並列実行する。

  • 通常実行とリトライあり実行を検証する。
  • 通常実行は2回検証する。
  • 実行数は下記の6つのケースの回数をそれぞれ実行し結果を判定する。
ケース実行回数
Case1625
Case2750
Case3875
Case41000
Case51250
Case61500

2.1の処理を1秒毎に5回繰り返し実行する。

  • リトライあり実行のみ検証する。
  • 実行数は下記の6つのケースの回数をそれぞれ実行し結果を判定する。
ケース実行回数説明
Case1625 * 5 = 31251秒毎に625アクセスを5回
Case2750 * 5 = 37501秒毎に750アクセスを5回
Case3875 * 5 = 43751秒毎に875アクセスを5回
Case41000 * 5 = 50001秒毎に1000アクセスを5回
Case51250 * 5 = 62501秒毎に1250アクセスを5回
Case61500 * 5 = 75001秒毎に1500アクセスを5回

3.10秒の処理を指定回数並列実行する。

  • 通常実行のみ実行を検証する。
  • 実行数は下記の4つのケースの回数をそれぞれ実行し結果を判定する。
ケース実行回数
Case1125
Case2250
Case3375
Case4500

4.3の処理を1秒毎に10回繰り返し実行する。

  • リトライあり実行のみ検証する。
  • 実行数は下記の3つのケースの回数をそれぞれ実行し結果を判定する。
ケース実行回数説明
Case175*10=750 1秒毎に75アクセスを10回
Case2105*10=10501秒毎に105アクセスを10回
Case3150*10=15001秒毎に150アクセスを10回

5.100秒の処理を60秒間の間に指定回数実行する。

  • リトライあり実行のみ検証する。
  • 実行数は下記の3つのケースの回数をそれぞれ実行し結果を判定する
ケース実行回数
Case112*60=720 1秒毎に12アクセスを60回
Case216*60=9601秒毎に16アクセスを60回
Case320*60=12001秒毎に20アクセスを60回

検証方法

検証方法はLambaを親関数、中間関数、子関数の3つを用意します。
親関数は中間関数を複数並列実行、中間関数は子関数を複数並列実行する形でやりました。
検証は子関数が正常に処理されているかの判定をします。

関数の関連イメージ

実行時イメージ

検証結果

1.1秒程度の処理を指定回数並列実行する。

検証ケース

ケース実行回数
Case1625
Case2750
Case3875
Case41000
Case51250
Case61500

実行結果

case123456
throttleserrorthrottleserrorthrottleserrorthrottleserrorthrottleserrorthrottleserror
1回目0 5 2 17 242 356 
2回目0 0 1 41 230 462 
リトライ有0無し3無し2無し23無し435無し672無し

実行時間(秒) 

時間は全ての処理の終了時間を計測しています。

case123456
1回目1.62.62.72.73.33.1
2回目1.61.72222.9
リトライ有1.82.42.54.46.66.5

まとめ

  • 理論的にはスロットリングが出ない実行数でも出る事がある。
  • 明らかに上限を超えているものはスロットリングの数が多くなっている。
  • スロットリングが多くてもリトライ処理を入れていれば、エラーで返ってきていない。
  • 時間はスロットリングの多いケースはリトライが入ると全ての処理の終了時間は増大する。


2.1の処理を1秒毎に5回繰り返し実行する。

検証ケース

ケース実行回数説明
Case1625 * 5 = 31251秒毎に625アクセスを5回
Case2750 * 5 = 37501秒毎に750アクセスを5回
Case3875 * 5 = 43751秒毎に875アクセスを5回
Case41000 * 5 = 50001秒毎に1000アクセスを5回
Case51250 * 5 = 62501秒毎に1250アクセスを5回
Case61500 * 5 = 75001秒毎に1500アクセスを5回

実行結果

case123456
throttleserrorthrottleserrorthrottleserrorthrottleserrorthrottleserrorthrottleserror
リトライ有5無し2無し5無し931有り4936有り9503有り

実行時間(秒)

case123456
リトライ有7.47.47.441015.615.6

まとめ

  • 繰り返し実行するとスロットリングで出やすい。
  • ケース4から急にスロットリングが増える。
  • ケース5からもスロットリングが増大し、リトライ処理を入れても処理しきれなくなっている。この検証方法での限界値がこの辺りらしいです。
  • 時間はスロットリングの多いケースはリトライが入ると全ての処理の終了時間は増大する。


3.10秒の処理を指定回数並列実行する。

検証ケース

ケース実行回数
Case1125
Case2250
Case3375
Case4500

実行結果

case1234
throttleserrorthrottleserrorthrottleserrorthrottleserror
リトライ無0無し0無し0無し0無し
リトライ有0無し0無し0無し0無し

実行時間(秒)

case1234
1回目11.711.811.711.7

まとめ

  • 時間が長い処理を一回だけ上記の数を実行するだけでは、上限数を超えていないのでスロットリングは起きない。
  • 繰り返し実行した時にどうなるか次の項の結果を見てみましょう。

4.3の処理を1行毎に10回繰り返し実行する。

検証ケース

ケース実行回数説明
Case175*10=750 1秒毎に75アクセスを10回
Case2105*10=10501秒毎に105アクセスを10回
Case3150*10=15001秒毎に150アクセスを10回

実行結果

case123
throttleserrorthrottleserrorthrottleserror
リトライ有0無し9無し1228有り

実行時間(秒)

case123
リトライ有20.421.329.4

まとめ

  • 10秒の間に1000以上リクエストされるとスロットリングが発生する。
  • 大幅に超えるとリトライしても対応できない。


5.100秒の処理を60秒間の間に指定回数実行する。

検証ケース

ケース実行回数
Case112*60=720 1秒毎に12アクセスを60回
Case216*60=9601秒毎に16アクセスを60回
Case320*60=12001秒毎に20アクセスを60回

実行結果

case123
throttleserrorthrottleserrorthrottleserror
リトライ有0無し0無し1030有り

実行時間(秒)

case123
リトライ有160161160

まとめ

  • 此方も10秒の処理の時と同様に60秒の間に1000以上リクエストされるとスロットリングが発生する。
  • 大幅に超えるとリトライしても対応できない。

最後に

今回Lambdaのスロットリングの仕様を理解する為、いくつかのケースに分けて検証を行いましたが、概ね1000同時実行リクエストを発生するとスロットリングが発生しました。
1000を超えなくても発生する時があるので、リトライ処理は入れておいた方が良いと思います。
1000を大幅に超える際はリトライ処理をしれても対応できない為、処理の短縮や上限の緩和を検討する必要があります。

この記事をシェアする
  • Facebookアイコン
  • Twitterアイコン
  • LINEアイコン

お問い合わせ ITに関するお悩み不安が少しでもありましたら、
ぜひお気軽にお問い合わせください

お客様のお悩みや不安、課題などを丁寧に、そして誠実にお伺いいたします。

お問い合わせはこちら
お電話でのお問い合わせ 03-5820-1777(平日10:00〜18:00)
よくあるご質問