Lambdaでは同時アクセス数の上限を超えるとスロットリングという受信拒否のエラーを発生する処理が行われますが、実際に同時アクセスの上限を超えるのはどのようなタイミング・頻度で発生するのか計測してみたいと思います。同時にリトライ処理を行った場合はどの程度スロットリング処理をエラーにしないようにカバー可能なのかも判定してみたいと思います。
前提条件
- 同実行数上限は1000 (Lambdaの同時実行数は1秒当たりのコール数×平均実行時間(秒))
- 同時実行の予約は行わない
- プロビジョニングされた同時実行設定は行わない
検証項目
- スロットリングの回数
- 実行時間
- リトライでのスロットリングのカバー可否
検証ケース
次の5つの項目毎に検証していきます。
- 1秒程度の処理を指定回数並列実行する。
- 1の処理を1秒毎に5回繰り返し実行する。
- 10秒の処理を指定回数並列実行する。
- 3の処理を1秒毎に10回繰り返し実行する。
- 100秒の処理を60秒間の間に指定回数実行する。
1.1秒程度の処理を指定回数並列実行する。
- 通常実行とリトライあり実行を検証する。
- 通常実行は2回検証する。
- 実行数は下記の6つのケースの回数をそれぞれ実行し結果を判定する。
ケース | 実行回数 |
---|
Case1 | 625 |
Case2 | 750 |
Case3 | 875 |
Case4 | 1000 |
Case5 | 1250 |
Case6 | 1500 |
2.1の処理を1秒毎に5回繰り返し実行する。
- リトライあり実行のみ検証する。
- 実行数は下記の6つのケースの回数をそれぞれ実行し結果を判定する。
ケース | 実行回数 | 説明 |
---|
Case1 | 625 * 5 = 3125 | 1秒毎に625アクセスを5回 |
Case2 | 750 * 5 = 3750 | 1秒毎に750アクセスを5回 |
Case3 | 875 * 5 = 4375 | 1秒毎に875アクセスを5回 |
Case4 | 1000 * 5 = 5000 | 1秒毎に1000アクセスを5回 |
Case5 | 1250 * 5 = 6250 | 1秒毎に1250アクセスを5回 |
Case6 | 1500 * 5 = 7500 | 1秒毎に1500アクセスを5回 |
3.10秒の処理を指定回数並列実行する。
- 通常実行のみ実行を検証する。
- 実行数は下記の4つのケースの回数をそれぞれ実行し結果を判定する。
ケース | 実行回数 |
---|
Case1 | 125 |
Case2 | 250 |
Case3 | 375 |
Case4 | 500 |
4.3の処理を1秒毎に10回繰り返し実行する。
- リトライあり実行のみ検証する。
- 実行数は下記の3つのケースの回数をそれぞれ実行し結果を判定する。
ケース | 実行回数 | 説明 |
---|
Case1 | 75*10=750 | 1秒毎に75アクセスを10回 |
Case2 | 105*10=1050 | 1秒毎に105アクセスを10回 |
Case3 | 150*10=1500 | 1秒毎に150アクセスを10回 |
5.100秒の処理を60秒間の間に指定回数実行する。
- リトライあり実行のみ検証する。
- 実行数は下記の3つのケースの回数をそれぞれ実行し結果を判定する
ケース | 実行回数 | |
---|
Case1 | 12*60=720 | 1秒毎に12アクセスを60回 |
Case2 | 16*60=960 | 1秒毎に16アクセスを60回 |
Case3 | 20*60=1200 | 1秒毎に20アクセスを60回 |
検証方法
検証方法はLambaを親関数、中間関数、子関数の3つを用意します。
親関数は中間関数を複数並列実行、中間関数は子関数を複数並列実行する形でやりました。
検証は子関数が正常に処理されているかの判定をします。
関数の関連イメージ
実行時イメージ
検証結果
1.1秒程度の処理を指定回数並列実行する。
検証ケース
ケース | 実行回数 |
---|
Case1 | 625 |
Case2 | 750 |
Case3 | 875 |
Case4 | 1000 |
Case5 | 1250 |
Case6 | 1500 |
実行結果
case | 1 | 2 | 3 | 4 | 5 | 6 |
---|
throttles | error | throttles | error | throttles | error | throttles | error | throttles | error | throttles | error |
---|
1回目 | 0 | | 5 | | 2 | | 17 | | 242 | | 356 | |
---|
2回目 | 0 | | 0 | | 1 | | 41 | | 230 | | 462 | |
---|
リトライ有 | 0 | 無し | 3 | 無し | 2 | 無し | 23 | 無し | 435 | 無し | 672 | 無し |
---|
実行時間(秒)
時間は全ての処理の終了時間を計測しています。
case | 1 | 2 | 3 | 4 | 5 | 6 |
1回目 | 1.6 | 2.6 | 2.7 | 2.7 | 3.3 | 3.1 |
2回目 | 1.6 | 1.7 | 2 | 2 | 2 | 2.9 |
リトライ有 | 1.8 | 2.4 | 2.5 | 4.4 | 6.6 | 6.5 |
まとめ
- 理論的にはスロットリングが出ない実行数でも出る事がある。
- 明らかに上限を超えているものはスロットリングの数が多くなっている。
- スロットリングが多くてもリトライ処理を入れていれば、エラーで返ってきていない。
- 時間はスロットリングの多いケースはリトライが入ると全ての処理の終了時間は増大する。
2.1の処理を1秒毎に5回繰り返し実行する。
検証ケース
ケース | 実行回数 | 説明 |
---|
Case1 | 625 * 5 = 3125 | 1秒毎に625アクセスを5回 |
Case2 | 750 * 5 = 3750 | 1秒毎に750アクセスを5回 |
Case3 | 875 * 5 = 4375 | 1秒毎に875アクセスを5回 |
Case4 | 1000 * 5 = 5000 | 1秒毎に1000アクセスを5回 |
Case5 | 1250 * 5 = 6250 | 1秒毎に1250アクセスを5回 |
Case6 | 1500 * 5 = 7500 | 1秒毎に1500アクセスを5回 |
実行結果
case | 1 | 2 | 3 | 4 | 5 | 6 |
---|
throttles | error | throttles | error | throttles | error | throttles | error | throttles | error | throttles | error |
---|
リトライ有 | 5 | 無し | 2 | 無し | 5 | 無し | 931 | 有り | 4936 | 有り | 9503 | 有り |
---|
実行時間(秒)
case | 1 | 2 | 3 | 4 | 5 | 6 |
リトライ有 | 7.4 | 7.4 | 7.44 | 10 | 15.6 | 15.6 |
まとめ
- 繰り返し実行するとスロットリングで出やすい。
- ケース4から急にスロットリングが増える。
- ケース5からもスロットリングが増大し、リトライ処理を入れても処理しきれなくなっている。この検証方法での限界値がこの辺りらしいです。
- 時間はスロットリングの多いケースはリトライが入ると全ての処理の終了時間は増大する。
3.10秒の処理を指定回数並列実行する。
検証ケース
ケース | 実行回数 |
---|
Case1 | 125 |
Case2 | 250 |
Case3 | 375 |
Case4 | 500 |
実行結果
case | 1 | 2 | 3 | 4 |
---|
throttles | error | throttles | error | throttles | error | throttles | error |
---|
リトライ無 | 0 | 無し | 0 | 無し | 0 | 無し | 0 | 無し |
リトライ有 | 0 | 無し | 0 | 無し | 0 | 無し | 0 | 無し |
---|
実行時間(秒)
case | 1 | 2 | 3 | 4 |
1回目 | 11.7 | 11.8 | 11.7 | 11.7 |
まとめ
- 時間が長い処理を一回だけ上記の数を実行するだけでは、上限数を超えていないのでスロットリングは起きない。
- 繰り返し実行した時にどうなるか次の項の結果を見てみましょう。
4.3の処理を1行毎に10回繰り返し実行する。
検証ケース
ケース | 実行回数 | 説明 |
---|
Case1 | 75*10=750 | 1秒毎に75アクセスを10回 |
Case2 | 105*10=1050 | 1秒毎に105アクセスを10回 |
Case3 | 150*10=1500 | 1秒毎に150アクセスを10回 |
実行結果
case | 1 | 2 | 3 |
---|
throttles | error | throttles | error | throttles | error |
---|
リトライ有 | 0 | 無し | 9 | 無し | 1228 | 有り |
実行時間(秒)
case | 1 | 2 | 3 |
リトライ有 | 20.4 | 21.3 | 29.4 |
まとめ
- 10秒の間に1000以上リクエストされるとスロットリングが発生する。
- 大幅に超えるとリトライしても対応できない。
5.100秒の処理を60秒間の間に指定回数実行する。
検証ケース
ケース | 実行回数 | |
---|
Case1 | 12*60=720 | 1秒毎に12アクセスを60回 |
Case2 | 16*60=960 | 1秒毎に16アクセスを60回 |
Case3 | 20*60=1200 | 1秒毎に20アクセスを60回 |
実行結果
case | 1 | 2 | 3 |
---|
throttles | error | throttles | error | throttles | error |
---|
リトライ有 | 0 | 無し | 0 | 無し | 1030 | 有り |
実行時間(秒)
まとめ
- 此方も10秒の処理の時と同様に60秒の間に1000以上リクエストされるとスロットリングが発生する。
- 大幅に超えるとリトライしても対応できない。
最後に
今回Lambdaのスロットリングの仕様を理解する為、いくつかのケースに分けて検証を行いましたが、概ね1000同時実行リクエストを発生するとスロットリングが発生しました。
1000を超えなくても発生する時があるので、リトライ処理は入れておいた方が良いと思います。
1000を大幅に超える際はリトライ処理をしれても対応できない為、処理の短縮や上限の緩和を検討する必要があります。