要回答的问题

  • 当前系统能承受多少负载?
  • 什么时候会不够用?
  • 需要提前多久采购/扩容?
  • 需要多少资源才能支撑预期的增长?

为什么重要

容量不足:服务降级、超时、不可用——直接影响用户和业务。

容量过剩:浪费成本。在云环境中,这意味着每月多付钱。

容量规划的目标,是在两者之间找到平衡——用合理的成本,支撑业务的增长。

基本流程

一、建立当前基线

先测量现在的状态:

  • 峰值 QPS / 并发数;
  • 资源使用率(CPU、内存、磁盘 I/O、网络带宽、连接数);
  • 关键业务指标(日活、订单量、数据量)。

关键:看的是峰值和趋势,不只是平均值。

二、确定单实例的容量上限

通过压力测试(Load Testing / 基准测试)获得:

  • 逐步增加负载,观察响应时间;
  • 找到拐点(性能开始急剧下降的位置);
  • 确定单实例能支撑的 QPS(在满足延迟目标的前提下)。

注意:

  • 压力测试要贴近真实场景(真实的请求分布、数据规模、读写比例)——否则结果失真;
  • 在压测中发现瓶颈后,优化并重新测试。

三、预测增长

基于业务数据做预测:

  • 历史增长率;
  • 业务计划(如即将到来的营销活动、新市场拓展);
  • 季节性波动(如电商的大促)。

关键:与业务团队沟通——技术指标(QPS)需要翻译成业务指标(用户数、订单量),反之亦然。

四、计算需求

需要的实例数 = 预期峰值 QPS / 单实例容量
                    × (1 + 冗余系数)

冗余系数考虑:

  • 故障冗余:N+1 或 N+2(一台机器故障时仍能服务);
  • 增长缓冲;
  • 突发流量余量。

五、确定扩容时间点

考虑采购和安装周期(物理服务器可能数周,云资源几分钟)。

云环境大大简化了这个过程——但依然需要规划(如预留实例需要提前购买以获得折扣)。

关键概念:余量(Headroom)

永远不要让系统跑在 100% 利用率上。

原因:

  • 排队论告诉我们:当资源利用率接近 100% 时,延迟会急剧上升(因为排队时间爆炸式增长);
  • 没有应对突发流量的空间;
  • 没有应对故障的空间。

经验做法:目标利用率通常在 60%–80%,具体取决于业务的波动性和故障容忍度。

云环境下的变化

弹性伸缩(前文提到过)改变了容量规划的方式:

  • 不再需要为峰值长期预留资源;
  • 可以根据负载自动扩缩容。

但规划依然必要:

  • 扩容需要时间:启动新实例、应用初始化、预热(JIT 编译、缓存加载)可能需要几分钟。对于突发流量,这几分钟可能就是事故;
  • 配额限制:云账号有资源配额,需要提前申请;
  • 成本优化:预留实例、节省计划(Savings Plans)需要提前承诺;
  • 数据库等有状态服务:扩缩容困难得多,仍需规划。

瓶颈分析

容量规划的关键是找到真正的瓶颈——往往是某个特定的资源:

  • CPU 密集型:计算、加密、压缩、视频转码;
  • 内存密集型:缓存、大数据集;
  • I/O 密集型:数据库、文件服务;
  • 连接数:数据库的最大连接数常常是瓶颈;
  • 带宽:CDN、视频分发。

不要盲目扩容——如果瓶颈是数据库的连接数,增加应用服务器只会让情况更糟(更多连接)。

压测的类型

负载测试(Load Testing):在预期负载下验证系统表现。

压力测试(Stress Testing):超出预期负载,找到系统的极限和失效方式。

容量测试:确定系统在满足性能目标下的最大负载。

浸泡测试(Soak / Endurance Testing):长时间运行,发现内存泄漏、资源耗尽等问题。

尖峰测试(Spike Testing):突然的大流量冲击,验证弹性。

一句话

容量规划的本质,是把"我们不知道能撑多久",变成"我们知道在什么时候、需要什么、以及为什么"。

说明:本文为运维实践的知识整理。