ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Load Testing を使って Azure Functions Flex Consumption の HTTP Trigger のパフォーマンスとコストを最適化する

Azure Functions Flex Consumption が東日本リージョンで使えるようになりました。
Azure Load Testing を使って HTTP Trigger Function のパフォーマンスとコストを最適化する方法を試してみました。公式ブログの重要なポイントのみを取り上げていますので、詳細は下記の記事を参照してください。
techcommunity.microsoft.com

Flex Consumption とは

Flex Consumption は、Azure Functions に新しく追加されたホスティングオプションで、刷新されたバックエンド(Legion)による高速なスケーリングが最大の特徴です。さらに、従来の Consumption Plan では対応していなかった VNET Integration にも対応しています。

詳細は公式ドキュメントを参照していただくとして、パフォーマンスとコストに影響するスケーリングの設定を補足します。


スケーリングの動作

Flex Consumption は Function 毎に独立したインスタンスでスケーリングされますが、下記の3種類の Trigger については同じインスタンスでグループとしてまとめてスケーリングされます。

  • HTTP triggers
  • Blob storage triggers(Event Grid-based)
  • Durable Functions

インスタンスのメモリサイズ

現時点では、512 MB と 2,048 MB と 4,096 MB の 3 種類のサイズが提供されています。

インスタンス毎のコンカレンシー

コンカレンシーとは、インスタンスが処理できる並列リクエストの数です。Flex Consumption では、HTTP Trigger に新しい同時実行性が導入されました。

公式ブログから引用

既定のコンカレンシーは、下記の通りです。基本的には既定値を使いますが、パフォーマンスとコストを最適化する場合、この値を調整することになります。

公式ドキュメントから引用

インスタンスの最大スケーリング数

既定ではインスタンス数 0 台からスケーリングが開始され、最大数は 40 ~ 1,000 台まで設定できます。

コールドスタート削減

Flex Consumption にはコールドスタート削減として Always-ready が導入されており、常時実行させておくインスタンス数を設定できます。

Performance Optimizer とは

Azure Functions には、Azure Load Testing を使った Performance Optimizer が提供されており、パフォーマンスとコストの適切なバランスを見つけやすくなっています。

なお、Azure Load Testing の Test Profile を実行するためには、Azure Functions の Access control(IAM)で Website Contributor ロールにアカウントを追加する必要があります。


テストの設定と実行

それでは実際に Performance Optimizer を使って HTTP Trigger Function のパフォーマンスとコストの最適化を分析します。

前準備

Azure Functions Flex Consumption を東日本リージョンに作成します。Runtime Stack には、.NET9 を選択しました。

Visual Studio で HTTP Trigger の Function を作成し、1 秒間のスリープを入れました。

[Function(nameof(Function1))]
public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
{
    _logger.LogInformation("C# HTTP trigger function start.");

    await Task.Delay(1000);
    
    _logger.LogInformation("C# HTTP trigger function end.");
    return new OkObjectResult("Welcome to Azure Functions Flex Consumption!");
}

この Function App を Visual Studio から Azure にデプロイします。

Performance Optimizer で Test Profile を作成する

テストプランには、インスタンスのメモリサイズを 2,048 MB と 4,096 MB、コンカレンシーを 8、16、32 の組み合わせで 6 パターンを設定します。

テスト対象には、先ほどデプロイした HTTP Trigger Function を設定します。

3 分間にわたって10 ユーザーからリクエストを投げるミニマムな設定にしました。

Test Profile の作成が完了するとテストが開始されるので、完了まで待ちます。

テスト結果の分析

Performance Optimizer のテスト結果を確認します。メモリサイズ 4,096 MB と コンカレンシー 32 の構成が最もスループットが高い結果となりました。

どのくらいのインスタンス数がスケーリングされているのかを確認します。メモリサイズ 2,048 MB とコンカレンシー 8 の構成が最大 8 台で、それ以外の構成は最大 10 台でした。

requests
| where timestamp >= datetime(2025-5-7T07:50:00.0000000Z) and timestamp <= datetime(2025-5-7T09:50:00.0000000Z)
| summarize dcount(cloud_RoleInstance) by bin(timestamp, 1s)
| render columnchart

最もスループットが高かったメモリサイズ 4,096 MB とコンカレンシー 32 の構成のみを確認します。開始 1 秒で 10 台まで高速にスケーリングしていることが分かります。
この構成が最もスループットが高いことは分かりましたが、これに伴うコストはまだ分かりません。

Flex Consumption の Functions メトリクスのうち、OnDemandFunctionExecutionUnits メトリクスを確認します。mb-milliseconds 単位で測定されるので分かりにくいですが、インスタンスがアクティブな時間を表しています。右端の山(メモリサイズ 4,096 MB と コンカレンシー 32)の 800M が最もスループットが高い構成です。

パフォーマンス要件次第ですが、2 番目にスループットが高い左端の山(メモリサイズ 2,048 MB と コンカレンシー 8)が要件を満たしていれば、600 M 弱の実行時間に相当するコストで済むため、この構成も選択肢に含めて検討することができます。

まとめ

Azure Load Testing を使って Azure Functions Flex Consumption の HTTP Trigger のパフォーマンスとコストを最適化する方法を試してみました。

Flex Consumption は、実行時に使用されたメモリとコンピューティング時間に基づいて課金されます。メモリ設定を高くすると実行時間は速くなりますが、リクエストあたりのコストは高くなります。逆に、メモリ設定を低くするとコストは削減されますが、実行時間は長くなる可能性があります。
このトレードオフに対して、Performance Optimizer を活用することで、コストとパフォーマンスの最適なバランスを見つけやすくなります。