概述
Google SRE Book 中有一条经常被引用的原则:SRE 团队的琐事工作不应超过总工作时间的 50%。这条原则看似简单,但在实践中,很多 SRE 团队的琐事比例远超 50%——有的甚至达到 80% 以上。
为什么 SRE 要如此认真地对待"琐事"?因为琐事是可靠性的隐形杀手:
- 琐事占用大量时间,让工程师没有精力做真正提升可靠性的事
- 琐事通常是手工操作,容易出错,反而引入新的故障
- 琐事导致 burnout,优秀工程师流失
- 琐事无法规模化——系统增长 10 倍,琐事也增长 10 倍
从 toil 的定义与判定、琐事来源分析、自动化消除路径、50% 上限原则、度量与追踪方法到团队实践,详细梳理如何治理事务性工作。
关于 toil 的系统论述,可参考 Google SRE Book - Eliminating Toil。
一、Toil 的定义与判定
什么是 Toil
Google SRE 对 toil 的定义是:
与运行生产服务相关的、手动的、重复的、可自动化的、战术性的、无持久价值的、与服务规模成正比增长的工作。
这个定义包含六个关键特征,缺一不可:
| 特征 | 含义 | 示例 |
|---|---|---|
| 手动的 | 需要人工操作而非自动执行 | 手动扩容、手动清理日志 |
| 重复的 | 不是一次性的,会反复出现 | 每次发布都需要手动修改配置 |
| 可自动化的 | 有明确的规则和步骤,机器能做 | 手动检查磁盘空间并清理 |
| 战术性的 | 被动响应而非主动规划 | 救火式处理告警 |
| 无持久价值的 | 做完之后没有产生可复用的产出 | 手动重启服务(没有改进自愈机制) |
| 与规模成正比 | 系统增长,工作量同步增长 | 每增加一台服务器就需要手动配置一次 |
什么不是 Toil
识别 toil 的同时,也要识别什么不是 toil,避免把有价值的工作误判为琐事:
| 工作 | 是否 Toil | 原因 |
|---|---|---|
| 手动处理一次全新的、复杂的故障 | ❌ 不是 | 不是重复的,需要创造性判断 |
| 编写自动化脚本消除 toil | ❌ 不是 | 有持久价值,是工程工作 |
| 参加 Postmortem 复盘会议 | ❌ 不是 | 有持久价值,驱动系统改进 |
| 日常手动巡检服务器状态 | ✅ 是 | 手动、重复、可自动化 |
| 手动回复"如何配置 XX"的咨询 | ✅ 是 | 重复、可自动化(文档化) |
| 代码 review | ❌ 不是 | 需要人类判断,不可自动化 |
| 手动执行数据库迁移脚本 | ✅ 是 | 可自动化,与规模成正比 |
Toil 判定检查清单
当你不确定某项工作是否是 toil 时,用以下检查清单:
□ 这项工作是手动操作的吗?
□ 这项工作会反复出现(至少每月一次)吗?
□ 这项工作有明确的步骤和规则吗(可以写成文档让另一个人照做)?
□ 做完之后,是否没有产生可复用的产出?
□ 如果系统规模翻倍,这项工作量也会翻倍吗?
→ 5 个"是":明确的 toil,优先消除
→ 3-4 个"是":大概率是 toil,需要评估
→ 0-2 个"是":不是 toil,属于正常工程工作
二、琐事来源分析
七大琐事来源
SRE 团队的 toil 通常来自以下七个方面:
1. 手工运维操作
最常见的 toil 来源。每次操作都需要人介入,既低效又容易出错。
典型场景:
- 手动扩缩容(kubectl scale)
- 手动清理磁盘空间
- 手动重启服务
- 手动修改配置并 reload
- 手动执行数据库备份
自动化方向:HPA 自动扩缩容、CronJob 定期清理、Kubernetes 健康检查自动重启、配置中心热更新、自动化备份脚本。
2. 告警处理
不是所有告警处理都是 toil,但大量低质量告警的处理绝对是。
# 典型的告警 toil 场景
alert_noise:
- alert: DiskUsageHigh
trigger: "磁盘使用率 > 80%"
frequency: "每天 3-5 次"
action: "登录服务器,清理日志,恢复到 60%"
toil_assessment: "完全可自动化 → 自动清理 + 调整告警阈值"
- alert: PodRestarted
trigger: "Pod 重启"
frequency: "每天 10+ 次"
action: "检查日志,确认是 OOM 还是 Liveness probe 失败"
toil_assessment: "部分可自动化 → 自动分类并创建工单"
自动化方向:告警治理(消除噪音告警)、告警自愈(自动执行修复脚本)、告警关联(合并同一故障的多条告警)。
3. 发布部署
手动发布是 SRE 最大的 toil 来源之一。
手动发布流程(纯 toil):
1. 从 Git 拉取代码
2. 构建镜像
3. 推送到镜像仓库
4. 修改 Kubernetes YAML
5. kubectl apply
6. 手动检查服务健康状态
7. 手动通知相关团队
→ 每次发布 30-60 分钟,每周发布 5-10 次
自动化方向:CI/CD 流水线(Jenkins/GitHub Actions/ArgoCD)、GitOps 自动同步、发布后自动化健康检查。
4. 证书与密钥管理
证书过期是一个经典的 toil 陷阱——不经常发生,但每次发生都很紧急。
典型场景:
- TLS 证书过期导致服务不可用
- 紧急更新证书,涉及多个服务
- API Key 轮换
- 数据库密码修改
自动化方向:cert-manager 自动证书管理、密钥管理服务(HashiCorp Vault)、证书过期告警(提前 30 天)。
5. 容量管理
手动容量规划随着系统规模增长会变成巨大的 toil。
典型场景:
- 每周检查各服务资源使用率
- 手动调整 requests/limits
- 手动申请新机器
- 手动配置负载均衡
自动化方向:HPA/VPA 自动调整资源、Cluster Autoscaler 自动扩节点、基于历史数据的容量预测。
6. 依赖升级与补丁管理
安全补丁、依赖升级是持续性的 toil。
典型场景:
- 每月安全补丁更新
- 基础镜像 CVE 修复
- 依赖库版本升级
- Kubernetes 版本升级
自动化方向:依赖扫描自动化(Trivy/Grype)、基础镜像自动更新(Renovate/Dependabot)、滚动升级自动化。
7. 文档与知识传递
重复回答相同问题是隐性的 toil。
典型场景:
- "如何查看 XX 服务的日志?"(被问 10 次/月)
- "如何配置 XX 的告警?"(被问 5 次/月)
- "XX 服务怎么部署?"(被问 8 次/月)
- 新人入职培训,重复讲解相同的流程
自动化方向:Runbook 文档化、内部知识库、自动化 FAQ 机器人、新人入职文档。
琐事来源统计
在一个典型的 SRE 团队中,toil 的分布大致如下:
琐事来源分布(示例):
┌─────────────────────────────────────────┐
│ 告警处理 35% ██████████████ │
│ 手工运维 25% ██████████ │
│ 发布部署 15% ██████ │
│ 证书密钥 10% ████ │
│ 容量管理 8% ███ │
│ 依赖升级 4% ██ │
│ 文档咨询 3% █ │
└─────────────────────────────────────────┘
不同团队的分布会有差异,但告警处理和手工运维通常占据前两位。这也是自动化投入 ROI 最高的领域。
三、自动化消除路径
自动化的层次
消除 toil 不是一蹴而就的,而是分层次逐步推进:
| 层次 | 特征 | 示例 | 人的角色 |
|---|---|---|---|
| L1 手动执行 | 全程人工操作 | 手动 SSH 到服务器清理日志 | 执行者 |
| L2 脚本辅助 | 有脚本但需人工触发 | 运行清理脚本,人工确认结果 | 触发者+验证者 |
| L3 定时自动 | 定时自动执行,人工监控 | CronJob 定期清理,告警监控 | 监控者 |
| L4 条件触发 | 基于条件自动触发 | 磁盘 >80% 自动触发清理 | 异常处理者 |
| L5 自愈闭环 | 自动检测→决策→执行→验证 | 自动检测异常→诊断→修复→验证 | 改进者 |
每提升一个层次,人的参与度就降低一个级别。目标是把人从"执行者"逐步提升到"改进者"——人不再做重复操作,而是优化自动化系统本身。
自动化消除的决策框架
不是所有 toil 都值得自动化。需要评估 ROI:
自动化 ROI = (节省时间 × 频率 × 预期使用期) / 自动化开发成本
示例:
任务:手动清理磁盘空间
节省时间:每次 15 分钟
频率:每周 3 次
预期使用期:12 个月
自动化开发成本:4 小时
ROI = (15min × 3 × 52周) / (4h × 60min) = 2340 / 240 = 9.75
→ ROI 接近 10,强烈建议自动化
自动化优先级矩阵:
| 高频率 | 低频率 | |
|---|---|---|
| 高耗时 | 🔴 优先自动化 (手动扩容、手动发布) | 🟡 值得自动化 (季度容量评估) |
| 低耗时 | 🟡 值得自动化 (告警确认、日志查询) | 🟢 暂不自动化 (年度架构评审) |
自动化实施步骤
以"手动磁盘清理"为例,展示从 toil 到自动化的完整路径:
Step 1:记录手动操作步骤
# 当前手动流程
ssh prod-server-01
du -sh /var/log/*
rm -rf /var/log/app/*.log.2025*
find /tmp -type f -mtime +7 -delete
df -h | grep /var
Step 2:封装为脚本
#!/bin/bash
# disk_cleanup.sh - 磁盘空间自动清理
# Usage: ./disk_cleanup.sh [threshold]
THRESHOLD=${1:-80}
LOG_DIR="/var/log/app"
TMP_RETENTION_DAYS=7
current_usage=$(df /var | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$current_usage" -lt "$THRESHOLD" ]; then
echo "Disk usage ${current_usage}% below threshold ${THRESHOLD}%, no action needed."
exit 0
fi
echo "Disk usage ${current_usage}% exceeds threshold ${THRESHOLD}%, starting cleanup..."
# 清理旧日志
find "$LOG_DIR" -name "*.log" -mtime +7 -delete
echo "Cleaned logs older than 7 days in $LOG_DIR"
# 清理临时文件
find /tmp -type f -mtime +${TMP_RETENTION_DAYS} -delete
echo "Cleaned /tmp files older than ${TMP_RETENTION_DAYS} days"
# 清理后检查
new_usage=$(df /var | tail -1 | awk '{print $5}' | tr -d '%')
echo "Cleanup complete. Disk usage: ${current_usage}% → ${new_usage}%"
if [ "$new_usage" -gt "$THRESHOLD" ]; then
echo "WARNING: Disk usage still above threshold after cleanup!"
exit 1
fi
Step 3:定时自动执行
# Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: disk-cleanup
namespace: production
spec:
schedule: "0 */6 * * *" # 每6小时执行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: cleanup
image: busybox:latest
command: ["/bin/bash", "/scripts/disk_cleanup.sh", "75"]
volumeMounts:
- name: log-volume
mountPath: /var/log/app
- name: script-volume
mountPath: /scripts
volumes:
- name: log-volume
persistentVolumeClaim:
claimName: log-pvc
- name: script-volume
configMap:
name: cleanup-scripts
restartPolicy: OnFailure
Step 4:条件触发(告警驱动)
# Prometheus AlertManager 触发自动清理
- alert: DiskSpaceHigh
expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 80
for: 5m
labels:
severity: warning
auto_remediate: true
annotations:
description: "Disk usage on {{ $labels.instance }} is {{ $value }}%"
remediation: "disk_cleanup"
# 自动修复 Webhook 接收告警并触发清理
@app.route('/webhook', methods=['POST'])
def handle_alert():
alert = request.json['alerts'][0]
if alert['labels'].get('auto_remediate') == 'true':
remediation = alert['annotations'].get('remediation')
instance = alert['labels']['instance']
if remediation == 'disk_cleanup':
# 触发清理 Job
kubectl_run_job(f'disk-cleanup-{instance}', 'cleanup-image',
['disk_cleanup.sh', '75'])
log.info(f'Triggered disk cleanup on {instance}')
return jsonify({'status': 'ok'})
Step 5:自愈闭环
最终的自动化不只是"执行清理",而是完整的闭环:
检测(磁盘 > 80%)
→ 诊断(哪个目录占用最多?是日志还是数据?)
→ 决策(日志可以清理,数据不能清理)
→ 执行(清理日志)
→ 验证(磁盘是否降到阈值以下?)
→ 记录(记录清理事件供审计)
→ 告警(如果清理后仍然高,告警人工介入)
自动化的风险控制
自动化不是万能药,糟糕的自动化比手动操作更危险——因为它更快、更一致地制造错误。
自动化安全清单:
automation_safety_checklist:
- idempotent: true # 操作是幂等的,重复执行不会有副作用
- bounded_blast_radius: true # 限制影响范围(一次只清理一个节点)
- rollback_capable: true # 有回滚机制
- dry_run: true # 支持试运行模式
- audit_logged: true # 所有自动操作有审计日志
- rate_limited: true # 有频率限制,防止自动化失控
- human_override: true # 人类可以随时中断
# 自动化操作的安全封装
class SafeAutomation:
def __init__(self, service, max_blast_radius=1, dry_run=False):
self.service = service
self.max_blast_radius = max_blast_radius
self.dry_run = dry_run
def execute(self, action, targets):
# 1. 限制影响范围
if len(targets) > self.max_blast_radius:
raise Exception(f"Targets ({len(targets)}) exceed max blast radius "
f"({self.max_blast_radius})")
# 2. 记录审计日志
audit_log(action, targets, self.dry_run)
# 3. 试运行模式
if self.dry_run:
log.info(f"[DRY RUN] Would execute {action} on {targets}")
return {"status": "dry_run", "action": action, "targets": targets}
# 4. 执行操作
result = self._do_action(action, targets)
# 5. 验证结果
if not self._verify(action, targets, result):
log.error(f"Verification failed for {action}, initiating rollback")
self._rollback(action, targets)
raise Exception(f"Action {action} verification failed, rolled back")
return result
四、50% 琐事上限原则
原则的含义
Google SRE 的 50% 原则:
SRE 团队花在 toil 上的时间不应超过总工作时间的 50%。另外 50% 应该用于工程工作——自动化、工具开发、可靠性改进、容量规划等。
这个原则不是随便定的数字,而是一个资源分配约束:
- 如果 toil 超过 50%,说明系统设计或运维流程有根本性问题
- 如果 toil 超过 50%,SRE 就退化成了传统运维——只做执行不做改进
- 50% 的工程时间是 SRE 区别于传统运维的关键保障
为什么是 50% 而不是更低
理想的 toil 比例当然是越低越好,但 50% 是一个务实的下限:
- 总会有新的 toil:系统不断演进,新的 toil 会不断产生
- 自动化本身也需要维护:自动化系统不是一次性的,需要持续维护
- 不可预测的故障:总有一些故障需要人工介入
- 需要时间学习和调研:新技术评估、架构方案设计需要时间
如何测量 toil 比例
测量 toil 比例是管理的前提。以下是三种测量方法:
方法一:时间追踪
# 每周时间统计
weekly_time_tracking:
toil:
alert_handling: 6h # 告警处理
manual_ops: 4h # 手工运维
deployment: 3h # 发布部署
cert_management: 1h # 证书管理
user_support: 2h # 用户支持
total: 16h
engineering:
automation_dev: 8h # 自动化开发
tooling: 4h # 工具开发
capacity_planning: 3h # 容量规划
documentation: 2h # 文档编写
postmortem: 3h # 复盘
total: 20h
toil_ratio: 16 / (16 + 20) = 44%
方法二:工单分类
# 从工单系统自动统计 toil 比例
def calculate_toil_ratio(team, week):
tickets = query_tickets(team=team, week=week)
toil_categories = [
"manual_ops", "alert_handling", "deployment",
"cert_renewal", "user_support", "routine_maintenance"
]
engineering_categories = [
"automation", "tooling", "capacity_planning",
"documentation", "postmortem", "research"
]
toil_hours = sum(t.hours for t in tickets if t.category in toil_categories)
eng_hours = sum(t.hours for t in tickets if t.category in engineering_categories)
return toil_hours / (toil_hours + eng_hours)
方法三:On-Call 报告
# On-Call 周报模板 - Toil 统计
## 本周 On-Call 统计
- 告警总数:47
- 需人工介入:12(26%)
- 平均处理时间:18 分钟
- 总 On-Call 耗时:3.6 小时
## Toil 分类
- 手动重启服务:3 次,耗时 45 分钟
- 手动扩容:2 次,耗时 30 分钟
- 配置修改:4 次,耗时 60 分钟
- 告警确认(无需操作):3 次,耗时 15 分钟
## 可自动化项
- [ ] 手动重启 → Kubernetes 健康检查自愈
- [ ] 手动扩容 → HPA 自动扩缩容
- [ ] 配置修改 → 配置中心热更新
超过 50% 时的行动方案
当 toil 比例持续超过 50% 时,需要采取系统性行动:
toil_reduction_plan:
trigger: "toil_ratio > 50% for 2 consecutive weeks"
actions:
1_freeze:
description: "冻结非紧急的工程工作,集中精力消除 toil"
duration: "1-2 周"
2_audit:
description: "全面审计 toil 来源,按耗时排序"
output: "toil 热力图"
3_prioritize:
description: "选择 ROI 最高的 toil 项优先自动化"
criteria: "耗时 × 频率 / 自动化成本"
4_escalate:
description: "如果 toil 持续超标,升级到管理层"
message: "toil 比例持续超过 50%,说明系统设计或流程存在结构性问题,
需要管理层投入资源解决"
5_root_cause:
description: "对 toil 超标的根因做分析"
common_causes:
- "系统架构设计不合理,运维复杂度高"
- "监控告警质量差,噪音告警多"
- "自动化覆盖不足,大量操作靠人工"
- "团队人手不足"
- "新系统上线未考虑运维成本"
五、度量与追踪方法
Toil 度量指标
| 指标 | 定义 | 目标 |
|---|---|---|
| Toil 比例 | toil 时间 / 总工作时间 | < 50% |
| Toil 绝对时长 | 每周 toil 总小时数 | 逐月下降 |
| 告警人工介入率 | 需人工处理的告警 / 总告警 | < 30% |
| 自动化覆盖率 | 已自动化的操作 / 总操作 | > 80% |
| 重复工单率 | 重复类型的工单 / 总工单 | 逐月下降 |
| MTTR(手动部分) | 故障修复中人工操作耗时 | 逐月缩短 |
Toil 追踪看板
# 月度 Toil 追踪看板
toil_dashboard:
period: "2026-07"
team: "SRE Platform"
summary:
toil_ratio: 38% # ↓ from 45% last month
toil_hours: 60h # ↓ from 72h
engineering_hours: 98h
target: "<50%"
status: "🟢 on track"
toil_breakdown:
alert_handling: 20h # 33% of toil
manual_ops: 15h # 25%
deployment: 12h # 20%
cert_management: 5h # 8%
user_support: 5h # 8%
other: 3h # 6%
automation_progress:
- item: "磁盘自动清理"
status: "completed"
toil_eliminated: "4h/week"
- item: "告警自动分类"
status: "in_progress"
estimated_savings: "3h/week"
- item: "证书自动续期"
status: "planned"
estimated_savings: "2h/week"
trend:
- month: "2026-04"
toil_ratio: 58%
- month: "2026-05"
toil_ratio: 52%
- month: "2026-06"
toil_ratio: 45%
- month: "2026-07"
toil_ratio: 38%
定期 Toil 审计
建议每季度做一次全面的 toil 审计:
# 季度 Toil 审计模板
## 审计范围
- 时间范围:2026 Q2
- 参与人员:全体 SRE 团队成员
## Toil 清单
| # | Toil 描述 | 频率 | 单次耗时 | 月度总耗时 | 可自动化 | 优先级 |
|---|---------|------|---------|-----------|---------|--------|
| 1 | 手动清理磁盘空间 | 3次/周 | 15min | 180min | ✅ 是 | P0 |
| 2 | 手动确认告警 | 10次/天 | 3min | 600min | ✅ 是 | P0 |
| 3 | 手动发布部署 | 3次/周 | 45min | 540min | ✅ 是 | P0 |
| 4 | 证书更新 | 1次/季 | 120min | 40min | ✅ 是 | P1 |
| 5 | 手动巡检报表 | 1次/天 | 30min | 900min | ✅ 是 | P1 |
| 6 | 新人入职培训 | 1次/季 | 240min | 80min | 部分 | P2 |
## 消除计划
- Q3 目标:消除 #1、#2、#3,预计减少 toil 22h/月
- Q4 目标:消除 #4、#5,预计减少 toil 12h/月
六、团队实践
建立"Toil 零容忍"文化
不是说要立刻消除所有 toil,而是建立一种态度:每发现一个 toil,就记录下来并制定消除计划。
日常实践:
- 遇到 toil 时,先在工单系统中记录
- 如果 5 分钟能自动化,立即做
- 如果需要更多时间,加入 backlog
- 每周 review 新增的 toil 项
- 每季度做 toil 审计
“Toil Tuesday” 实践
一些团队设立固定的 toil 消除时间:
toil_tuesday:
schedule: "每周二下午 2 小时"
rules:
- "这段时间不做日常 toil"
- "专注消除一个 toil 项"
- "可以个人做,也可以组队做"
- "完成后更新追踪看板"
examples:
- "把手动告警确认改为自动分类脚本"
- "把手动发布改为半自动化流水线"
- "把 FAQ 写成文档"
新人 Onboarding 与 toil
新人入职时,往往会接手一些 toil 工作。正确的做法是:
错误做法:
新人入职 → 分配日常 toil → 新人成为 toil 执行者 → 新人 burnout
正确做法:
新人入职 → 分配日常 toil(熟悉系统)
→ 同时要求新人在 1 个月内将其中一项 toil 自动化
→ 新人既熟悉了系统,又贡献了自动化改进
防止"自动化产生的 toil"
自动化系统本身也可能成为新的 toil 来源:
原始 toil:手动清理磁盘(每周 3 次,每次 15 分钟)
自动化后:CronJob 自动清理
新的 toil:CronJob 偶尔失败,需要手动检查和修复
应对策略:
- 自动化系统要有自监控:自动化的任务失败了要有告警
- 自动化系统要简洁:过度复杂的自动化系统维护成本可能超过它节省的成本
- 定期 review 自动化系统:每季度检查自动化系统是否仍然有效、是否产生了新的 toil
七、Toil 消除的进阶思考
从消除 toil 到消除 toil 的根源
消除 toil 的最高境界不是自动化它,而是消除产生 toil 的根源:
toil:每周手动清理磁盘空间
→ 自动化:CronJob 定期清理(治标)
→ 根治:为什么磁盘空间会满?
→ 日志保留策略不合理 → 修复日志轮转策略
→ 日志级别设置过高 → 调整日志级别
→ 磁盘容量不足 → 扩容或使用对象存储
架构层面的 toil 消除
很多 toil 的根源是架构设计问题。从架构层面消除 toil 是最彻底的方式:
| Toil 来源 | 架构层解决方案 |
|---|---|
| 手动扩缩容 | 无状态设计 + HPA 自动扩缩容 |
| 手动故障转移 | 多活架构 + 自动故障转移 |
| 手动配置管理 | 声明式配置 + GitOps |
| 手动证书管理 | cert-manager 自动签发 |
| 手动日志清理 | 集中日志 + 自动轮转策略 |
从 Toil 到 Engineering
SRE 的价值不在于处理了多少工单,而在于消除了多少未来的工单。每一次 toil 消除都应该产出工程价值:
处理一次 toil → 编写自动化脚本 → 沉淀为工具/平台 → 团队共享 → 持续改进
(纯执行) (个人效率) (团队效率) (组织效率) (长期价值)
这个链条的每一步都让工作从"个人时间节省"升级为"组织能力提升"。
总结
消除 toil 不是一次性的项目,而是持续的工程实践。核心原则:
- 识别是前提:用六特征定义判定 toil,用时间追踪量化 toil 比例
- 50% 是底线:toil 超过 50% 就是在消耗 SRE 的工程能力,必须采取行动
- 自动化是手段:从手动→脚本→定时→条件触发→自愈闭环,逐步提升自动化层次
- 根治是目标:不只是自动化 toil,而是消除产生 toil 的根源——架构、流程、设计
- 度量是保障:持续追踪 toil 比例和趋势,用数据驱动 toil 治理
一个健康的 SRE 团队应该有这样的特征:系统在增长,团队规模没有线性增长,toil 比例在持续下降,工程师把大部分时间花在设计和建设上,而不是救火上。
记住:如果你每周都在做同样的事,那说明你在做 toil。把重复的工作交给机器,把创造性的工作留给人——这才是 SRE 的价值所在。
参考资料与致谢
本文在撰写过程中参考了以下资料,感谢原作者的贡献:
- Google SRE Book - Eliminating Toil — Google SRE 团队,参考了Google SRE Book - Eliminating Toil相关内容