Azure Functions (Java) のコールドスタートアップが改善したらしい

このエントリは2023/11/06現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。

きっかけ

先日、以下のような記事が出た。

The team worked tirelessly to drastically lower the cold start numbers by optimizing the Java worker and its communication with the Functions host. 

Java on Azure Functions – 2023 Update
https://techcommunity.microsoft.com/t5/apps-on-azure-blog/java-on-azure-functions-2023-update/ba-p/3958581#toc-hId-835658924

この記事によると、コールドスタートの最適化により、最適化前(2023/1)と最適化後(2023/10)を比較すると以下のように改善されている、とのこと。

中央値、99Pの数値が小さくなっているので、全体としてコールドスタートが改善していることがわかるが、「確かに以前は遅かったけど、ほんまに体感できるぐらいに改善されているのか?」と感じたので、ちょっと実験&確認してみた。

Azure Functionsのサンプルコード

検証にあたっては、ふつうのFunctions Framework(つまり純正のフレームワークで、MicronautやSpring、Quarkusを使わないやつ)で実施し、Function AppはMavenなどで簡単に作成できるHTTPトリガーを使うことにした。他は特にいじってはいない。

Function AppはタイムアウトするとFunction Appはコールドスタートする。今回利用するConsumption Planのデフォルトタイムアウトは5分(最大10分)であるが、この検証では4分に設定した。

【注】
Premium Plan、App Service Planの場合はデフォルトタイムアウトは30分で、上限はない。

Function App タイムアウト期間 / Function app timeout duration
https://learn.microsoft.com/azure/azure-functions/functions-scale#timeout

HTTP Triggerの場合、Function Appの内部で使われているAzure Load Balancerの既定のアイドルタイムアウトが230秒ということもあり、今回はFunction Appのタイムアウトを4分に設定している。また、Function Appを24個(1個のFunction Appに24個のFunctionではなく)作成し、テストクライアントは10秒ずつずらして各Function Appを呼び出した場合、対象の24個のFunction Appを一巡すれば、二巡目では少なくとも240秒の間隔があくため、Function Appの4分のタイムアウトだけでなく、230秒というLoad Balancerの既定のアイドルタイムアウトも超えることから、厳密にコールドスタートの時間を計測できると考えられる。

なお、テストクライアント(右上図の左側のアイコン)の起動時間はFucntion Appのレイテンシには無関係なので、どのようなランタイムでもかまわない(今回は完全に個人の好み、静的ライブラリでリンクしたGraalVM Native Imageの形式で作成した。HTTP ClientはJDK 21からAutoClosableになったJDKに含まれるものを使っている)。

Build a Statically Linked or Mostly-Statically Linked Native Executable
https://www.graalvm.org/latest/reference-manual/native-image/guides/build-static-executables/

結果

で、試してみたところ、以下のようになった(右図の縦軸は件数、横軸はミリ秒)。

Average 552.57
StdDev542.99
50P170
90P 1207.6
95P1381.4
99P1978.18

今回の検証は前記のブログに比べて50Pはよいが、99Pは悪い。とはいえ、2023/1の結果と比べると確かにコールドスタートが改善していることがわかる(個人的には山が2個出来ているのは気になるところではある。このヒストグラムを見ると、コールドスタート出来ていないのではないか、とも読み取れてしまう)。

2023/11/06現在、Azure Functionsはまだ他クラウドベンダーで対応しているNative ImageやCRaC (CRaC対応するにはJDKをCraC Enabledにする必要がある) には対応していないため、今後どのような改善がなされるのか期待したい。既存のJDKでも、Static CDS + Dynamic CDS with trainingでかなりコールドスタートは改善されるので、そのような仕組みが入るだけでも劇的な効果を得られるはずだが、果たして。。。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください