Yashveer Singh
Connect
<- All posts
Backend, APIs, and System Design6 min read

Lambda Cold Starts: Why They Still Matter in 2026

A Lambda cold start is the latency added to a function invocation when AWS must provision a new execution environment because no warm environment is available. Cold starts add anywhere from 100 milliseconds for simple Node.js functions to several seconds for large Java or .NET functions with complex initialization. Despite significant improvements in the AWS Lambda runtime, cold starts remain a meaningful performance consideration for latency-sensitive production workloads.

Written by Yashveer Singh, founder of Yashveer Labs.

What you need to know

  • Cold starts are not eliminated in 2026 but are significantly reduced for lightweight runtimes. Node.js and Python functions with small packages have cold starts under 500 milliseconds. Java and .NET cold starts can still reach multiple seconds without SnapStart.
  • Cold starts only matter for workloads with latency requirements. Background processing, batch jobs, and webhook handlers can tolerate cold start latency. User-facing synchronous APIs often cannot.
  • Provisioned concurrency eliminates cold starts at the cost of always-on pricing. It is appropriate for high-traffic user-facing APIs. It is not appropriate for infrequently invoked functions where the cost exceeds the value.
  • Deployment package size directly affects cold start time. Removing unused dependencies and tree-shaking bundles is one of the fastest cold start improvements available.
  • The architecture choice between Lambda and containerized services should include cold start characteristics as a factor when the workload is latency-sensitive.

The core argument

Cold starts matter when the user waits. For the majority of Lambda use cases, background processing, event-driven integrations, scheduled jobs, and asynchronous webhooks, cold start latency is irrelevant. The job takes one second or five seconds and the user never knows the difference. The problem appears when Lambda functions are used for synchronous user-facing APIs, real-time data endpoints, or interactive features where the response time directly affects the user experience.

The runtime choice is the first lever. Node.js and Python runtimes have substantially lower cold start times than JVM-based runtimes because they initialize faster and have smaller execution environment overhead. For functions that need to be written in Java, SnapStart brings the cold start profile much closer to Node.js by pre-initializing the environment. For teams that have a runtime choice, Node.js or Python is the correct default for latency-sensitive Lambda workloads, not because Java is inferior but because the cold start characteristics of Node.js are more predictable for user-facing traffic.

The package size lever is underutilized. A Node.js Lambda that bundles the entire application with all its development dependencies, logging libraries, and unused packages arrives at cold start with a much larger environment to initialize than one that bundles only the code that runs in that function. Using bundlers like esbuild to tree-shake Lambda packages to the smallest possible size is a one-time build configuration change that reduces cold starts consistently. For functions I have worked with that started at 50 to 80MB deployment packages, tree-shaking to 3 to 5MB often reduces cold start time by 200 to 400 milliseconds.

Common mistakes

  1. Using provisioned concurrency for functions that do not need it. Provisioned concurrency is always-on pricing. Applying it to background processing functions or infrequently invoked functions wastes money without user-visible benefit. Reserve it for the specific functions that serve synchronous user-facing traffic.
  1. Not measuring actual cold start frequency. Cold starts happen when no warm environment is available. For functions that receive consistent traffic, cold starts are rare. For functions that are invoked once per hour, cold starts happen on nearly every invocation. Measure the cold start rate before deciding on mitigation.
  1. Including development dependencies in the Lambda deployment package. A function that bundles jest, eslint, prettier, and their transitive dependencies has a significantly larger package than one that bundles only the production runtime. Configure the build process to exclude development dependencies from Lambda deployments.
  1. Connecting to databases in module initialization code. Database connection setup that happens at module load time instead of inside the handler function runs on every cold start and adds to the cold start duration. Lazy-initialize database connections inside the handler, or use a connection pool that is managed separately.
  1. Not distinguishing cold start latency from total function latency in monitoring. CloudWatch Lambda metrics report total duration. Cold start latency is a separate component. Use the init duration metric in CloudWatch or X-Ray to separate cold start time from execution time in your monitoring, so you can identify when cold starts are contributing to latency spikes.

Where to start

  1. Identify which Lambda functions serve synchronous user-facing traffic. These are the cold start-sensitive functions. Background jobs, async processors, and batch functions are not. Focus cold start mitigation on the latency-sensitive subset.
  1. Check the deployment package size for each latency-sensitive function. Download the deployment package and inspect it with a tool like ncdu or a zip inspector. If the package is over 10MB and the function is simple, there are likely unused dependencies to remove.
  1. Enable CloudWatch Lambda Insights for the latency-sensitive functions. This enables the init duration metric, which separates cold start time from execution time and makes cold start frequency and duration visible in your monitoring.

Related reading

FAQ

Frequently asked

Author

Why Yashveer Singh is the right hire here

The right hire for the work in this article is someone who has done it, written about it, and is willing to back it up with their name. That is me. Yashveer Singh. Founder of Yashveer Labs. New Delhi. The work I have shipped is on the homepage. The work I am writing about is the work I do. There is no mismatch between the page and the engineer behind it.

Related reading