规模化讨论里,最容易吵架的不是方案,而是数字。本附录把卷四用到的指标集中成表,供评审与复盘时直接引用。
每条指标都按「分子 / 分母 / 窗口 / 采集」四要素写。缺一项,数字就只能当参考,不能当判据。
容量与利用率
容量指标回答「还能不能撑住」,利用率回答「撑得是否浪费」。
| 指标 | 分子 | 分母 | 窗口 | 采集 |
|---|---|---|---|---|
| 峰值 QPS | 请求数 | 秒 | 取窗口内最大值 | 网关/服务端日志 |
| 平均 QPS | 请求数 | 秒 | 5 分钟均值 | 监控系统 |
| 容量水位 | 峰值 QPS | 压测容量 | 日 | 压测报告 + 监控 |
| CPU 利用率 | CPU 使用核数 | 分配核数 | 5 分钟均值 | 主机监控 |
| 内存利用率 | 常驻内存 | 限额 | 5 分钟均值 | 主机监控 |
| 连接池占用 | 活跃连接 | 最大连接 | 1 分钟均值 | 应用指标 |
容量水位不是越高越好。70% 意味着还有 30% 余量,也意味着一次突发就可能打满;50% 更安全,但成本更高。哪一个合适,取决于扩容速度与突发概率。
CPU 利用率要区分「平均」与「峰值」。平均 40%、峰值 95% 的系统,比平均 60%、峰值 70% 的系统更危险。判断容量时看峰值,判断成本时看平均。
内存利用率要小心缓存。缓存把内存吃到 90% 是正常设计,不是故障;但如果没有回收策略,一次冷启动就可能 OOM。
爆炸半径
爆炸半径衡量「一次故障最多影响多少人」,是单元化与隔离的核心指标。
| 指标 | 定义 | 目标示例 |
|---|---|---|
| 单元用户占比 | 单元用户数 / 总用户数 | 单单元 ≤ 1/3 |
| 单点依赖数 | 无冗余的关键依赖个数 | 0 |
| 故障影响面 | 单组件故障影响的最大请求比例 | ≤ 20% |
| 跨单元调用比例 | 跨单元请求 / 总请求 | 越低越好 |
| 降级覆盖 | 有降级预案的核心接口 / 核心接口总数 | 100% |
「单点依赖数」需要人工梳理,不能只看监控。数据库主库、配置中心、鉴权服务、支付渠道,任何一个没有冗余,都是单点。
故障影响面要用演练验证,不能只靠架构图。架构图上画了三个单元,实际路由可能把 80% 用户放在一个单元里。
SLO 与错误预算
SLO 指标必须有明确的口径,否则无法跨团队比较。
| 指标 | 分子 | 分母 | 窗口 | 说明 |
|---|---|---|---|---|
| 可用性 SLI | 成功请求数 | 总请求数 | 28 天滚动 | 成功率口径需定义 |
| 延迟 SLI | 延迟 ≤ 阈值的请求数 | 总请求数 | 28 天滚动 | 阈值按接口分级 |
| 错误预算 | 1 − SLO 目标 | — | 同 SLO 窗口 | 以比例或分钟表示 |
| 燃烧率 | 实际错误率 | 预算错误率 | 1 小时/6 小时 | 多窗口告警 |
| 可用性缺口 | 不可用分钟数 | 窗口总分钟数 | 月 | 用于对外承诺 |
成功请求的定义要写清:5xx 算失败,4xx 是否算失败,超时算不算,降级返回算不算。口径不同,同一个系统的可用性能差出两个数量级。
错误预算烧完不等于必须停止发布,但必须有明确的处置规则:是冻结发布、只允许修复,还是需要架构评审。规则要事前写,不能临时争论。
多窗口燃烧率比单窗口更稳。1 小时燃烧率能快速发现急性故障,6 小时燃烧率能发现慢性失血,两者结合可以减少误报与漏报。
成本与单位经济
成本指标要能落到「每单位业务量」,否则无法判断优化是否有意义。
| 指标 | 分子 | 分母 | 说明 |
|---|---|---|---|
| 每订单成本 | 月总成本 | 月订单数 | 分母用支付订单,不用创建单 |
| 每活跃用户成本 | 月总成本 | 月活用户 | 月活定义需固定 |
| 每万请求成本 | 月总成本 | 月请求数 / 10000 | 适合 API 型业务 |
| 存储单位成本 | 月存储费用 | 存储 GB | 分热/温/冷 |
| 带宽单位成本 | 月带宽费用 | 出网 GB | 含回源 |
| 闲置成本占比 | 闲置资源费用 | 总费用 | 闲置定义需固定 |
月总成本包括计算、存储、带宽、数据库、中间件与人力分摊。只算机器费用,会低估真实成本;把人力全摊进去,又会掩盖资源浪费。建议分两层看:资源成本与全成本。
成本优化要先看结构,再看单价。存储占 60% 时,优化计算单价意义不大;带宽占 50% 时,先看回源与缓存命中率。
闲置资源要有明确定义:连续 14 天 CPU 峰值低于 10%、无流量、无告警关联,才算闲置。定义太松会误删,太严则回收不了。
分片与数据倾斜
分片系统的健康度,主要看倾斜与热点。
| 指标 | 分子 | 分母 | 说明 |
|---|---|---|---|
| 分片倾斜度 | 最大分片数据量 | 平均分片数据量 | > 1.5 需要关注 |
| 热点分片 QPS | 最大分片 QPS | 平均分片 QPS | > 2 需要拆分或加盐 |
| 跨片查询比例 | 跨片查询数 | 总查询数 | 越低越好 |
| 归档比例 | 已归档数据量 | 总数据量 | 按策略目标 |
| 迁移差异率 | 双读不一致条数 | 比对总条数 | 迁移期核心指标 |
倾斜度要按数据量与 QPS 分别看。数据倾斜影响存储与备份,QPS 倾斜影响延迟与可用性,两者的解法不同。
分片键一旦上线就很难改。评估分片键时,至少看三个维度:分布是否均匀、查询是否带分片键、未来是否会长出跨片事务。
发布与研发效能
发布效能指标用于判断「团队能不能独立演进」。
| 指标 | 定义 | 采集 |
|---|---|---|
| 发布频率 | 单位时间发布次数 | CI/CD 记录 |
| 变更前置时间 | 提交到上线的时长 | 代码平台 + 发布平台 |
| 变更失败率 | 导致回滚或故障的发布比例 | 发布记录 + 故障记录 |
| 平均恢复时间 | 故障开始到恢复的时长 | 故障系统 |
| 回滚时长 | 决定回滚到恢复的时长 | 发布平台 |
| 发布影响面 | 单次发布影响的服务数 | 依赖图 |
发布频率高不等于效能高。如果每次发布都要三个团队配合,频率高只是把协调成本摊薄到每次发布里。
变更失败率要区分「回滚」与「故障」。回滚是正常操作,不一定算失败;导致用户可见故障的发布才算。
回滚时长比平均恢复时间更能反映发布系统的成熟度。回滚需要 30 分钟的系统,即使故障少,风险也高。
平台与组织
平台类指标最容易自说自话,必须同时看采纳与成本。
| 指标 | 分子 | 分母 | 说明 |
|---|---|---|---|
| 平台采纳率 | 接入平台的服务数 | 目标服务数 | 分母要事先定义 |
| 平台覆盖率 | 经由平台的请求数 | 总请求数 | 比服务数更真实 |
| 平台迁移成本 | 迁移人天 | 迁移服务数 | 按服务类型分 |
| 双轨成本 | 新旧两套并行的月成本 | 总成本 | 迁移期指标 |
| 决策周期 | 决策发起到完成的天数 | 决策数 | 按影响分级 |
| 技术债利息 | 额外维护人天 / 月 | 团队总人天 | 估算值需标注 |
采纳率的分母经常被悄悄改小。目标服务数应该在上线前冻结,否则「接入 20 个服务、目标也是 20 个」可以得到 100% 的采纳率。
平台覆盖率比服务数更能说明问题:接了平台但流量都走旁路,等于没接。
技术债利息是估算值,必须标注估算方法与假设。把它写成「实测」会误导决策。
采样与聚合
规模化系统的指标几乎都经过采样与聚合,采样方式会改变结论。
| 方式 | 做法 | 偏差来源 | 适用 |
|---|---|---|---|
| 全量计数 | 每个事件都记 | 成本高、基数大 | 订单、支付等关键事件 |
| 头部采样 | 只记慢请求 | 低估成功率、高估延迟 | 延迟分析 |
| 随机采样 | 按比例抽样 | 小流量指标波动大 | 日志、调用链 |
| 分位聚合 | 各节点算分位再合并 | 合并算法有误差 | 跨节点延迟 |
| 直方图聚合 | 分桶后合并 | 桶边界影响精度 | 大规模延迟指标 |
「P99 延迟」在采样系统里尤其危险。头部采样会把所有慢请求都记下来,算出看起来合理的分位;随机采样在小流量时,P99 可能只由几十个请求决定。
分位不能直接平均。三个节点各自的 P99 取平均,不等于全局 P99。要合并分位,必须用直方图或 t-digest 之类的结构,并在报表里注明算法。
计数器要处理重启。服务重启后计数器归零,如果直接做差分,会出现负值或尖峰。常见做法是用单调递增的时间戳或重启标记过滤。
告警阈值怎么定
阈值不是拍脑袋,也不是照抄别家。一个可用的阈值至少经过三步。
第一步:看历史分布。 取最近 28 天的同一时段数据,算出 P50、P95、P99。阈值通常设在 P99 附近,而不是平均值。
第二步:看告警成本。 误报一次要花多少人力?漏报一次影响多少用户?两者不对称时,阈值要偏向成本高的一侧。
第三步:看可行动性。 告警响起后,值班同学能做什么?如果只能「观察一下」,这个告警就不该存在。
| 指标类型 | 阈值建议 | 说明 |
|---|---|---|
| 可用性 | 28 天 SLO 的燃烧率 | 多窗口组合 |
| 延迟 | 分接口 P99 + 20% | 按业务重要度分级 |
| 容量 | 水位 70% 预警、85% 严重 | 结合扩容速度 |
| 错误率 | 基线 + 3 个标准差 | 需排除已知波动 |
| 成本 | 日环比 + 30% | 防止突增,不追求精确 |
容量告警要留出扩容时间。如果扩容需要 20 分钟,85% 才告警就太晚,应在 70% 预警。
成本告警看趋势,不看绝对值。日环比突增往往比「本月已花 80% 预算」更早发现问题。
一次口径事故
「回声」曾有一次关于「支付成功率下降」的告警。支付团队看到 92%,比平时低 3 个百分点,紧急排查了两小时,最后发现是口径问题。
原来,支付成功率的分子来自支付库的「成功」状态,分母来自网关的「发起支付」请求。那天网关做了一次重试策略调整,同一笔支付会发起两次请求,分母涨了 8%,分子没变。成功率自然下降。
这次事故之后,团队做了三件事:
- 分子分母统一从支付库取,按支付单号去重。
- 报表里增加「重试率」指标,重试异常时能提前发现。
- 口径变更必须走评审,变更记录写进指标字典。
口径事故的代价往往比真实故障更高,因为它消耗的是团队对数据的信任。真实故障修完就结束,口径事故会让人在很长时间里怀疑每一个数字。
指标字典模板
一个可用的指标条目至少包含以下字段:
| 字段 | 示例 |
|---|---|
| 指标名 | 支付成功率 |
| 英文名 | payment_success_rate |
| 分子 | 支付成功单数 |
| 分母 | 发起支付单数 |
| 窗口 | 自然日,按支付发起时间归属 |
| 去重 | 按支付单号 |
| 数据源 | 支付库 payment_order |
| 排除 | 测试账号、风控拦截、重复回调 |
| 负责人 | 交易平台组 |
| 版本 | v3,2026-10-01 生效 |
「排除」是最容易被漏掉的一栏。测试订单、刷单、内部流量如果不排除,小体量业务的指标会剧烈波动。
指标字典应该与数据模型放在一起,最好能从字典生成查询。手写 SQL 与文档各维护一份,迟早分叉。
趋势与基线
单点数字没有意义,趋势才有。看趋势时要固定三件事:口径、窗口、采样方式。任何一项变了,趋势就断了。
基线建议取「过去 4 个同周几的同一时段」,而不是「昨天」。周内波动、活动周期、版本发布都会影响数字,同周几对比能过滤掉一部分。
对于有明显季节性的业务,基线要按季节调整。电商的大促月、教育的开学季、游戏的假期,都会让「正常水平」发生偏移。
趋势异常时,先排除口径与采集问题,再怀疑系统。顺序反了,会在错误的方向上排查很久。
指标评审清单
给一个指标做评审时,按顺序问:
- 分子与分母是否来自同一数据源、同一时间口径?
- 窗口是自然日、滚动 28 天,还是自定义?
- 去重键是什么?用户、订单、请求还是设备?
- 排除了哪些数据?测试账号、内部流量、风控拦截?
- 谁负责这个指标?口径变更由谁批准?
- 这个指标变好时,会不会让另一个指标变差?
- 指标异常时,第一动作是什么?
七个问题里有一个答不上来,这个指标就不适合作为考核或告警依据,只能作为参考。
常见误读
- 把平均值当容量。 峰值才是容量判据。
- 把可用性当体验。 请求成功但延迟 5 秒,用户仍然会走。
- 把成本当财务问题。 成本结构反映的是架构选择。
- 把采纳率当成功。 接了平台但没用起来,是负收益。
- 把发布频率当效能。 没有回滚能力的频繁发布,只是频繁冒险。
- 把倾斜度当数据问题。 倾斜往往来自分片键设计,不是数据本身。
- 把估算当实测。 技术债利息、闲置成本、平台收益,都要标注估算。
这些误读的共同点是:指标本身没错,错在用它回答它回答不了的问题。评审时先确认「这个指标能回答什么」,再讨论数值高低。
怎么用这份附录
- 做容量规划:看「容量与利用率」「爆炸半径」两节。
- 做稳定性评审:看「SLO 与错误预算」一节。
- 做成本优化:看「成本与单位经济」「分片与数据倾斜」两节。
- 做平台复盘:看「发布与研发效能」「平台与组织」两节。
每次使用前,先把自己的口径写下来,再和表里的定义对照。口径对齐之后,数字才有讨论价值。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。