Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Azure Functions automatically scales out your function app by adding instances based on the number of incoming events. How your app scales, including the rate of scale-out, maximum instances, and whether functions scale independently, depends on your hosting plan:
| Hosting plan | Event-driven scaling | Details |
|---|---|---|
| Premium plan | ✓ App-level scaling | Select Premium plan above |
| Consumption plan (legacy) | ✓ App-level scaling | Select Consumption plan above |
| Dedicated (App Service) plan | Not applicable | Uses App Service scaling |
Note
The content in this article isn't relevant to the currently selected hosting plan. To choose a different plan, use the selector at the top of this article. For a comparison of all hosting plans, see Azure Functions hosting options.
Event-driven scaling doesn't apply to the Dedicated (App Service) plan. The Dedicated plan doesn't scale dynamically based on events. For scaling options in the Dedicated plan, see Scale up an app in Azure App Service.
Function code files are stored on Azure Files shares on the function's main storage account. When you delete the main storage account of the function app, the function code files are deleted and can't be recovered.
Runtime scaling
Azure Functions uses a component called the scale controller to monitor the rate of events and determine whether to scale out or scale in. The scale controller uses heuristics for each trigger type. For example, when you're using an Azure Queue storage trigger, it uses target-based scaling.
The unit of scale for Azure Functions is the function app. When the function app scales out, it allocates more resources to run multiple instances of the Azure Functions host. Conversely, as compute demand decreases, the scale controller removes function host instances. The number of instances is eventually "scaled in" when no functions are running within a function app.
Each instance of the Functions host in the Consumption plan is limited, typically to 1.5 GB of memory and one CPU. An instance of the host supports the entire function app, so all functions in an app share resources and scale at the same time. When function apps share the same Consumption plan, they still scale independently.
The specific size of the Premium plan determines the available memory and CPU for all apps in that plan on that instance. The plan scales out its instances based on the scaling needs of the apps in the plan, and the apps scale within the plan as needed.
Cold start
If your function app stays idle for a few minutes, the platform might scale the number of instances running your app down to zero. The next request experiences the added latency of scaling from zero to one. This latency is referred to as a cold start. The number of dependencies your function app requires can affect the cold start time. Cold start is more of an issue for synchronous operations, such as HTTP triggers that must return a response. If cold starts are impacting your functions, consider using a plan that supports mitigation strategies:
| Plan | Cold start mitigation | Details |
|---|---|---|
| Premium plan | Prewarmed and always ready instances | Minimum of one instance always running |
| Consumption plan (legacy) | None | Cold starts are expected in this plan |
| Dedicated plan | Always on setting | App runs continuously; no dynamic scaling |
As you can see in this table, Premium plans provide ways to eliminate cold starts in your apps.
Understanding scaling behaviors
Scaling can vary based on several factors. Apps scale differently based on the triggers and language selected. Be aware of these intricacies of scaling behaviors:
- Maximum instances: A single function app scales out to a maximum allowed by the plan. However, a single instance can process more than one message or request at a time. You can specify a lower maximum to throttle scale as required.
New instance rate: For HTTP triggers, the platform allocates new instances at most once per second. For non-HTTP triggers, the platform allocates new instances at most once every 30 seconds. Scaling is faster when running in a Premium plan.
Target-based scaling: Target-based scaling provides a fast and intuitive scaling model for customers. Currently, this scaling method is supported for Service Bus queues and topics, Storage queues, Event Hubs, Apache Kafka, and Azure Cosmos DB extensions. Make sure to review target-based scaling to understand their scaling behavior.
Maximum monitored triggers: Currently, the scale controller can only monitor up to 100 triggers to make scaling decisions. When your app has more than 100 event-based triggers, scale decisions are based on only the first 100 triggers that execute. For more information, see Best practices and patterns for scalable apps.
Limit scale-out
You might decide to restrict the maximum number of instances an app can use for scale-out. This limitation is most common for cases where a downstream component like a database has limited throughput. For the maximum scale limits when running the various hosting plans, see Scale limits.
In a Consumption or Elastic Premium plan, you can specify a lower maximum limit for your app by modifying the value of the functionAppScaleLimit site configuration setting. The functionAppScaleLimit can be set to 0 or null for unrestricted, or a valid value between 1 and the app maximum.
az resource update --resource-type Microsoft.Web/sites -g <RESOURCE_GROUP> -n <FUNCTION_APP-NAME>/config/web --set properties.functionAppScaleLimit=<SCALE_LIMIT>
Scale-in behaviors
Event-driven scaling automatically reduces capacity when demand for your functions is reduced. It makes this reduction by draining instances of their current function executions and then removes those instances. This behavior is logged as drain mode. The grace period for functions that are currently executing can extend up to 10 minutes for Consumption plan apps and up to 60 minutes for Premium plan apps. Event-driven scaling and this behavior don't apply to Dedicated plan apps.
The following considerations apply for scale-in behaviors:
- For apps running on Windows in a Consumption plan, only apps created after May 2021 have drain mode behaviors enabled by default.
- To enable graceful shutdown for functions using the Service Bus trigger, use version 4.2.0 or a later version of the Service Bus Extension.
Best practices and patterns for scalable apps
Many aspects of a function app impact how it scales, including host configuration, runtime footprint, and resource efficiency. For more information, see the scalability section of the performance considerations article. You should also be aware of how connections behave as your function app scales. For more information, see How to manage connections in Azure Functions.
If your app has more than 100 functions that use event-based triggers, consider breaking the app into one or more apps, where each app has fewer than 100 event-based functions.
For more information on scaling in Python and Node.js, see the Scaling and performance section of the Azure Functions Python developer guide and the Scaling and concurrency section of the Azure Functions Node.js developer guide.
Next steps
To learn more, see the following articles: