调查了使用Lambda + API Gateway进行处理时变得非常慢的情况
使用 Lambda 和 API 网关执行可能需要超过10秒的时间。
这篇文章中的代码只是在VPC内向RDS插入一行记录,但使用curl命令执行时,往往要花费超过10秒才能返回响应。
在哪里可能会花费时间呢?
抑制可疑要点
-
- 怪しいポイント1: コンテナ起動のタイミング
Lambda はコンテナ上で実行される
コールされた時にコンテナがなかったらコンテナ作成から始める
1回コンテナが死んだ後の初期化のタイミングが怪しい
→ コンテナは 1回立ち上がったら 15〜20分生きているっていう話なので、15〜25分間隔でコールする
怪しいポイント2: RDS 接続
RDS に接続する際に時間がかかっている可能性もある
→ RDS に接続するファンクションと接続しないファンクションそれぞれで計測
怪しいポイント3: VPC 絡み
Lambda は CloudFront 使ってそうなので、VPC 使う場合に無理が出そう
→ VPC 使うファンクションと No VPC のファンクションそれぞれで計測
怪しいポイント4: 言語による違い
使用する言語でコンテナ初期化に有意の差が出そう
→ ランタイムを nodejs と Python にした場合それぞれで計測
测量的组合方法
为了调查上述可疑的要点,我尝试了下面的代码。
出于个人的亲切感,我只使用了nodejs和Python来完成。
-
- 用Node.js连接VPC和RDS并插入一行代码
-
- 用Node.js连接VPC只返回输入值的代码
-
- 用Node.js不使用VPC只返回输入值的代码
-
- 用Python连接VPC和RDS并插入一行代码
-
- 用Python连接VPC只返回输入值的代码
- 用Python不使用VPC只返回输入值的代码
-
- 実際に計測に使用したコードはこちら
-
- フレームワークは Serverless を使用
- 上記コードそれぞれを単体で、ある程度の期間毎時 0,15,35分 に curl からコールした
测量结果
意外的是,出現了明确的差异。由于变动范围很大,平均值并没有太大意义,重点可能是超过最小值的次数。
所有原始資料都在這裡(Google試算表)
总结
-
- VPC を利用する場合、実行にものすごく時間がかかることがある
-
- VPC を利用する場合、Python の方が nodejs よりも相対的に速そう
そもそも Lambda では非同期処理がさほど意味ない上に遅いのであれば nodejs 使う意味って
単純なコードしか試してないからかもしれないが
Python 使うにしても REST API で 10秒以上かかるのは許容しがたい
平均値だけ見るとうっかり許容しそうになるけど…
時間かかってるタイミングとコンテナ初期化のタイミングが一致するのか調べるべき
ランタイムによってコンテナの寿命が違うのか
同一プロジェクト内に複数のファンクション作った場合にコンテナは共用されるのか
されるのであれば、コンテナ初期化用のファンクションを別に作っておいて、あらかじめ起こしておけば実用に耐えうるかも?