Azure Functionsにおけるコールドスタート

コールドスタートとは

コールドスタートとは、Azure Functionsが起動していない状態から初めて実行される際に、 ランタイムなどの初期化を一から行ってから起動すること。

コールドスタートの場合、Functionsが実行されるまでの大まかなフローは下記のようになっている。

  1. 容量のあるサーバーに関数アプリを割り当てる
  2. Functionsランタイムをそのサーバーで起動する
  3. 関数アプリのコードを実行する

手順1と2は、実際のコード実行前の準備作業(オーバーヘッド)であり、時間がかかる。

そのため、Azureでは毎回ゼロから開始するのではなく、Functionsランタイムが稼働するように事前構成されたアイドルワーカーを常に用意している。

この仕組みを活用することで、コールドスタート時間を大幅に短縮できる。


コールドスタートとウォームスタート

Azure Functionsの起動プロセスは、以下の手順で実行される。

  1. プールから事前構成されたサーバーを関数アプリに割り当てる

  2. サーバーを関数アプリ用に専門化する

    • 割り当てられたサーバーにAzure Filesコンテンツをマウント
    • 関数アプリ固有のアプリ設定を適用
  3. 関数ランタイムをリセットする

    • ランタイムは関数アプリ内のfunction.jsonファイルから拡張機能を読み込む
    • ソースコードが言語プロバイダーによってメモリに読み込まれる
  4. 関数アプリのコードを実行

コールドスタートの場合は、手順1~3の準備作業が行われてから手順4のコードが実行される。

一度コードを実行すると、しばらくの間はリソースが保持される。そのため、次の呼び出し時には手順1~3の準備作業をスキップして、すぐにコードを実行できる。これがウォームスタートである。

非アクティブ状態が約20分間続くと、リソースの割り当てが解除される。

その後の次の呼び出しは、再びコールドスタートとなる。


長期間のコールドスタートを回避する方法

※ 注意:2.0ランタイムで実行されている言語はプレビュー版であり、完全に最適化されていない可能性がある

軽量なコードを書く

コードが起動する前に発生する処理の量を最小限に抑え、大量のCPUを消費するコードを避ける。

ファイルサイズ・ファイル数を減らす

関数アプリ内に依存関係ファイルなどのファイルが大量にある場合、以下の理由でコールドスタートが長くなる。

  • Azure FilesからのI/O操作に時間がかかる
  • ファイルをメモリにロードするための時間が長くなる
  • ファイル数が多いと、Azure Filesが処理するファイルの数も増えるため、速度が低下する

できるだけ多くの処理を非同期にする

重い同期呼び出しがコードの完了をブロックしている場合、関数のパフォーマンスが低下する。

非同期処理を活用することで、効率的な実行が可能になる。

コールドスタートを完全に回避する

App Serviceプランで関数を実行すると、専用のVMで実行されるため、コールドスタートの問題が緩和される。

常に起動している状態を保つことができるため、安定したパフォーマンスが得られる。

参考

https://azure.microsoft.com/ja-jp/blog/understanding-serverless-cold-start/