web-dev-qa-db-ja.com

ラムダコールドスタートの可能な解決策?

CloudWatchを使用して20分ごとに呼び出されるようにラムダ関数をスケジュールすることは、ラムダのコールドスタート時間を取り除くための最良の方法ですか? (完全に取り除くわけではありません)...

これは高価になりますか、それとも今セットアップしていて機能していると思うので何か足りないものがありますか?.

コールドスタート前の時間は10秒程度で、その後のすべての呼び出しは80ミリ秒以内に完了します。これで、頻度に関係なくすべての呼び出しが約80ミリ秒になります。これは、ユーザーベースが拡大すると言うまでは良い方法ですか?その後、これをオフにすることができますか?

私の2番目のオプションは、beanstalkを使用し、サーバーを24時間年中無休で実行することですが、それは高価に聞こえるので、私はそれを好みません。

17
Jason Chitla

私の知る限り、これが現在機能をホットに保つ唯一の方法です。あなたがそれらの機能をたくさん持っているときだけ、それは高価になることができます。

関数をいくつ持っているか、毎回実行するのにどれくらいの時間がかかるか、どれだけのメモリが必要かを考慮して、関数を存続させるためにいくら支払うかを自分で計算する必要があります。

しかし、20分に1回は、月に2000回のようなものなので、たとえば、 128MBで、100ミリ秒未満で終了すると、このような機能の多くを20分間隔で存続させながら、無料枠の下に置くことができます。機能ごとに1か月あたり20秒になります。負荷が大きくなった後は、この時点では関係がないため、オフにする必要はありません。さらに、常に均一な負荷がかかることは決してないので、それでも心臓の鼓動するコードをアクティブに保つことができます。

私の推測では、関数を存続させるのは非常に安価であり(特に、関数をすぐに返す特別な引数がある場合)、その差は非常に大きい(10秒対80ミリ秒)ので、ほとんどの人がそうしますそれ-そうしない言い訳はほとんどありません。その場合、私はアマゾンがその慣行と戦うか(それを現在よりも難しくするか、より高価にすることによって-それは賢明な動きではないだろう)、または将来それを必要としないようにすることを期待する。ホットスタートとコールドスタートの差が100msの場合、誰も気にしません。それが10秒である場合、誰もがそれを回避する必要があります。

すべてをRAMに入れて準備ができていると無駄になるため、1秒前に実行されたコードと1か月前に実行されたコードの実行には常に違いがあります。多くのリソースがありますが、その違いを目立たなくすることができなかった理由はわかりません。また、ホットスタートとコールドスタートだけでなく、ステップをいくつか追加することもできませんでした。

14
rsp

Lambda関数により多くのメモリを割り当てることで、コールドスタート時間を改善できます。デフォルトの512MBでは、Javaで記述された関数のコールドスタート時間が8〜10秒になっています。これは、1536MBのメモリで2〜3秒に向上します。

Amazonによると 本当に重要なのはCPU割り当てですが、直接変更する方法はありません。 CPU割り当ては、メモリに比例して増加します。

また、コールドスタート時間をゼロに近づけたい場合は、rspが提案したように、関数を暖かく保つことが最善の方法です。

7
amit

サーバーをヒットしても、ユーザーによる同時リクエストの場合、または同じページがいくつかのAPIリクエストを非同期で送信する場合は解決されません。

より良い解決策は、「ウォームアップ」をDockerチェックポイントにダンプすることです。これは、ウォームアップが高速で、すべてのライブラリのロードが遅い動的言語で特に役立ちます。

詳細については、

https://criu.org/Docker

https://www.imperial.ac.uk/media/imperial-college/faculty-of-engineering/computing/public/1819-ug-projects/StenbomO-Refunction-Elimination-Serverless-Cold-Starts- Through-Container-Reuse.pdf

その他のヒント:

  • より多くのメモリを使用する
  • Pythonまたはほとんどの基本的なライブラリでJavaScriptを使用し、かさばるライブラリを削除してみてください
  • 複数の「マイクロサービス」を作成して、複数のユーザーが同じサービスにアクセスする可能性を減らします

詳細については、 https://www.jeremydaly.com/15-key-takeaways-from-the-serverless-talk-at-aws-startup-day/ をご覧ください。

0
Serge

ラムダ用のメモリを追加する中で、コールドスタートを減らすためのもう1つのアプローチがあります。Graalネイティブイメージツールを使用することです。 jarはバイトコードに変換されます。基本的に、awsで行われる作業の一部を行います。コードをビルドするとき、AWSにロードするときに、Java8ではなく「カスタムランタイム」を選択します。

役立つ記事: https://engineering.opsgenie.com/run-native-Java-using-graalvm-in-aws-lambda-with-golang-ba86e27930bf

注意:

ただし、制限もあります。動的なクラスのロードをサポートしておらず、リフレクションのサポートも制限されています

0
rastaman

2019年12月以降、AWS Lambdaは予約済み同時実行をサポートします(これにより、準備ができて新しい呼び出しを待機するラムダ関数の数を設定できます)[1]

これの欠点は、予約された同時実行に対して課金されることです。 1の同時実行性をプロビジョニングすると、128MBが1か月間24時間アクティブになるラムダの場合、次の料金が請求されます:1インスタンスx30日x24時間x60分x60秒x(128/1024)= 324,000GB-秒(AWSがラムダフリーティアに提供するほとんどすべての容量)[2]

上から、非常に高速に応答するラムダインスタンスを取得します...ただし、後続の同時呼び出しでは「コールドスタート」が発生する可能性があります。

さらに、ラムダのプロビジョニングされた同時実行性を動的に管理するようにアプリケーションの自動スケーリングを構成できます。 [3]

参照:

  1. https://aws.Amazon.com/blogs/aws/new-provisioned-concurrency-for-lambda-functions/
  2. https://aws.Amazon.com/lambda/pricing/
  3. https://docs.aws.Amazon.com/lambda/latest/dg/configuration-concurrency.html
0
LiriB

Azureには、サーバーレスインスタンス用の事前ウォーミングソリューションがあります( リンク )。これは、AWS lambdaが実装する場合、実装するときに優れた機能になります。

ユーザーがアプリケーションレベルでインスタンスをウォーミングする代わりに、プラットフォームのクラウドプロバイダーによって処理されます。

0
Surakshith