概述

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% 是一个务实的下限:

  1. 总会有新的 toil:系统不断演进,新的 toil 会不断产生
  2. 自动化本身也需要维护:自动化系统不是一次性的,需要持续维护
  3. 不可预测的故障:总有一些故障需要人工介入
  4. 需要时间学习和调研:新技术评估、架构方案设计需要时间

如何测量 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 偶尔失败,需要手动检查和修复

应对策略:

  1. 自动化系统要有自监控:自动化的任务失败了要有告警
  2. 自动化系统要简洁:过度复杂的自动化系统维护成本可能超过它节省的成本
  3. 定期 review 自动化系统:每季度检查自动化系统是否仍然有效、是否产生了新的 toil

七、Toil 消除的进阶思考

从消除 toil 到消除 toil 的根源

消除 toil 的最高境界不是自动化它,而是消除产生 toil 的根源

toil:每周手动清理磁盘空间
  → 自动化:CronJob 定期清理(治标)
  → 根治:为什么磁盘空间会满?
    → 日志保留策略不合理 → 修复日志轮转策略
    → 日志级别设置过高 → 调整日志级别
    → 磁盘容量不足 → 扩容或使用对象存储

架构层面的 toil 消除

很多 toil 的根源是架构设计问题。从架构层面消除 toil 是最彻底的方式:

Toil 来源架构层解决方案
手动扩缩容无状态设计 + HPA 自动扩缩容
手动故障转移多活架构 + 自动故障转移
手动配置管理声明式配置 + GitOps
手动证书管理cert-manager 自动签发
手动日志清理集中日志 + 自动轮转策略

从 Toil 到 Engineering

SRE 的价值不在于处理了多少工单,而在于消除了多少未来的工单。每一次 toil 消除都应该产出工程价值:

处理一次 toil → 编写自动化脚本 → 沉淀为工具/平台 → 团队共享 → 持续改进
(纯执行)    (个人效率)     (团队效率)     (组织效率)  (长期价值)

这个链条的每一步都让工作从"个人时间节省"升级为"组织能力提升"。

总结

消除 toil 不是一次性的项目,而是持续的工程实践。核心原则:

  1. 识别是前提:用六特征定义判定 toil,用时间追踪量化 toil 比例
  2. 50% 是底线:toil 超过 50% 就是在消耗 SRE 的工程能力,必须采取行动
  3. 自动化是手段:从手动→脚本→定时→条件触发→自愈闭环,逐步提升自动化层次
  4. 根治是目标:不只是自动化 toil,而是消除产生 toil 的根源——架构、流程、设计
  5. 度量是保障:持续追踪 toil 比例和趋势,用数据驱动 toil 治理

一个健康的 SRE 团队应该有这样的特征:系统在增长,团队规模没有线性增长,toil 比例在持续下降,工程师把大部分时间花在设计和建设上,而不是救火上。

记住:如果你每周都在做同样的事,那说明你在做 toil。把重复的工作交给机器,把创造性的工作留给人——这才是 SRE 的价值所在。

参考资料与致谢

本文在撰写过程中参考了以下资料,感谢原作者的贡献:

  1. Google SRE Book - Eliminating Toil — Google SRE 团队,参考了Google SRE Book - Eliminating Toil相关内容