How to Know if Your Application Is Ready to Scale

A company is preparing for a major customer launch expected to roughly triple traffic.

The application performs well today, so the first proposal sounds straightforward: increase cloud capacity before launch and let autoscaling handle the rest.

Then the team runs a realistic load test.

At around 1.8 times normal traffic, API instances begin scaling as expected. CPU drops as new instances come online, but response times keep rising. The database connection pool is already exhausted, a third-party API starts throttling requests, and background jobs accumulate faster than workers can process them.

The application could scale its web servers.

The application as a whole was not ready to scale.

That distinction matters.

Scaling readiness is not simply having an autoscaling configuration or knowing that additional servers can be provisioned. An application is ready to scale when growing demand can be absorbed without an unexpected bottleneck elsewhere causing unacceptable latency, errors or operational instability.

Microsoft's current Well-Architected guidance recommends capacity planning around real workload constraints, including resource limits and external dependencies, and specifically advises testing different usage patterns rather than assuming additional resources will translate directly into additional capacity.

For Levelworks, this is primarily the Scalable dimension of App Health. Performant and Observable reinforce it: scaling is much safer when the application meets performance expectations at increasing load and teams can see which component is approaching its limit before customers discover it.

Start by defining what you expect to scale

"Can this application handle more traffic?" is too vague to test.

More traffic could mean:

  • twice as many concurrent users;
  • ten times as many API requests;
  • much larger customer accounts;
  • a sudden campaign spike;
  • steadily increasing transaction volume;
  • more uploaded files;
  • more background jobs;
  • more data retained for each customer.

Those are different scaling problems.

An application may support twice as many users while failing when individual accounts contain ten times as much data.

A SaaS product might handle normal growth comfortably but struggle when thousands of customers log in simultaneously after an announcement.

Before testing readiness, write down the expected growth scenario.

For example:

Within 12 months, peak API traffic may increase from 800 to 2,000 requests per second, concurrent sessions from 6,000 to 15,000, and the largest customer dataset from 3 million to 8 million records.

Now engineering knows what "ready" means.

Without that definition, a successful load test merely proves that the system survived whichever workload happened to be generated.

Know your current headroom

An application already running close to its limits has very little scaling margin.

Establish how heavily critical resources are used during normal and peak operation.

Depending on the architecture, inspect:

  • CPU and memory;
  • application-worker utilization;
  • database connections;
  • database CPU and I/O;
  • queue depth;
  • storage throughput;
  • network bandwidth;
  • third-party request quotas.

The goal is not to keep every resource artificially underused. It is to understand how much additional demand can arrive before something changes materially.

Imagine the application normally operates at:

  • application CPU: 45%;
  • database CPU: 75%;
  • connection pool: 82%;
  • payment API quota: 55%.

Adding more application instances may create plenty of compute capacity, but it could also create more database connections and push the database beyond its practical limit sooner.

This is why capacity has to be viewed across the request path rather than one infrastructure layer.

Microsoft's capacity-planning guidance specifically recommends identifying scaling limits and using workload testing to understand how architecture behaves as demand changes.

Find the first bottleneck, not just the maximum throughput

Every system eventually encounters a limiting resource.

The useful question is:

Which resource becomes the constraint first?

Gradually increase load and watch what changes.

Suppose throughput rises normally until 1,500 requests per second.

Beyond that point:

  • CPU remains acceptable;
  • database connections reach their limit;
  • request queues begin growing;
  • p95 latency jumps from 900 ms to 3 seconds.

The application's current scaling boundary is probably not compute capacity. It is database access.

A useful scaling test records behaviour across increasing load:

Load

p95 latency

Error rate

DB connections

Queue depth

500 req/s

420 ms

0.1%

80

5

1,000 req/s

510 ms

0.1%

135

12

1,500 req/s

760 ms

0.2%

185

35

1,800 req/s

2.1 s

1.4%

200/200

410

2,000 req/s

4.6 s

6.8%

200/200

1,900

That tells a much richer story than:

The application handled 2,000 requests per second.

Technically, it did.

Whether it handled them acceptably is another matter.

Test beyond your expected demand

Do not stop the test when you reach the traffic level you expect.

Go beyond it.

AWS's current Well-Architected guidance recommends load testing beyond expected production load so teams can discover bottlenecks before real traffic reaches them. It also recommends testing the overall workload rather than isolated components and validating resource settings, scaling configuration, service quotas and resilience under load.

If you expect peak demand of 2,000 requests per second, testing exactly 2,000 tells you little about your safety margin.

Testing progressively beyond that may reveal:

  • where latency deteriorates;
  • which resource saturates;
  • whether errors appear gradually or suddenly;
  • whether autoscaling reacts in time;
  • how the application behaves after overload.

You do not need every workload to tolerate infinite growth.

You do need to know how close expected demand sits to the application's practical boundary.

[Internal Link: “Load Testing vs Stress Testing: What Does Your App Need?”]

Check whether application instances can actually scale horizontally

Adding application instances works most naturally when any healthy instance can handle the next request.

Problems appear when individual servers hold state that users depend on.

Suppose login creates session data in the memory of Server A.

The load balancer sends the user's next request to Server B.

Server B knows nothing about the session.

Teams sometimes solve this with sticky sessions, permanently routing a user to the same instance. That can work, but it reduces some of the flexibility horizontal scaling is supposed to provide.

AWS recommends making application services stateless where practical because requests can then be handled by any available compute instance, which makes capacity easier to add or remove. Microsoft makes a similar recommendation for horizontally scalable workloads, warning against assumptions that subsequent requests will always reach the same application instance.

Before declaring the application horizontally scalable, ask:

  • Is session state stored locally?
  • Are files written to an individual server?
  • Are scheduled tasks tied to one particular instance?
  • Does one server contain state another instance cannot access?
  • Can instances be added or removed without breaking active users?

The answer does not always need to be "completely stateless."

It does need to be intentional.

Verify that the database can grow with the application

Application servers are often relatively easy to multiply.

The database is frequently harder.

Suppose application traffic doubles and autoscaling creates twice as many service instances. Each instance opens a pool of 50 database connections.

The application tier now has twice the capacity to generate database traffic—but the database has not automatically gained twice the ability to process it.

Microsoft's scalability guidance explicitly identifies stateful workload components such as databases as common dependency bottlenecks when scaling other parts of a system.

Before major growth, understand:

  • database CPU and I/O headroom;
  • connection limits;
  • query performance at larger data volumes;
  • lock contention;
  • write throughput;
  • whether read-heavy workloads can be separated where appropriate.

This is especially important when growth involves data size, not only user count.

An application may handle 50,000 small customer accounts very differently from 5,000 accounts containing enormous histories.

Scaling readiness therefore needs representative production-sized data, not merely more simulated users.

Make sure background processing scales too

Interactive traffic is only part of many applications.

User activity may create work such as:

  • emails;
  • document processing;
  • image generation;
  • analytics events;
  • exports;
  • synchronization;
  • notifications.

The user-facing request may remain quick because the work is queued.

That does not mean the application is scaling successfully.

Suppose traffic triples and queue production rises to 30,000 jobs per minute while workers can process only 15,000.

The front end initially looks healthy.

One hour later, jobs are significantly delayed. Several hours later, the backlog is enormous.

Scaling readiness should therefore examine:

arrival rate versus processing rate.

Measure:

  • queue depth;
  • oldest-message age;
  • worker throughput;
  • retries;
  • failure rate;
  • processing latency.

If queues grow continuously at expected future demand, background capacity is already below the required level.

Check third-party limits before your traffic reaches them

Your own infrastructure may be ready while an external service is not.

Applications commonly depend on:

  • payment processors;
  • email providers;
  • authentication services;
  • maps;
  • messaging platforms;
  • AI APIs;
  • partner systems.

Those providers may enforce:

  • requests per second;
  • concurrency limits;
  • daily quotas;
  • burst limits;
  • connection restrictions.

Cloud infrastructure itself also has quotas and fixed constraints.

AWS specifically warns that service limits such as network capacity, API throttles and concurrent database connections can become architectural constraints under high load. Its guidance recommends monitoring usage relative to quotas rather than discovering those boundaries during a traffic event.

Create an inventory of the limits that sit on critical workflows.

For each one, know:

  • current peak usage;
  • expected future usage;
  • hard/soft limit;
  • whether it can be increased;
  • what the application does when the limit is reached.

An application is not ready for 10x growth if a business-critical provider begins throttling at 3x.

Make sure autoscaling measures something that reflects demand

Autoscaling existing infrastructure does not automatically make an application scalable.

The trigger matters.

CPU is commonly used, but CPU may not be the resource determining application capacity.

A service could be saturated because:

  • requests wait for database connections;
  • queue depth is growing;
  • external API concurrency is exhausted;
  • worker threads are occupied.

CPU may still look normal.

Kubernetes' Horizontal Pod Autoscaler, for example, can scale workloads using CPU, memory and custom or external metrics rather than being limited to one built-in resource signal.

Choose a scaling signal that moves meaningfully with the workload you are trying to accommodate.

For a queue worker, backlog may be more useful than CPU.

For an API, requests per instance or concurrency might provide stronger evidence than memory.

Then test whether scaling begins early enough to matter.

Measure the time required to scale

Scaling is not instantaneous.

New capacity may require time to:

  • launch;
  • initialize;
  • load dependencies;
  • register with a load balancer;
  • warm caches;
  • become healthy.

If demand rises faster than capacity arrives, the application can still fail even though autoscaling eventually reaches the correct number of instances.

Microsoft explicitly recommends testing scaling delays when evaluating scalability, because the system's reaction time affects whether it can absorb real-world demand changes.

This matters especially for sudden events.

An application that can comfortably scale from 10 instances to 50 over fifteen minutes may be ready for gradual growth but poorly prepared for traffic that increases fivefold in thirty seconds.

Scaling readiness therefore depends not only on how far capacity can grow but how quickly it gets there.

Confirm performance remains acceptable as throughput increases

Scaling successfully is not the same as remaining online.

Suppose the application handles five times normal traffic without errors, but checkout latency increases from 700 milliseconds to nine seconds.

From an infrastructure perspective, the application survived.

From a user perspective, it did not scale well.

Track performance and errors alongside throughput:

  • p50/p95/p99 latency;
  • business transaction completion time;
  • timeout rate;
  • error rate;
  • queue delay;
  • database wait time.

The purpose is to confirm that adding demand does not make the application's important workflows progressively unusable.

This is where Scalable and Performant App Health overlap. A scalable application should not merely accept more work; it should continue providing acceptable service while doing so.

Check that you can see what will fail before it fails

Scaling without observability creates a dangerous situation: the system grows, but nobody knows which limit it is approaching.

Before a major growth event, teams should be able to answer questions such as:

  • Which component is closest to saturation?
  • Are database connections approaching their limit?
  • Is queue backlog rising?
  • Are downstream API calls being throttled?
  • Is p95 latency worsening as traffic increases?
  • Did autoscaling activate?
  • Are new instances healthy?
  • Which customer workflow is degrading first?

Without those signals, capacity management becomes reactive.

This is why Observable App Health supports Scalable. The objective is not collecting dozens of infrastructure graphs; it is detecting when a component is approaching the point where further demand changes application behavior.

Check what happens when one layer cannot scale further

Eventually, something reaches a limit.

Scaling readiness includes knowing how the application behaves then.

Does it:

  • queue work?
  • reject excess demand predictably?
  • time out?
  • overload dependencies?
  • fail across unrelated workflows?

This does not mean every application requires sophisticated degradation mechanisms before it can grow.

It means teams should know what happens at the boundary.

An unknown breaking point is much riskier than a known capacity limit with controlled behaviour.

[Internal Link: “How to Scale an Application Without Sacrificing Performance or Reliability”]

Use a readiness scorecard before major growth

A practical scaling review can be summarized as follows:

Readiness question

Evidence you want

Do we know expected future demand?

Traffic, concurrency and data-growth forecast

Do we know current capacity?

Baseline utilization and throughput

Do we know the first bottleneck?

Load-test evidence

Have we tested beyond expected demand?

Performance curve and breaking point

Can compute capacity be added safely?

Proven scaling test

Does local state prevent new instances helping?

State/session review

Can the database support additional load?

Database capacity and query evidence

Can background workers keep up?

Queue/worker throughput data

Are third-party limits understood?

Quota and dependency inventory

Does autoscaling use meaningful signals?

Scaling-policy validation

Does capacity arrive quickly enough?

Scale-up timing test

Does latency remain acceptable?

p95/p99 and business workflow measurements

Can we see approaching saturation?

Monitoring and alerts

You do not need perfect results in every category before growing.

You do need to know where uncertainty remains.

Build capacity planning from evidence, not emergency upgrades

Scaling readiness is not only about the next launch.

Demand continues changing after that.

Once the application's current limits are understood, compare them with expected growth so engineering can identify when another capacity decision will be required.

If the database becomes constrained around 4,000 transactions per second and traffic grows approximately 15% each quarter, the team has a useful planning signal.

If nobody knows the database boundary, capacity planning turns into waiting until production starts slowing down.

[Internal Link: “Application Capacity Planning: Preparing Your App for Growth”]

This is also why scaling assessments should be repeated after meaningful changes. New functionality, different traffic patterns, more data and additional dependencies can all move the bottleneck.

Microsoft recommends refreshing performance and capacity baselines after significant workload changes so scaling assumptions remain relevant rather than becoming historical documentation.

Being ready to scale means knowing what happens next

An application is not ready to scale simply because it runs in the cloud, has an autoscaler or survived yesterday's traffic.

It is ready when the team can describe, with evidence:

  • what growth it is preparing for;
  • how much capacity exists today;
  • which component becomes constrained first;
  • whether important workflows remain fast under increased load;
  • whether state, databases, queues and dependencies can accommodate that growth;
  • whether scaling happens quickly enough;
  • and what occurs when the next limit is reached.

AWS summarizes the testing side of this well: scalability should be validated under realistic production-like load, including the application's base resources, scaling configuration, quotas and resilience mechanisms—not inferred from architecture diagrams.

For Levelworks, this is the substance of Scalable App Health. Scalability is not theoretical permission to add more infrastructure. It is the application's demonstrated ability to accommodate increasing demand without its performance, reliability or operability deteriorating unexpectedly.

The question is therefore not simply:

“Can we add more capacity?”

It is:

“When demand grows, do we know which parts of the application will absorb it, which part will reach its limit next, and whether users will still receive an acceptable experience when we get there?”

If those answers are based on measurements rather than assumptions, the application is much closer to being genuinely ready to scale.

‍

Continue Reading