Cold Starts in Azure Functions
This article describes Azure Functions running on Consumption Plan—the dynamically scaled and billed-per-execution compute service. Consumption Plan adds and removes instances dynamically. When a new instance handles its first request, the response time increases, which is called a cold start.
Learn more: Cold Starts in Serverless Functions.
When Does Cold Start Happen?
The very first cold start happens when the first request comes in after deployment.
After that request is processed, the instance stays alive mostly from 20 to 30 minutes to be reused for subsequent requests:
As you can see, some cold starts happen earlier than 10 minutes, some instances last for more than 50 minutes, so the behavior seems less deterministic than it used to be in the past. It’s likely related to the new algorithm to predict the next invocation.
How Slow Are Cold Starts?
The following chart shows the typical range of cold starts in Azure Functions V2, broken down per language. The darker ranges are the most common 67% of durations, and lighter ranges include 95%.
A typical cold start latency spans from 1 to 10 seconds. However, less lucky executions may take up to 30 seconds occasionally. PowerShell functions are especially slow to start with values from 4 to 27 seconds.
View detailed distributions: Cold Start Duration per Language.
Windows vs. Linux
Azure Functions can be deployed either on Windows or Linux environments, depending on the plan settings. Which operating system provides faster cold starts?
The median response time is comparable, but Linux has tighter distribution.
The Node.js runtime is consistently slower than the .NET Core one.
Does Package Size Matter?
The above charts show the statistics for tiny “Hello World”-style functions. Adding dependencies and thus increasing the deployed package size will further increase the cold start durations.
Indeed, the functions with many dependencies can be several times slower to start.
Does Deployment Method Matter?
There are multiple ways to deploy Azure Functions. The charts below compare three of them:
- No Zip—traditional AppService-style deployment based on Kudu (
- Local Zip—uploading a zip package to the local file system of the Function App and setting
RUN_FROM_PACKAGE=1in application settings
- External Zip—uploading a zip package to blob storage and setting
RUN_FROM_PACKAGE=<blob sas token>in application settings
The differences between deployment methods are hardly visible.