概述
2021 年我刚接手一个运维团队时,做了个简单统计:团队 12 个人,一周 40 小时工作时间里,平均 24 小时花在手动处理工单、重启服务、补磁盘空间这些事情上。琐事占比 60%。剩下 16 小时里,一半在开会同步信息,真正做工程优化的时间每周不到 8 小时。
团队里每个人都很忙,但系统还是不稳定。MTTR 40 分钟,可用性 99.5%,告警群每天 200 多条。老板问我:“我们团队到底行不行?“我答不上来。不是谦虚,是没有量化标准。
后来我花了 3 年时间,把可用性从 99.5% 推到 99.9%,MTTR 从 40 分钟压到 8 分钟,琐事占比从 60% 降到 20% 以内。回头复盘,最关键的一步不是引入了什么工具,而是建立了一套成熟度评估体系——先搞清楚团队在哪个段位,再决定下一步投什么。
这篇文章分享我实际用过的 SRE 团队成熟度 5 级模型。它借鉴了 CMMI 的分层思路,但完全针对 SRE 场景重新设计,每个级别都有可量化的判断标准。文末有一份 Python 自检脚本,你跑一下就知道自己的团队在哪一级。
为什么需要 SRE 成熟度模型
先说几个常见场景,看看你中了几条:
- 招人时 JD 写"精通 K8s 和 Prometheus”,面了一圈发现候选人技术栈差不多,但来了之后产出天差地别——因为你不知道团队缺的是"会写 PromQL 的人"还是"能设计 SLO 体系的人”
- 申报预算时跟老板说"我们需要买 Datadog 和搭建混沌工程平台",老板问"现在是什么水平?投了能到什么水平?“你答不上来
- 跨团队协作时,开发觉得 SRE 只会卡上线,SRE 觉得开发只管发版不管稳定性——根源是双方对"SRE 该干什么"没有共识
- 团队里有人想推进自动化,有人觉得"手动操作挺好的为什么要改”,你作为负责人没法用数据说服
这些问题的共同根因是:没有一把可量量的尺子来衡量团队能力。
CMMI 解决的是软件过程的问题,关注的是需求管理、配置管理、质量保证这些开发流程。SRE 成熟度模型关注的不是"你怎么写代码",而是"你怎么保障线上系统稳定运行"——监控覆盖到哪些服务、故障多久能恢复、变更出问题能不能自动回滚、团队多少时间在做工程多少时间在做琐事。
传统运维是"出了问题我来修",SRE 是"用工程方法让问题少发生、发生了快速恢复"——两者定位完全不同。
SRE 团队成熟度 5 级模型
我参考 CMMI 的五级分层(初始级→已管理级→已定义级→量化管理级→持续优化级),结合 Google SRE Book 的核心实践和自己在多个项目中的落地经验,设计了下面这个 SRE 专属的成熟度模型。
L1:救火队(Reactive)
核心特征:被动响应,手动运维,没有体系。
关键指标范围:
| 指标 | 典型值 | 说明 |
|---|---|---|
| MTTR | 30-60 分钟 | 靠人肉排查,无标准流程 |
| 琐事占比 | 50%-70% | 大量时间花在重复手动操作 |
| 告警准确率 | <30% | 大量误报,告警疲劳严重 |
| SLO 覆盖率 | 0% | 没有定义任何 SLO |
| 变更回滚 | 手动 | 出问题靠人肉回滚,经常回滚错版本 |
常见表现:
- 监控面板是装 Prometheus 时自带的默认模板,没人改过
- 告警配置是"CPU > 80% 就报警",不管白天黑夜都往群里发
- 出了故障先在群里问"谁动了什么",翻聊天记录找原因
- 运维知识在某个老员工脑子里,他休假就出事
- 发布靠手动
kubectl apply,出问题靠手动kubectl rollout undo
我接手的第一个团队就是这个状态。不是说团队不行——每个人技术能力都不差,但整个团队没有工程化思维,所有问题都靠"多盯盯"解决。
L2:规范化(Managed)
核心特征:有流程、有分工、有基本监控,但靠制度驱动而非数据驱动。
关键指标范围:
| 指标 | 典型值 | 说明 |
|---|---|---|
| MTTR | 15-30 分钟 | 有值班机制和排障文档 |
| 琐事占比 | 40%-50% | 部分操作脚本化,但维护成本高 |
| 告警准确率 | 30%-50% | 开始分级,但策略粗糙 |
| SLO 覆盖率 | <20% | 可能定义了核心服务的 SLO 但没落地 |
| 变更回滚 | 半自动 | CI/CD 有回滚按钮但要人判断什么时候触发 |
常见表现:
- 有了 On-Call 轮值表,凌晨告警有人接,但交接班信息靠口口相传
- 有 Runbook,但文档更新滞后于实际操作,经常"文档写的是 A 步骤,实际要做 B"
- Prometheus + Grafana 搭好了,面板是照搬别人的模板,没针对自己的业务调过
- CI/CD 流水线跑起来了,但发布频率还是受限于"发布要找老王审批"
- 故障复盘在做,但复盘结论经常是"加强监控"“提高意识"这种没法落地的话
On-Call 轮值设计是个大话题,相关文章:凌晨三点的电话又响了:On-Call 排班设计与疲劳治理 有详细讨论。
从 L1 到 L2 的跃迁相对容易,核心动作是建立流程和分工。但很多团队卡在 L2 上不去,因为 L2 到 L3 需要的不是"再多加几个流程”,而是一次思维方式的转变——从"制度驱动"到"数据驱动"。
L3:度量驱动(Measured)
核心特征:SLI/SLO 体系落地,错误预算驱动决策,告警基于 SLO 而非阈值。
关键指标范围:
| 指标 | 典型值 | 说明 |
|---|---|---|
| MTTR | 8-15 分钟 | 告警精准,排障有标准化路径 |
| 琐事占比 | 25%-40% | 自动化覆盖核心运维操作 |
| 告警准确率 | 60%-80% | 基于 SLO burn rate 的告警替代阈值告警 |
| SLO 覆盖率 | 60%-80% | 核心和重要服务都有 SLO |
| 变更回滚 | 自动触发 | 基于错误预算或健康检查自动回滚 |
常见表现:
- 每个核心服务都有定义好的 SLI(可用性、延迟、错误率),SLO 目标和产品方达成一致
- 告警不是"CPU 80%“而是"错误预算消耗速度异常”,减少了 70% 以上的无效告警
- 故障复盘有结构化模板,每条改进项有负责人和 deadline
- 开始用 IaC(Terraform/Ansible)管理基础设施,不再手动创建资源
- 有容量规划的意识,大促前会做压测和扩容预案
我在某出行项目落地 SLO 体系时,最有体感的变化是:告警群从每天 200 多条降到 20 条以内,每条都是需要立即处理的。团队从"被告警追着跑"变成"有问题再看告警"。MTTR 从 30 分钟降到 8 分钟,不是因为排查更快了,而是告警准了,定位时间从 25 分钟缩到 3 分钟。
SLI/SLO 体系的具体设计方法,相关文章:SRE 核心理念:SLI、SLO 与错误预算 有完整讲解。
L4:工程化(Engineering)
核心特征:平台化运维,自动化覆盖全链路,可靠性门禁嵌入研发流程。
关键指标范围:
| 指标 | 典型值 | 说明 |
|---|---|---|
| MTTR | 3-8 分钟 | 自动化诊断 + 自愈机制 |
| 琐事占比 | 15%-25% | 运维操作平台化,自助化 |
| 告警准确率 | 80%-95% | 告警即工单,自带上下文 |
| SLO 覆盖率 | 80%-95% | 含非核心服务 |
| 变更回滚 | 体系化 | 多层防护(金丝雀→健康检查→自动回滚→错误预算门禁) |
常见表现:
- 运维操作平台化:20+ 运维操作(扩缩容、重启、配置变更、日志清理等)集成到自助平台,研发可自助执行
- 新服务上线有生产就绪审查(Production Readiness Review),不达标的不能上线
- 变更管理由错误预算驱动:预算充足时发布自由走,预算紧张时自动收紧审批
- 监控即代码:告警规则用 Terraform 或 YAML 管理,版本可控、可 review
- 容量规划有数据模型支撑,不是拍脑袋,而是基于历史趋势和压测数据
这个阶段最大的变化是 SRE 从"服务的运维者"变成"可靠性的工程化建设者"。团队不直接运维某个服务,而是建设让开发团队能自助运维的平台和工具。
关于运维操作平台化的具体架构,我在 相关文章:从"群里 @ 运维"到自助执行:运维操作平台化的 6 层架构 中有详细拆解。
L5:自优化(Optimizing)
核心特征:持续实验和改进,混沌工程常态化,AI 辅助决策。
关键指标范围:
| 指标 | 典型值 | 说明 |
|---|---|---|
| MTTR | <3 分钟 | 大部分故障自愈,无需人工介入 |
| 琐事占比 | <15% | 团队 85%+ 时间做工程 |
| 告警准确率 | >95% | 预测性告警,故障发生前预警 |
| SLO 覆盖率 | >95% | 全覆盖,含第三方依赖 |
| 变更回滚 | 预防性 | 变更前自动验证,不合规变更不让孩子发布 |
常见表现:
- 混沌工程定期执行,主动注入故障验证系统韧性
- 告警从"反应式"变成"预测式":基于趋势分析在故障发生前预警
- 容量弹性完全自动化:HPA/VPA/CA 联动,扩缩容从 25 分钟到 1 分钟
- 知识管理从"文档"变成"可执行的 Runbook":不是人去看文档,而是平台根据故障类型自动推荐处理方案
- 团队时间分配:85% 做工程(平台开发、SLO 优化、混沌实验),15% 做日常运维
坦白说,L5 是理想态。Google 自己也还在往这个方向走。我见过的国内团队,能做到 L4 的已经是头部了。但 L5 给了一个目标方向——知道终点在哪,中间的每一步才有意义。
6 个评估维度
光有 5 级模型还不够——你需要知道从哪些维度来评估。下面是我实际用过的 6 个评估维度,每个维度有具体的可量化指标。
维度 1:事件响应能力
评估你的团队在故障发生时的响应速度和规范化程度。
| 评估项 | L1 | L2 | L3 | L4 | L5 |
|---|---|---|---|---|---|
| MTTR | 30-60min | 15-30min | 8-15min | 3-8min | <3min |
| 故障分级 | 无 | 有但靠经验 | SEV 分级明确 | 自动定级 | 预测性 |
| 复盘执行 | 不做 | 做了但没跟踪 | 结构化复盘+改进跟踪 | 改进项完成率>80% | 改进项自动跟踪 |
| On-Call | 无 | 有轮值但疲劳严重 | 轮值+疲劳管控 | 轮值+自动化辅助 | 自愈为主 |
维度 2:SLO 落地程度
SLI/SLO 体系是 SRE 的根基。没有 SLO,谈可靠性就是在凭感觉。
| 评估项 | L1 | L2 | L3 | L4 | L5 |
|---|---|---|---|---|---|
| SLO 覆盖率 | 0% | <20% | 60-80% | 80-95% | >95% |
| 错误预算 | 无 | 概念了解 | 落地+告警 | 驱动发布决策 | 驱动产品决策 |
| SLI 定义 | 无 | 手动配置 | 标准化模板 | IaC 管理 | 自动发现 |
| SLO 评审 | 无 | 无 | 季度评审 | 月度调整 | 持续优化 |
维度 3:琐事占比
Google SRE Book 规定运维琐事不得超过 50%。这个数字是硬约束——超过 50%,团队就没有时间做工程优化,会陷入"越忙越没时间改进越忙"的死循环。
| 评估项 | L1 | L2 | L3 | L4 | L5 |
|---|---|---|---|---|---|
| 琐事占比 | 50-70% | 40-50% | 25-40% | 15-25% | <15% |
| 自动化覆盖率 | <10% | 10-30% | 30-60% | 60-85% | >85% |
| 重复操作识别 | 不识别 | 偶尔发现 | 定期审计 | 平台化消除 | 预测性消除 |
| 工单数量 | 无跟踪 | 有但不分析 | 趋势分析 | 分类治理 | 自动路由 |
维度 4:变更安全性
变更导致的故障占所有故障的 60% 以上(Google SRE Book 数据)。变更管理是 SRE 成熟度的核心维度。
| 评估项 | L1 | L2 | L3 | L4 | L5 |
|---|---|---|---|---|---|
| 回滚方式 | 手动 | 有按钮 | 半自动 | 自动+多层 | 预防性 |
| 灰度策略 | 无 | 手动灰度 | 自动灰度 | 金丝雀+流量管理 | 自动+AB测试 |
| 变更审查 | 无 | 人工审批 | PR Review | 自动化门禁 | 预测性门禁 |
| 变更冻结 | 无 | 大促手动冻结 | 错误预算驱动 | 动态窗口 | 风险预测冻结 |
维度 5:可观测性覆盖
可观测性不是"装了 Prometheus"就完了——关键是你能不能在不看日志的情况下回答"系统现在正不正常"。
| 评估项 | L1 | L2 | L3 | L4 | L5 |
|---|---|---|---|---|---|
| 监控覆盖 | 核心服务 | 核心全量 | 核心全量+重要服务 | 全量+依赖 | 全量+第三方 |
| 告警策略 | 阈值 | 分级阈值 | SLO burn rate | 告警即工单 | 预测性告警 |
| 日志覆盖 | 关键日志 | 结构化日志 | 集中采集+搜索 | 日志即数据 | 自动根因分析 |
| 链路追踪 | 无 | 有但不全 | 核心链路 | 全链路 | 自动拓扑发现 |
维度 6:知识管理
知识管理是最容易被忽略的维度。很多团队技术上不差,但知识传递效率极低——新人上手要 3 个月,老人走了知识就断层。
| 评估项 | L1 | L2 | L3 | L4 | L5 |
|---|---|---|---|---|---|
| Runbook | 无 | 有但过时 | 定期更新 | 可执行 | 自动推荐 |
| 架构图 | 口口相传 | 有但不准 | 版本化 | IaC 生成 | 实时拓扑 |
| 故障案例库 | 无 | 有但不查 | 可搜索 | 结构化+关联 | 自动匹配 |
| 培训机制 | 师徒制 | 偶尔培训 | 定期分享 | 体系化课程 | 自动化学习 |
量化自检脚本
光看表格还不够直观。下面是一个 Python 脚本,输入你团队在各维度的实际情况,它会算出你的成熟度分数和级别。
#!/usr/bin/env python3
"""SRE 团队成熟度自检评分脚本
用法: python3 sre_maturity_score.py
按提示输入各维度数据,输出成熟度等级和改进建议。
"""
import json
import sys
# 6 个维度的评估项和评分规则
# 每个维度满分 100 分,6 个维度总分 600
# L1: <150, L2: 150-250, L3: 250-380, L4: 380-480, L5: >480
DIMENSIONS = {
"incident_response": {
"name": "事件响应能力",
"questions": [
{
"key": "mttr",
"prompt": "团队平均 MTTR(分钟)",
"scores": {60: 10, 30: 25, 15: 45, 8: 70, 3: 90, 0: 100},
},
{
"key": "severity",
"prompt": "故障分级机制(1=无 2=有但靠经验 3=SEV明确 4=自动定级 5=预测性)",
"scores": {1: 10, 2: 25, 3: 50, 4: 75, 5: 100},
},
{
"key": "postmortem",
"prompt": "复盘改进项完成率(0-100%)",
"scores": lambda x: min(100, int(x)),
},
{
"key": "oncall",
"prompt": "On-Call 机制(1=无 2=有轮值 3=轮值+疲劳管控 4=轮值+自动化 5=自愈为主)",
"scores": {1: 10, 2: 30, 3: 55, 4: 80, 5: 100},
},
],
},
"slo_adoption": {
"name": "SLO 落地程度",
"questions": [
{
"key": "slo_coverage",
"prompt": "SLO 覆盖率(0-100%)",
"scores": lambda x: min(100, int(x)),
},
{
"key": "error_budget",
"prompt": "错误预算使用(1=无 2=了解概念 3=落地+告警 4=驱动发布 5=驱动产品决策)",
"scores": {1: 10, 2: 25, 3: 50, 4: 75, 5: 100},
},
{
"key": "sli_standard",
"prompt": "SLI 定义方式(1=无 2=手动 3=标准化 4=IaC 5=自动发现)",
"scores": {1: 10, 2: 30, 3: 55, 4: 80, 5: 100},
},
],
},
"toil_ratio": {
"name": "琐事占比",
"questions": [
{
"key": "toil_pct",
"prompt": "运维琐事占比(0-100%)",
"scores": lambda x: max(0, 100 - int(x) * 1.5),
},
{
"key": "automation",
"prompt": "自动化覆盖率(0-100%)",
"scores": lambda x: min(100, int(x)),
},
],
},
"change_safety": {
"name": "变更安全性",
"questions": [
{
"key": "rollback",
"prompt": "回滚方式(1=手动 2=有按钮 3=半自动 4=自动+多层 5=预防性)",
"scores": {1: 10, 2: 25, 3: 50, 4: 75, 5: 100},
},
{
"key": "canary",
"prompt": "灰度策略(1=无 2=手动 3=自动 4=金丝雀+流量管理 5=自动+AB)",
"scores": {1: 10, 2: 30, 3: 55, 4: 80, 5: 100},
},
{
"key": "change_gate",
"prompt": "变更审查(1=无 2=人工审批 3=PR Review 4=自动化门禁 5=预测性)",
"scores": {1: 10, 2: 30, 3: 55, 4: 80, 5: 100},
},
],
},
"observability": {
"name": "可观测性覆盖",
"questions": [
{
"key": "monitoring",
"prompt": "监控覆盖率(0-100%)",
"scores": lambda x: min(100, int(x)),
},
{
"key": "alerting",
"prompt": "告警策略(1=阈值 2=分级 3=SLO burn 4=告警即工单 5=预测性)",
"scores": {1: 10, 2: 30, 3: 55, 4: 80, 5: 100},
},
{
"key": "tracing",
"prompt": "链路追踪(1=无 2=有不全 3=核心 4=全链路 5=自动拓扑)",
"scores": {1: 10, 2: 30, 3: 55, 4: 80, 5: 100},
},
],
},
"knowledge": {
"name": "知识管理",
"questions": [
{
"key": "runbook",
"prompt": "Runbook 状态(1=无 2=过时 3=定期更新 4=可执行 5=自动推荐)",
"scores": {1: 10, 2: 25, 3: 50, 4: 75, 5: 100},
},
{
"key": "architecture",
"prompt": "架构图(1=口口相传 2=有但不准 3=版本化 4=IaC生成 5=实时拓扑)",
"scores": {1: 10, 2: 25, 3: 50, 4: 75, 5: 100},
},
{
"key": "case_library",
"prompt": "故障案例库(1=无 2=有但不查 3=可搜索 4=结构化 5=自动匹配)",
"scores": {1: 10, 2: 25, 3: 50, 4: 75, 5: 100},
},
],
},
}
LEVEL_NAMES = {
1: "L1 救火队(Reactive)",
2: "L2 规范化(Managed)",
3: "L3 度量驱动(Measured)",
4: "L4 工程化(Engineering)",
5: "L5 自优化(Optimizing)",
}
LEVEL_THRESHOLDS = [
(0, 150, 1),
(150, 250, 2),
(250, 380, 3),
(380, 480, 4),
(480, 601, 5),
]
def score_question(q, answer):
"""根据答案计算单项得分"""
scores = q["scores"]
if callable(scores):
return scores(answer)
# 找到 <= answer 的最大 key
best = 0
for threshold, score in sorted(scores.items()):
if answer >= threshold:
best = score
return best
def run_assessment():
"""交互式自检"""
print("=" * 60)
print("SRE 团队成熟度自检")
print("=" * 60)
results = {}
total = 0
for dim_key, dim in DIMENSIONS.items():
print(f"\n--- {dim['name']} ---")
dim_score = 0
q_count = len(dim["questions"])
for q in dim["questions"]:
while True:
try:
raw = input(f" {q['prompt']}: ").strip()
if q["scores"] == q.get("scores") and callable(q["scores"]):
answer = float(raw)
elif isinstance(q["scores"], dict):
answer = int(raw)
if answer not in q["scores"] and max(q["scores"].keys()) > 5:
answer = float(raw)
else:
answer = float(raw)
break
except ValueError:
print(" 输入无效,请重新输入")
s = score_question(q, answer)
dim_score += s
results[f"{dim_key}.{q['key']}"] = {"answer": raw, "score": s}
dim_avg = round(dim_score / q_count)
print(f" → {dim['name']} 得分: {dim_avg}/100")
total += dim_avg
# 判定级别
level = 1
for low, high, lv in LEVEL_THRESHOLDS:
if low <= total < high:
level = lv
break
print("\n" + "=" * 60)
print(f"总分: {total}/600")
print(f"成熟度等级: {LEVEL_NAMES[level]}")
print("=" * 60)
# 改进建议
weakest = min(
DIMENSIONS.keys(),
key=lambda k: sum(
results[f"{k}.{q['key']}"]["score"]
for q in DIMENSIONS[k]["questions"]
) / len(DIMENSIONS[k]["questions"]),
)
print(f"\n最薄弱维度: {DIMENSIONS[weakest]['name']}")
print(f"建议优先投入: {DIMENSIONS[weakest]['name']} 的改进")
print(f"完整结果已保存到 sre_maturity_result.json")
with open("sre_maturity_result.json", "w") as f:
json.dump({"total": total, "level": level, "details": results}, f, indent=2)
return total, level
if __name__ == "__main__":
run_assessment()
这个脚本我在团队里用了两年。每次季度复盘跑一遍,对比上次的分数,就知道这三个月到底有没有进步。比跟老板汇报"我们做了很多优化"有说服力多了。
6 个跃迁决策
从一级到下一级不是自然发生的,需要刻意投入。下面是 6 个关键决策,每个都是我在实际项目中做过的选择。
决策 1:L1→L2,先建值班机制还是先建监控
我的推荐:先建值班机制。
理由很直接:监控可以照搬别人的模板,但值班机制建立的是"谁负责、出了问题找谁"这个基础协作关系。没有这个关系,再好的监控也没人看。
具体做法:
- 排定 On-Call 轮值表,7 天一轮,主备各一人
- 定义告警渠道:P0 电话通知、P1 短信+群消息、P2 群消息
- 建交接班清单:当前未解决的告警、即将到期的变更、已知风险
- On-Call 期间琐事占比不超过 25%(Google 标准),超了就说明排班不合理
踩坑:我第一次排班时把最强的人排在主班,结果他成了"所有问题的终点",不仅自己累死,团队其他人也得不到锻炼。正确的做法是强弱搭配,主班处理 P0,副班处理 P1 并跟主班学习。
决策 2:L2→L3,先做 SLO 还是先清告警
我的推荐:先做 SLO,用 SLO 驱动告警清理。
先清告警是个陷阱——没有标准,你怎么判断哪条告警该删?删错了出事故谁负责?SLO 给了你一个客观标准:任何不消耗错误预算的波动都不该告警。
落地顺序:
- 选 1-2 个核心服务,定义 SLI(建议从可用性开始:成功请求/总请求)
- 跟产品方确认 SLO 目标(不要自己拍,要业务方认可)
- 配置错误预算 burn rate 告警,替代旧的 CPU/内存阈值告警
- 观察 2 周,确认新告警有效性后,逐步清理旧告警
实测数据:我在某出行项目落地 SLO 后,告警数量从 200 条/天降到 20 条/天,告警准确率从 28% 提升到 78%。团队每周少花 15 小时处理无效告警。
决策 3:L3→L4,错误预算门禁放在哪一层
我的推荐:三层门禁,不要一步到位。
错误预算门禁是 L4 的标志性实践,但一步到位推全量会遭到开发团队的强烈反弹。我的做法是分三层:
| 层级 | 触发条件 | 动作 | 推行时机 |
|---|---|---|---|
| 黄色 | 错误预算消耗 >50% | 自动通知研发团队,提示控制发布频率 | 第1个月 |
| 红色 | 错误预算消耗 >75% | 新发布需 SRE review,自动灰度范围缩小 | 第2个月 |
| 黑色 | 错误预算耗尽 | 发布冻结,只允许 bugfix 和回滚 | 第3个月 |
踩坑:一开始我把红色门禁设成"所有发布都需 SRE 审批",结果 SRE 变成了瓶颈——每天 20 个发布请求排队等审批。后来改成"红色时只 review 变更风险高的发布",审批量降到每天 3-5 个。门禁的目的是降低风险,不是卡住业务。
决策 4:L4→L5,自愈平台投入产出比
我的观点:80% 的团队不应该追求 L5。
L5 的核心特征是自愈——大部分故障不需要人介入。但自愈平台的开发成本极高:你需要为每种故障类型设计自动化恢复逻辑,覆盖的故障类型越多,开发量越大。
我见过一个团队花了 6 个月开发自愈平台,覆盖了 12 种常见故障,结果上线后发现:这 12 种故障只占总故障数的 35%。另外 65% 的故障是长尾,每种一年才发生一两次,投入自动化根本不划算。
务实建议:
- 先把 L4 做扎实——80% 的故障可以通过标准化运维操作平台化解决
- 自愈只针对高频故障(Top 5 故障类型,占总数 60% 以上)
- 其他的靠自动化辅助(自动诊断+推荐方案),不是完全自愈
决策 5:投资优先级排序
如果你有一笔预算,该投什么?下面是我的优先级排序表:
| 成熟度区间 | 第一优先 | 第二优先 | 不推荐 |
|---|---|---|---|
| L1 | On-Call 机制 + 基础监控 | Runbook | 混沌工程 |
| L2 | SLO 体系 + 告警治理 | CI/CD 自动化 | AIOps |
| L3 | 错误预算门禁 + 运维平台 | IaC | 自愈平台 |
| L4 | 自愈(高频故障) + 混沌工程 | 预测性告警 | 全量自愈 |
核心原则:不要跳级投资。L1 的团队上混沌工程是灾难——你连稳定状态都没建立,注入故障只会制造更多混乱。
决策 6:避免过度工程化
这是我最想强调的一点。成熟度模型是给你做自检用的,不是给你做 KPI 用的。
我见过一个团队主管拿到这个模型后,给每个维度定了"半年内升一级"的目标。结果团队为了升 L3,把所有服务的 SLO 都定了 99.99%——但其中一半服务根本没那么重要,SLO 定太高反而导致开发团队被错误预算绑死,什么都不敢发。
正确的用法:
- 每季度跑一次自检,看分数变化趋势
- 最薄弱的维度优先投入,不追求全面均衡
- 不同服务可以有不同目标——核心服务做到 L4,边缘服务做到 L2 就够了
- 成熟度提升是结果,不是目标——目标是提升系统可靠性和团队效率
生产实践:3 年从 L1 到 L4
最后分享我实际的跃迁路径,给一个具体的时间线参考。
第一年:L1→L2(建立秩序)
前 3 个月:
- 建立 On-Call 轮值,7 天一轮,主备搭配
- 清理告警渠道:P0 电话、P1 短信、P2 群消息,各归各位
- 写了 8 份核心服务的 Runbook,虽然粗糙但有了
3-6 个月:
- Prometheus + Grafana 基础面板搭建完成
- CI/CD 流水线接入自动测试,发布从手动 apply 变成流水线触发
- 开始记录工单数据,第一次有了琐事占比的量化数据:55%
6-12 个月:
- MTTR 从 40 分钟降到 28 分钟(主要靠 Runbook 缩短了定位时间)
- 琐事占比从 60% 降到 45%
- 团队开始有"这是工程问题不是操作问题"的意识
第二年:L2→L3(数据驱动)
前 6 个月:
- 为 3 个核心服务定义 SLI/SLO,SLO 覆盖率从 0% 到 45%
- 告警策略从阈值切换到 SLO burn rate,告警数量下降 70%
- 开始用 Terraform 管理基础设施,手动创建资源的次数降到 0
6-12 个月:
- SLO 覆盖率推到 72%
- MTTR 降到 12 分钟
- 琐事占比降到 30%
- 错误预算开始驱动发布节奏,开发团队从抵触到接受
第三年:L3→L4(工程化)
- 运维操作平台上线,20+ 运维操作自助化,琐事占比降到 22%
- 生产就绪审查落地,新服务上线前必须过 7 维度门禁
- 变更回滚从"有按钮"升级到"多层自动防护"
- MTTR 降到 8 分钟
- 可用性从 99.5% 提升到 99.9%
三年下来,团队从 12 个人变成 8 个人(人力降 40%),但系统比之前稳定得多。省下来的 4 个人力不是裁了,而是转去做平台开发和 SLO 优化——这就是 SRE 的价值:用工程方法替代人力堆叠。
替代方案与权衡
DORA 指标 vs SRE 成熟度模型
DORA(DevOps Research and Assessment)定义了 4 个关键指标:部署频率、变更前置时间、变更失败率、故障恢复时间。它的优势是跨行业可比,数据积累厚。
| 对比项 | DORA 指标 | SRE 成熟度模型 |
|---|---|---|
| 关注点 | 交付效率+稳定性 | 稳定性工程能力 |
| 指标数 | 4 个 | 6 维度 20+ 项 |
| 适用场景 | 整体研发效能评估 | SRE 团队专项评估 |
| 数据获取 | 从 CI/CD 系统提取 | 需要多系统综合 |
| 量化程度 | 高(4 个精确数字) | 中(多维评分) |
我的建议:DORA 和 SRE 成熟度不矛盾,搭配用。DORA 看整体研发效能,SRE 成熟度看 SRE 团队专项能力。如果只能选一个,SRE 团队用 SRE 成熟度模型更聚焦。
CMMI vs SRE 成熟度模型
CMMI 关注的是软件过程改进,5 级分层(初始→已管理→已定义→量化管理→持续优化)。SRE 成熟度模型借鉴了它的分层思路,但评估维度完全不同。
CMMI 评估的是"你写代码的过程规范不规范",SRE 成熟度评估的是"你保障线上系统稳不稳"。如果你的团队同时做开发和运维,CMMI 和 SRE 成熟度可以互补——前者看开发流程,后者看运维能力。
不要为了评估而评估
最后提醒一个常见误区:把成熟度评估做成 KPI 考核工具。
成熟度模型的价值是自检和定位——帮你发现短板、决定下一步投入方向。一旦把它变成 KPI,团队就会为了分数做表面功夫:SLO 覆盖率 100% 但一半是"99% 可用性"这种没意义的指标;Runbook 写了 50 份但没人维护更新。分数上去了,实际能力没变。
我的做法是:评估结果只用于内部复盘和规划,不挂钩绩效考核。团队知道这是帮他们发现问题的工具,不是考核他们的鞭子。这样大家才会诚实打分,评估才有意义。
总结
回到开头的问题:你的 SRE 团队到底行不行?
别凭感觉回答。用 5 级成熟度模型和 6 维量化自检跑一遍,数字会告诉你答案。
几个核心观点:
成熟度是分层递进的,不能跳级。L1 的团队上混沌工程是灾难,L3 的团队还在手动回滚是浪费。先搞清楚自己在哪一级,再决定投什么。
琐事占比是最硬的指标。如果团队 50% 以上的时间在手动操作,不管你装了多少工具、写了多少文档,都是 L1-L2 水平。Google SRE Book 的 50% 上限不是建议,是硬约束。
SLO 是分水岭。没有 SLO 的团队最多是 L2。SLO 落地后,告警、变更、容量规划都有了一个统一的衡量标准,团队才能从"制度驱动"转向"数据驱动"。
L4 已经是头部水平。国内能做到 L4 的团队不多。L5 是理想态,80% 的团队不需要追求 L5——把 L4 做扎实,80% 的故障能通过平台化解决。
成熟度模型是自检工具,不是 KPI。用来发现短板、指导投入方向,不是用来考核团队。一旦挂钩绩效,评估就失真了。
我在多个企业客户落地这套模型后,最常见的反馈是:“以前不知道团队缺什么,现在知道了。“这比任何工具和流程都重要——知道自己在哪里,才知道往哪走。
参考资料与致谢
本文在撰写过程中参考了以下资料,感谢原作者的贡献:
- Site Reliability Engineering — Google SRE Team,SRE 的奠基性著作,本文的琐事占比上限、错误预算、SLI/SLO 等核心概念均源自此书
- SRE Best Practices: The 2026 Playbook — Nova AI Ops,2026 年 SRE 最佳实践综述,提供了自动化 SLO 监控和 burn rate 告警的最新实践参考
- Setting SLOs and Error Budgets That Reduce Burnout — SquareOps,关于 SLO 落地实践和团队疲劳管理的实战经验,本文 On-Call 疲劳治理部分参考了其分析框架
- SRE 体系从理念指标到组织协同的落地实践 — 阿里云开发者社区,提供了 SRE 体系建设的全局视角和 MTBF/MTTR 度量框架参考
- Capability Maturity Model Integration (CMMI) — R. Morales-Fernández 等,CMMI 成熟度模型的学术基础,本文 5 级分层架构的设计灵感来源于此