Kinesis, Lambdaのボトルネック解析時の考慮点をまとめてみました。
Kinesis
監視
CloudWatchで以下メトリクスを確認する。
呼び出しメトリクス
- IncomingRecords, GetRecords.Records
- 統計:合計
- Kinesisストリームに正常に送信されたレコード数、シャードから取得したレコード数
- PutRecord.Success / PutRecords.Success, GetRecords.Success
- 統計:平均合計
- ストリームごとの成功したPutRecordsオペレーションの数、ストリームごとの成功したGetRecordsオペレーションの数
- 平均の統計はPutRecord / PutRecords / GetRecordsオペレーションでのレコード数
- IncomingBytes, PuRecord/PuRecords.Bytes, GetRecords.Bytes
パフォーマンスメトリクス
- GetRecords.IteratorAgeMilliseconds
- 統計:平均、最大、P90
- ReadProvisionedThroughputExceeded / WriteProvisionedThroughputExceeded
- PutRecord.Latency / PutRecords.Latency / GetRecords.Latency
- 統計:平均、最大、P90
- PutRecord / PutRecords / GetRecordsオペレーションにかかった時間
上限
基本的にシャードあたり、レコードあたりの上限に引っかからなければ、シャードを増やす水平スケールでどこまでもスケールできる。懸念はお金だけ。
- シャード数上限
- デフォルトのシャードクォータは 200 (リージョンごと)
- だが、ハードリミットはなく上限緩和申請でどこまでもいける
- データ保持期間
- デフォルト24時間
- 最大で7日間
- 操作API呼び出し制限
- 書き込み制限
- 読み込み制限
- シャードあたり
- 2 MB/second
- 引っかかるとProvisionedThroughputExceededException
- レコードあたり
- 1 MB/record
- 10000 records/transaction
- 10 MB/transaction
- シャードあたり
- シャードイテレータ
Lambda
監視
CloudWatchで以下メトリクスを確認する。
呼び出しメトリクス
- Invocations
- 統計:合計
- Lambda実行数、処理量の確認
- エラーも含む
- Errors
- 統計:合計
- エラー発生していないか
- エラーが発生すると再実行になるので、ストリーミングにおいて回避しないと待ち行列増加につながる
- Throttles
- 統計:合計
- スロットリングが起こっていないか
- スロットルが起きている場合、InvocationにもErrorsにもカウントされない
パフォーマンスメトリクス
- Duration
- 統計:平均、最大、P90
- 処理時間
- IteratorAge
同時実行メトリクス
- ConcurrentExecutions
上限
Kinesis同様、同時実行数を増やす水平スケールでどこまでもスケールできる。懸念はお金だけ。
前まではENIが以下の式の分用意されていたのでIP枯渇がスケール限界の1観点だったが、2019年11月からはHyperplane ENIを使用して共通のENI、IPアドレスをリージョン×関数ごとに1つだけ用意されるようになったのでスケール限界としては考慮不要になった。
ENI = Projected peak concurrent executions * (Memory in GB / 3GB) # Projected peak concurrent executions: 関数がサポートする必要がある同時実行の数 # Memory: Lambda 関数用に設定したメモリの容量
- アカウント単位
- 同時実行数:リージョンごとに1000
- 関数とレイヤーストレージ:75GB
- VPCあたりのENI:250
- Kinesisシャード単位の同時実行数
- 並列化係数を使用してKiensisシャード数✕1~10の同時実行数にできる
参考
www.slideshare.net