このトピックでは、最小インスタンス数を設定することで、エラスティックインスタンスのコールドスタートを最適化し、Function Compute における関数のパフォーマンスを向上させる方法について説明します。
コールドスタート
Function Compute はデフォルトでエラスティックインスタンスを使用します。これらのインスタンスは、リクエストに応じて自動的にスケールします。リクエストが到着すると、システムはそれを処理するためのインスタンスを作成します。インスタンスは、リクエストの処理が不要になると回収されます。課金対象となるのは、インスタンスがリクエストを処理している時間のみです。このエラスティックモデルによりリソース管理は簡素化されますが、コールドスタートや高いレイテンシーなど、パフォーマンス上の問題が発生することがあります。
コールドスタートとは、実行環境とコードを準備するプロセスです。このプロセスには、コードのダウンロード、関数インスタンスコンテナの起動、ランタイムの初期化、コードの初期化が含まれます。コールドスタートが完了すると、関数インスタンスはリクエストを処理できます。
コールドスタートの最適化
コールドスタートの最適化は、ユーザーとプラットフォームの共同責任です。Function Compute には多くのシステムレベルの最適化が含まれていますが、次の方法を使用することで、コールドスタート時間をさらに短縮できます。
コードパッケージのスリム化
不要な依存関係を削除し、コードパッケージを可能な限り小さく保つことができます。たとえば、Node.js では npm prune コマンド、Python では autoflake を実行できます。また、一部のサードパーティライブラリには、テストケースのソースコード、未使用のバイナリファイル、データファイルなど、実行に不要なファイルが含まれている場合があります。これらの未使用ファイルを削除することで、コードのダウンロードと展開に必要な時間を短縮できます。
適切な関数言語の選択
Java ランタイムは、言語設計の違いにより、通常は他の言語よりもコールドスタート時間が長くなります。コールドスタートのレイテンシーに敏感なアプリケーションでは、Python などの軽量な言語を使用することで、ロングテールレイテンシーを大幅に短縮できます。これは、言語間でウォームスタートのレイテンシーに大きな差がない場合に特に有効です。
適切なメモリサイズの選択
メモリ構成を大きくすると、同じ同時実行数に対してより多くの CPU リソースが割り当てられます。その結果、コールドスタートのパフォーマンスが向上します。
コールドスタート発生確率の低減
Initializer ハンドラを使用できます。Function Compute は初期化インターフェイスを非同期で呼び出すため、コードの初期化時間をリクエスト実行時間から分離できます。その結果、Function Compute のシステムアップグレードや関数更新の際に、コールドスタートが目立たなくなります。
混在モード
ユーザー側のコールドスタートの一部は解消が困難です。たとえば、ディープラーニング推論では大きなモデルファイルの読み込みが必要です。別の例として、初期化に時間がかかるクライアントを使用してレガシーシステムと連携する必要がある関数が挙げられます。これらのシナリオで、関数がレイテンシーに非常に敏感な場合は、最小インスタンス数を 1 以上に設定できます。リクエストが到着すると、休止状態のこれらのインスタンスはすばやく復帰してリクエストを処理できます。
最小インスタンス数を 1 以上に設定すると、システムはこれらの事前ウォーミングされたインスタンスへリクエストを優先的に割り当てます。事前ウォーミングされたインスタンスで現在のワークロードを処理できない場合、システムは自動的に追加のエラスティックインスタンスを作成します。このアプローチにより、パフォーマンスとリソース使用率のバランスが取れます。最小インスタンス数を設定することで、ワークロードの変動に対応するためのコンピュートリソースを事前に割り当てます。システムは、追加のインスタンスを作成している間も、事前ウォーミングされたインスタンスを使用してリクエストを処理し続けます。これにより、事前ウォーミングされたインスタンスで処理されるリクエストのコールドスタートレイテンシーが解消されます。
たとえば、ある関数の最小インスタンス数を 10 に設定したとします。同時ワークロードが 10 インスタンスを超えて必要な場合、システムは追加リクエストを処理するために新しいエラスティックインスタンスを作成します。インスタンスがフルロードであるかどうかは、同時実行数の構成によって異なります。システムは、各関数インスタンスが処理しているリクエストの数を追跡します。インスタンスの同時リクエスト数が設定された上限に達すると、システムは新しいリクエストを別の利用可能なインスタンスにルーティングします。利用可能なすべてのインスタンスが同時実行数の上限に達すると、新しいインスタンスが作成されます。
最小インスタンス数を 1 以上に設定した場合、リクエストを処理していないときでも、これらのインスタンスに対して課金されます。料金は、浅い休止状態にあるエラスティックインスタンスの単価に基づきます。課金の詳細については、「課金概要」をご参照ください。リソース使用量を希望する範囲内に保つために、最大インスタンス数を設定できます。