# Advanced Lambda Performance: Provisioned Concurrency vs SnapStart
Key Takeaways
- Both Provisioned Concurrency and Lambda SnapStart solve cold-start latency, but through completely different mechanisms.
- Provisioned Concurrency keeps a pool of pre-initialized execution environments warm — works for every runtime, costs extra continuously.
- Lambda SnapStart caches a Firecracker microVM snapshot after initialization — free for most Java/Python/.NET functions, but only applies at publish-version time.
- SnapStart cold starts can still take 100-200ms depending on function complexity; Provisioned Concurrency approaches near-zero cold starts.
- Choose based on traffic predictability, cost tolerance, and runtime support.
Why Lambda Cold Starts Matter
A cold start happens when AWS Lambda must initialize a new execution environment — downloading your code, starting the runtime, and running initialization code — before it can process a request. For latency-sensitive APIs, this can add anywhere from tens of milliseconds to several seconds, depending on runtime, package size, and VPC configuration.
Two AWS features address this differently: Provisioned Concurrency and Lambda SnapStart.
Provisioned Concurrency: Keep Environments Warm
Provisioned Concurrency pre-initializes a specified number of execution environments and keeps them ready to respond immediately, bypassing the cold-start path entirely.
Enabling Provisioned Concurrency via CLI
aws lambda put-provisioned-concurrency-config \
--function-name order-processor \
--qualifier prod \
--provisioned-concurrent-executions 10
This keeps 10 warm instances of the prod alias ready at all times. You pay for this capacity whether or not it's actively serving requests.
Terraform Example
resource "aws_lambda_provisioned_concurrency_config" "order_processor" {
function_name = aws_lambda_function.order_processor.function_name
provisioned_concurrent_executions = 10
qualifier = aws_lambda_alias.prod.name
}
Auto Scaling Provisioned Concurrency
For variable traffic, pair it with Application Auto Scaling so capacity tracks demand instead of staying fixed:
aws application-autoscaling register-scalable-target \
--service-namespace lambda \
--resource-id function:order-processor:prod \
--scalable-dimension lambda:function:ProvisionedConcurrency \
--min-capacity 2 \
--max-capacity 50
Lambda SnapStart: Snapshot-Based Cold Start Elimination
Lambda SnapStart, instead of keeping environments running, takes a cached snapshot of an initialized execution environment (memory and disk state) after your function's init phase completes. On invocation, Lambda resumes from this snapshot rather than running initialization from scratch — using Firecracker microVM technology to restore state in milliseconds.
Enabling SnapStart via CLI
aws lambda update-function-configuration \
--function-name report-generator \
--snap-start ApplyOn=PublishedVersions
SnapStart only activates on published versions, not $LATEST — you must publish a version after enabling it.
aws lambda publish-version --function-name report-generator
Supported Runtimes
SnapStart currently supports Java (Corretto 11+), Python, and .NET on Lambda. Node.js and other runtimes are not yet supported as of early 2026 — check current AWS documentation before planning a migration.
Side-by-Side Comparison
<svg viewBox="0 0 740 280" xmlns="http://www.w3.org/2000/svg" font-family="Arial, sans-serif" font-size="13" fill="currentColor">
<style>
.box { fill: none; stroke: currentColor; stroke-width: 1.6; }
.hdr { font-weight: bold; }
</style>
<rect class="box" x="20" y="20" width="340" height="240" rx="8"/>
<text class="hdr" x="190" y="50" text-anchor="middle">Provisioned Concurrency</text>
<text x="40" y="85">Mechanism: pre-warmed environments</text>
<text x="40" y="110">Cold start: near-zero</text>
<text x="40" y="135">Cost: continuous, per GB-sec reserved</text>
<text x="40" y="160">Runtime support: all runtimes</text>
<text x="40" y="185">Best for: steady or predictable traffic</text>
<text x="40" y="210">Scaling: works with Auto Scaling</text>
<rect class="box" x="380" y="20" width="340" height="240" rx="8"/>
<text class="hdr" x="550" y="50" text-anchor="middle">Lambda SnapStart</text>
<text x="400" y="85">Mechanism: Firecracker microVM snapshot</text>
<text x="400" y="110">Cold start: ~100-200ms typical</text>
<text x="400" y="135">Cost: free for most functions (Java has small fee)</text>
<text x="400" y="160">Runtime support: Java, Python, .NET</text>
<text x="400" y="185">Best for: spiky/unpredictable traffic</text>
<text x="400" y="210">Scaling: automatic, no config needed</text>
</svg>
Cost Considerations
Provisioned Concurrency bills continuously per GB-second reserved, regardless of invocations — a function with 10 provisioned instances at 512MB runs 24/7 cost even during idle periods. This can add up for low-traffic functions.
SnapStart is free for Python and .NET functions; Java functions incur a small additional charge for cached snapshot storage and restoration, but it's generally far cheaper than maintaining Provisioned Concurrency at scale.
When to Use Which
| Scenario | Recommendation |
|---|---|
| Predictable, steady traffic (e.g., business-hours API) | Provisioned Concurrency |
| Spiky, unpredictable traffic (e.g., webhook processor) | SnapStart |
| Node.js or Go runtime | Provisioned Concurrency only (SnapStart unsupported) |
| Budget-constrained, Java/Python workload | SnapStart |
| Sub-50ms latency SLA | Provisioned Concurrency |
Many teams combine both: SnapStart for baseline cold-start reduction, with a small Provisioned Concurrency buffer for guaranteed minimum latency during traffic spikes.
FAQ
Does SnapStart work with functions using VPC networking? Yes, as of recent AWS updates SnapStart supports VPC-connected functions, but you should test cold-start behavior since ENI attachment can still add latency independent of SnapStart.
Does enabling SnapStart change my function's behavior? Potentially — cached snapshots mean any state initialized before the snapshot (like random number seeds or unique IDs generated at init) gets reused across invocations. AWS recommends re-initializing such values inside the handler, not at module load time.
Can I use both Provisioned Concurrency and SnapStart together? No — they are mutually exclusive per function version. Choose one strategy per version/alias based on your traffic pattern.
Does Provisioned Concurrency eliminate cold starts completely? Nearly — it eliminates cold starts for requests within the provisioned capacity. If traffic exceeds provisioned capacity, Lambda falls back to standard (cold-start-prone) scaling for the overflow.
Need Help Tuning Lambda Performance?
f9infotech's serverless engineers benchmark your functions' cold-start profile and recommend the right mix of Provisioned Concurrency, SnapStart, and runtime optimization. Get a Lambda performance review tailored to your traffic patterns.