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

コールドスタートとは

関数アプリケーションを起動する際に、起動中の関数アプリケーションを一度停止して、 ランタイムなどを初期化してから起動を行なうこと。

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

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

コードの実行に対するオーバーヘッドに当たる1、2の実行には時間がかかる。

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

これを活用することで、コールドスタート時間を大幅に改善できる。


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

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

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

※ 割り当てられたサーバにAzure Filesコンテンツをマウント
※ 関数アプリ固有のアプリ設定を適用

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

  2. 関数アプリのコードを実行

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

一度コードを実行すると暫くの間はリソースが保持されるため、1~4の準備作業でコードをすぐに実行することができる。(ウォームスタート)

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

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


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

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

軽量なコードを書く

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

  • ファイルサイズ、ファイル数を減らす

関数アプリ内に依存関係ファイルなどのファイルが大量にある場合、 Azure FilesからのI / O操作の時間が増加し、メモリにロードするために必要な時間が長くなるため、コールドスタートが長くなる。

また、ファイル数が増えるとAzure Filesが処理する必要のあるファイルの数も増えるため、速度が低下する。

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

重い同期呼び出しがコードの完了をブロックしている場合、関数はうまく機能しない。

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

App Serviceプランで関数を実行すると、VMで発生することを制御できるため、これらの問題が緩和される。

参考

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