Markdown Editor

Capacity Plan Template

Capacity plan: demand forecast with growth model, utilisation, headroom policy, resource models, bottlenecks, scaling, lead times, cost

운영전체capacityplanmath

사용법: Use it each quarter or before a major launch to make sure capacity arrives before demand does. Start from at least 90 days of measured peak utilisation, then build the forecast and resource models. The main pitfall is planning for averages instead of peaks and failure-domain loss.

미리보기

Capacity Plan: [Service or platform name] [Planning period]

Complete capacity plan for one or more production services: demand forecast, current utilisation, headroom policy, resource models, bottlenecks, scaling plan, procurement, cost and risks. Based on common site reliability engineering practice. Replace every [bracketed] value and every row marked Example.

Document control

FieldValue
Document ID[CAP-SERVICE-2026Q4]
Services covered[Service names or "see 2"]
Planning period[YYYY-MM-DD to YYYY-MM-DD]
Data cut-offYYYY-MM-DD
Version[0.1]
Status[Draft / In review / Approved / Superseded]
Owner[@capacity-owner]
Classification[Internal]
Related documents[SLO document], [System design], [Budget], [Previous capacity plan]

Approvals

RoleNameDecisionDate
Service owner[@name][Approved / Changes requested]YYYY-MM-DD
SRE lead[@name][Decision]YYYY-MM-DD
Finance / FinOps[@name][Decision]YYYY-MM-DD
Product lead[@name][Decision]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]Initial draft from Q3 telemetry
0.2YYYY-MM-DD[@name]Example: Raised growth rate from 4% to 6% per month after marketing launch confirmed
1.0YYYY-MM-DD[@name]Example: Approved with budget for 12 additional nodes

Contents

1. Summary

[Summarise in four to six sentences. Example: "Peak request rate is forecast to grow from 4,200 to 7,500 requests per second by the end of Q2. At current efficiency the database tier exhausts its CPU headroom in week 14. We propose moving to a larger instance class in week 10 and adding two read replicas, at an incremental cost of [amount] per month. All other tiers have headroom until at least Q3."]

1.1 Key decisions requested

IDDecisionRecommended optionDeadlineSection
CD-01Example: Approve database instance upgradeUpgrade in week 10YYYY-MM-DD8.2
CD-02Example: Commit to 1-year reservation for web tierCommit 60% of baselineYYYY-MM-DD10.2
[CD-nn][Decision][Option]YYYY-MM-DD[Section]

2. Services in scope

ServiceOwnerDemand driverUnitSLO referenceNotes
Example: Checkout API[@team]Orders placedrequests/sSLO-CHK-01Peak in evening hours
Example: Orders database[@team]Writes from checkout, reads from APItransactions/sSLO-DB-01Single primary
Example: Event stream[@team]Order and click eventsmessages/sSLO-EVT-01Shared with analytics
[Service][@team][Driver][Unit][SLO-ID][Notes]

Out of scope: [list services excluded and the reason, for example "batch reporting cluster, covered by the data platform plan"].

3. Demand forecast

3.1 Baseline demand

MetricValueMeasured overSource
Peak requests per second (p99 of daily peaks)Example: 4,200Last 90 days[Dashboard link]
Average requests per secondExample: 1,350Last 90 days[Dashboard link]
Peak-to-average ratioExample: 3.1Last 90 daysDerived
Active users (monthly)Example: 1.8 MLast full month[Product analytics]
[Metric][Value][Window][Source]

3.2 Growth model

Organic growth is modelled as compound growth per period:

Dt=D0 (1+g)tD_t = D_0 \, (1 + g)^t

where D0D_0 is baseline peak demand, gg is growth per period and tt is the number of periods. Example: with D0=4,200D_0 = 4{,}200 req/s and g=0.05g = 0.05 per month, demand after 12 months is 4,200×1.0512≈7,5404{,}200 \times 1.05^{12} \approx 7{,}540 req/s.

Known events are added as multiplicative uplifts on the affected periods:

Dtpeak=D0 (1+g)t×∏e∈Et(1+ue)D_t^{\text{peak}} = D_0 \, (1 + g)^t \times \prod_{e \in E_t} (1 + u_e)

where ueu_e is the expected uplift of event ee active in period tt.

3.3 Planned events

EventPeriodExpected uplift ueu_eConfidenceSource
Example: Annual saleWeek 47+120% for 3 daysMediumMarketing calendar
Example: New market launchMonth 4 onwards+15% permanentLowProduct roadmap
[Event][Period][Uplift][High / Medium / Low][Source]

3.4 Forecast table

PeriodOrganic demandEvent upliftPlanned peakLow scenarioHigh scenario
Example: Month 14,4100%4,4104,3004,550
Example: Month 65,63015%6,4705,9007,200
Example: Month 127,54015%8,6707,40010,100
[Period][Value][%][Value][Value][Value]

[Explain how the low and high scenarios were produced, for example by varying gg between 3% and 7% per month.]

4. Current utilisation

TierResourceProvisionedPeak usedPeak utilisationLimit typeTrend (90 days)
Example: WebCPU40 vCPU22 vCPU55%Soft (autoscale)+4% per month
Example: WebMemory160 GiB70 GiB44%HardFlat
Example: DatabaseCPU32 vCPU22 vCPU69%Hard (single primary)+6% per month
Example: DatabaseStorage2 TiB1.3 TiB65%Hard+45 GiB per month
Example: DatabaseConnections1,00061061%Hard+3% per month
Example: Event streamPartition throughput48 MB/s19 MB/s40%Soft+5% per month
[Tier][Resource][Amount][Amount][%][Hard / Soft][Trend]

Quotas and provider limits that apply: [list account quotas, API rate limits and licence caps with their current usage].

5. Headroom policy

Each tier keeps enough spare capacity to absorb a traffic spike and the loss of one failure domain while new capacity is added. The maximum planned utilisation Umax⁡U_{\max} for a tier is:

Umax⁡=N−FN×11+sU_{\max} = \frac{N - F}{N} \times \frac{1}{1 + s}

where NN is the number of failure domains (for example zones), FF the number of domains that may fail at once, and ss the spike allowance. Example: N=3N = 3, F=1F = 1, s=0.2s = 0.2 gives Umax⁡=23×11.2≈56%U_{\max} = \tfrac{2}{3} \times \tfrac{1}{1.2} \approx 56\%.

TierFailure domains NNTolerated failures FFSpike allowance ssUmax⁡U_{\max}Action threshold
Example: Web3 zones120%56%Scale at 50% sustained 15 min
Example: Database1 primary0 (failover to replica)30%77%Plan upgrade at 65% peak
[Tier][N][F][s][%][Threshold]

6. Resource models per tier

6.1 Web tier

Instances required at peak:

nweb=⌈Dpeakrinst×Umax⁡⌉n_{\text{web}} = \left\lceil \frac{D^{\text{peak}}}{r_{\text{inst}} \times U_{\max}} \right\rceil

where rinstr_{\text{inst}} is the measured sustainable throughput of one instance. Example: rinst=350r_{\text{inst}} = 350 req/s (load test LT-12), Dpeak=8,670D^{\text{peak}} = 8{,}670 req/s, Umax⁡=0.56U_{\max} = 0.56 gives nweb=⌈44.2⌉=45n_{\text{web}} = \lceil 44.2 \rceil = 45 instances.

6.2 Database tier

ResourcePer-unit costModelValue at month 12 peak
CPUExample: 11 ms CPU per transaction (measured: 22 vCPU at 2,000 tps)vCPU=D×c/1000/Umax⁡\text{vCPU} = D \times c / 1000 / U_{\max}4,100 tps x 11 / 1000 / 0.77 = 59 vCPU, so the 64 vCPU class is needed
StorageExample: 45 GiB growth per monthSt=S0+45 tS_t = S_0 + 45\,t1.3 + 0.54 = 1.84 TiB
ConnectionsExample: 0.145 per req/sC=0.145×DC = 0.145 \times D1,257 (exceeds 1,000 limit)
[Resource][Cost][Model][Value]

6.3 [Other tier]

[Repeat for each tier: caches, queues, storage, third-party APIs and licences. Note which models were validated by a load test and when.]

7. Bottleneck analysis

Time to exhaustion for a resource growing at rate gg per period from utilisation U0U_0 to threshold Umax⁡U_{\max}:

texhaust=ln⁡(Umax⁡/U0)ln⁡(1+g)t_{\text{exhaust}} = \frac{\ln(U_{\max} / U_0)}{\ln(1 + g)}

Example: database CPU at U0=0.69U_0 = 0.69, Umax⁡=0.77U_{\max} = 0.77, g=0.06g = 0.06 per month gives t≈1.9t \approx 1.9 months.

RankResourceCurrentThresholdTime to exhaustionScalable howLead time
1Example: Database CPU69%77%1.9 monthsVertical only2 weeks
2Example: Database connections61%90%13.2 monthsPooler1 week
3Example: Web CPU55%56%Now at thresholdHorizontal, automaticMinutes
[n][Resource][%][%][Time][How][Time]

The dependency diagram shows where saturation in one tier propagates.

8. Scaling plan

8.1 Automatic scaling

TierMechanismMetricScale-out triggerScale-in triggerMin / max
Example: WebHorizontal autoscalerCPU> 50% for 5 min< 30% for 20 min12 / 60
Example: Event consumersQueue-based scalerConsumer lag> 10,000 messages< 1,000 messages4 / 32
[Tier][Mechanism][Metric][Trigger][Trigger][Min / Max]

8.2 Planned scaling actions

IDActionTypeTrigger or dateOwnerComplete byStatus
SC-01Example: Move database to next instance class (32 to 64 vCPU)VerticalWeek 10 or CPU peak > 72%[@name]YYYY-MM-DD[Planned]
SC-02Example: Add connection pooler in front of databaseArchitecturalBefore connections > 800[@name]YYYY-MM-DD[Planned]
SC-03Example: Raise web autoscaler max from 60 to 80HorizontalBefore annual sale[@name]YYYY-MM-DD[Planned]
[SC-nn][Action][Horizontal / Vertical / Architectural][Trigger][@name]YYYY-MM-DD[Status]

8.3 Efficiency improvements

[List optimisations that reduce per-unit cost, with the expected effect on the models in section 6. Example: "Caching product lookups is expected to cut database reads by 35%, reducing CPU per transaction from 11 ms to 8 ms."]

9. Procurement and lead times

ItemQuantitySupplier / providerLead timeOrder byApproval neededStatus
Example: Regional vCPU quota increase+200 vCPU[Cloud provider]5 working daysYYYY-MM-DDSRE lead[Requested]
Example: Database licence tier upgrade1[Vendor]3 weeksYYYY-MM-DDFinance[Not started]
Example: On-premises storage shelf2[Vendor]8 weeksYYYY-MM-DDCTO[Not started]
[Item][Qty][Supplier][Time]YYYY-MM-DD[Role][Status]

The latest order date for an item is:

torder=texhaust−(L+B)t_{\text{order}} = t_{\text{exhaust}} - (L + B)

where LL is the lead time and BB a safety buffer for installation and testing.

10. Cost projection

10.1 Projected cost

PeriodWebDatabaseEvent streamStorageTotalCost per 1,000 requests
Example: Current[Amount][Amount][Amount][Amount][Amount][Amount]
Example: Month 6[Amount][Amount][Amount][Amount][Amount][Amount]
Example: Month 12[Amount][Amount][Amount][Amount][Amount][Amount]

Unit cost is computed as:

cunit=Total cost for periodRequests served in period/1000c_{\text{unit}} = \frac{\text{Total cost for period}}{\text{Requests served in period} / 1000}

10.2 Commitments and purchasing options

[Describe which baseline capacity will be covered by reservations or committed-use discounts, and which remains on demand. Example: "Commit 60% of the month-6 web baseline for one year; keep spikes on demand."]

11. Risks and assumptions

11.1 Assumptions

  • Example: Request mix stays within 5% of the current read/write ratio.
  • Example: No change in client retry behaviour.
  • [Assumption]

11.2 Risks

IDRiskLikelihoodImpactMitigationOwner
CR-01Example: Growth exceeds high scenario after viral campaignLowHighAutoscaler max raised; database upgrade pre-approved[@name]
CR-02Example: Provider has no capacity for larger instance class in regionMediumHighReserve capacity in advance; test alternate class[@name]
CR-03Example: New feature doubles per-request database costMediumMediumCapacity review in design checklist[@name]
[CR-nn][Risk][L / M / H][L / M / H][Mitigation][@name]

12. Review cadence and accuracy tracking

ReviewFrequencyParticipantsInputsOutput
Utilisation checkWeeklySRE on dutyDashboardsExceptions raised
Plan reviewMonthlyService owners, SRE, FinOpsForecast vs actualUpdated actions in 8.2
Full replanQuarterlyAll approversNew telemetry, roadmapNew version of this document

Forecast error for each period is tracked as:

Errort=Dtactual−DtforecastDtforecast\text{Error}_t = \frac{D_t^{\text{actual}} - D_t^{\text{forecast}}}{D_t^{\text{forecast}}}
PeriodForecast peakActual peakErrorComment
Example: Month 14,4104,620+4.8%Campaign started early
[Period][Value][Value][%][Comment]

13. Appendices

13.1 Load test evidence

Test IDDateTierResultReport
LT-12YYYY-MM-DDExample: Web350 req/s per instance at p99 < 250 ms[Link]
[LT-nn]YYYY-MM-DD[Tier][Result][Link]

13.2 Data sources

[List the dashboards, queries and exports used, with time ranges, so the next planner can reproduce the numbers.]

13.3 Glossary

TermMeaning
HeadroomSpare capacity kept above planned peak
Failure domainA unit that can fail independently, such as a zone or rack
Time to exhaustionTime until a resource reaches its threshold at the forecast growth rate
Unit costCost divided by units of demand served

Standard and licence note

Based on common site reliability engineering and IT capacity management practice for demand forecasting, headroom and scaling plans. Original text written for this collection; example numbers are illustrative. Template licence: MIT.

관련 템플릿