Capacity Planning Models

Production engineering guide for capacity planning models covering patterns, implementation strategies, and operational best practices.

This reference describes specific models and methods for capacity planning that engineers use to predict resource needs for systems under varying loads. These approaches apply when sizing infrastructure, estimating costs, or designing systems to handle expected traffic patterns.

Predicting Resource Requirements from Workload Patterns

Estimating CPU Usage from Request Volume

When you know request rate and typical response times, you can estimate CPU requirements using a simple model:

CPU_Required = (Requests_Per_Second * Average_Response_Time) / (1000 * Cores_Per_Node)

For example, if your service handles 1000 requests/second with an average 50ms response time on a system with 4 cores:

CPU_Required = (1000 * 0.05) / (1000 * 4) = 0.0125 CPU cores

This calculation assumes linear scaling. When systems exceed 80% CPU utilization, performance degrades significantly. The model fails silently when you don't account for:

Estimating Memory Requirements

Memory planning uses a similar approach to CPU:

Memory_Required = (Active_Connections * Average_Session_Size) + System_Overhead

Where:

If your web application serves 5000 concurrent users with average 2KB sessions:

Memory_Required = (5000 * 2048) + 100MB = ~10.3GB

This model does not account for:

Modeling Latency Impact on Resource Usage

Response Time Distribution Analysis

When you collect response time data, use percentiles to model resource usage:

# Collect latency data using a tool that supports percentile output
curl -w "@latency.txt" -o /dev/null "http://service.example.com/api/endpoint"

Where latency.txt contains:

time_total: 0.123
time_connect: 0.012
time_starttransfer: 0.056

A 95th percentile response time of 0.1 seconds indicates that 95% of requests complete within 100ms. If your system is designed to handle 1000 requests/second at 50ms average, a 100ms 95th percentile will cause:

The model fails when you measure only average response time and ignore distribution. You can detect this failure by comparing:

Queue Depth Impact on CPU Utilization

When request queues grow, they consume additional CPU resources:

Additional_CPU = (Queue_Length * Average_Request_Size) / (1000 * Processing_Time_Per_Request)

If your system has a queue depth of 100 requests with average 5KB payloads and 5ms processing time per request:

Additional_CPU = (100 * 5120) / (1000 * 0.005) = 1024 CPU seconds

This calculation assumes no parallelization or batching. In practice, queue depth can cause:

Modeling Concurrent User Impact

User Session-Based Scaling

Estimate capacity using concurrent user sessions:

Required_Instances = (Total_Concurrent_Users * Average_Session_Time) / (Instance_Capacity * Time_Per_Session)

If your system supports 10,000 concurrent users with average 30-minute sessions, and each instance can handle 100 concurrent sessions for 30 minutes:

Required_Instances = (10000 * 30) / (100 * 30) = 10 instances

This model does not account for:

Load Factor and Instance Utilization

When planning for instance sizing, use load factor to predict resource consumption:

Load_Factor = (Actual_Usage / Maximum_Usage) * 100

If your CPU usage is at 75% of maximum capacity:

Load_Factor = (0.75 * 100) = 75%

This metric helps identify when to add capacity but does not predict:

Modeling Data Storage Requirements

Disk Space Projections

Storage capacity uses a simple growth model:

Required_Disk_Space = (Current_Usage * Growth_Rate) + Buffer_Space

If your database currently uses 100GB and grows at 15% annually with 20% buffer space:

Required_Disk_Space = (100GB * 1.15) + 20GB = 135GB

This model fails silently when:

Memory Database Capacity Planning

For in-memory databases, capacity planning uses:

Memory_Required = (Data_Size * Memory_Multiplier) + Overhead

If your system holds 1GB of data with a memory multiplier of 2.5 and 100MB overhead:

Memory_Required = (1GB * 2.5) + 100MB = 3.6GB

This model assumes:

Modeling Network Resource Usage

Bandwidth Requirements

Network capacity planning uses:

Required_Bandwidth = (Request_Size * Request_Rate) + Overhead

If your API handles 100 requests/second with average 2KB payloads:

Required_Bandwidth = (2048 bytes * 100) + 10% overhead = 225KB/s

This model does not account for:

Connection Limits and Throttling

When systems have connection limits, use:

Required_Connections = (Total_Users * Connections_Per_User)

If your system supports 5000 users with 2 connections per user:

Required_Connections = 5000 * 2 = 10,000 connections

This calculation fails when:

Modeling Service Dependencies

Cascading Resource Requirements

When services depend on others, calculate cascading capacity:

Total_Required = (Primary_Service_Usage) + (Dependent_Service_Usage * Dependency_Rate)

If your frontend service requires 500MB memory and depends on a backend that consumes 100MB per 1000 requests:

Total_Required = 500MB + (100MB * (Requests_Per_Second / 1000))

This model fails when:

Cache and Buffer Requirements

When using caching, calculate buffer space:

Cache_Buffer = (Cache_Size * Cache_Hit_Rate) + Safety_Buffer

If your cache is 1GB with 80% hit rate and 20% safety buffer:

Cache_Buffer = (1GB * 0.8) + 200MB = 1.0GB

This model does not account for:

Modeling Failure Scenarios

Single Point of Failure Impact

Model capacity loss from failures:

Capacity_Loss = (Failed_Component_Usage * Failure_Rate)

If a database instance uses 2GB memory and fails 5% of the time:

Capacity_Loss = 2GB * 0.05 = 100MB

This calculation assumes:

Burst Load Handling

Model resource requirements during bursts:

Burst_Required = (Normal_Usage * Burst_Multiplier) + Spare_Capacity

If your system normally uses 500MB and expects 3x bursts with 10% spare capacity:

Burst_Required = (500MB * 3) + 50MB = 2.0GB

This model fails when:

Model Validation and Error Detection

Capacity Margin Checking

Use a simple check to validate capacity models:

# Check CPU utilization
top -b -n 1 | grep "Cpu(s)"
# Output: Cpu(s):  4.5%us,  2.3%sy,  0.0%ni, 93.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

# Check memory usage
free -m | grep Mem
# Output: Mem:  8192  6500   1692    100     50    200

If CPU utilization exceeds 80% for extended periods, your capacity model likely underestimates requirements.

Performance Regression Detection

Monitor for signs that models have become invalid:

When these symptoms appear, revalidate your capacity model using actual system metrics rather than projected values.

This page was rewritten on 16 October 2026. It replaced a templated version that was not specific to its own title. How these pages are written and checked. If anything here is wrong, tell us at [email protected] and we will correct it.