想象你是一栋写字楼的物业经理。每月第三个周二的下午三点,警报准时响起,橙色烟雾从三楼机房飘出,几百名员工沿着安全通道有序撤离。你掐着秒表:全员撤离用了 2 分 40 秒,比上个月快了 15 秒。没有火灾,没有惊慌,只有一场精心策划的消防演习。 这栋楼每个月都「故意」放一次火——不是闲得慌,而是为了验证:如果明天真的着了火,疏散通道是否畅通、消防警报是否灵敏、应急照明是否亮起。等真火灾发生的那天,图纸上的逃生路线才第一次被考验,就太晚了。 混沌工程,就是软件世界的消防演习。它主动往运行中的 AI 服务里注入故障——杀掉一个节点、切断一段网络、耗尽一块磁盘——然后观察系统是否还能扛住,把所有「纸面韧性」提前变成「验证过的韧性」。本文将从六个方面展开:混沌工程的来龙去脉、如何先定义「正常」、故障注入有哪些类型、工具怎么选、如何自动化编排,以及如何用实验报告驱动改进闭环。
对 AI 从业者而言,混沌工程是把「系统应该可靠」变成「系统被证明可靠」的必修课——掌握它,你就能像老练的物业经理一样,在大促、突发流量和发布事故的「修罗场」上从容备战。这是 MLOps 与 SRE 岗位的核心竞争力。
可视化演示
演示通过主动注入故障验证系统容错与恢复能力,覆盖故障设计、注入、观测、恢复与韧性分析的完整闭环。
本节配有交互动效(进入视口后自动加载,约 3KB)。
韧性验证闭环 故障设计 注入触发 观测指标 自动恢复 韧性分析 主动注入验证容错
混沌工程缘起
为什么物业经理要每月「自导自演」一场火灾?因为他曾经在一个真实的傍晚发现,三楼防火门被杂物堵死——如果那天真有火,全楼人都会为这扇门买单。从此他决定:与其等火灾来检验,不如自己先「放火」。2011 年,Netflix 也做了同样的决定。他们发现,测试环境里跑得好好的系统,一到生产环境就「一碰就碎」,于是写了一个叫 Chaos Monkey 的程序,在机房里随机终止 EC2 实例——真的往集群里放了一只搞破坏的「猴子」。
这场「放火」很快演变成一门严谨的学科。混沌工程(Chaos Engineering)的定义是:通过对系统进行受控实验,主动注入故障,从而建立对系统承受异常冲击能力的信心。它有三个核心要素:先提出假设——「系统在某个故障下仍然正常」;再实施破坏——注入对应的故障;最后验证结果——对照假设判断系统是否扛住了。它和传统测试有本质区别:传统测试是正向验证「功能该正常时是否正常」,混沌实验是反向验证「坏掉的时候还能不能撑住」。前者像检查灭火器是否在有效期,后者则像真的点一把火,看大家会不会跑。
韧性文化的建设也由此而来。在 Netflix 的经验里,实验结束后绝不追责「谁让系统挂了」,而是追问「系统为什么没有扛住」。这就像演习后的复盘会,重点不是骂跑得慢的人,而是发现哪条通道被堵了。
演习练得越多,真火来临时越镇定;故障模式验证得越全,系统韧性覆盖率越高,团队就越敢对业务方拍胸脯:「这个系统,扛得住。」
- 分子含义$N_{\text{已验证}}$ 表示已经通过混沌实验验证过的故障模式数量,例如「节点宕机」「网络抖动」「磁盘写满」各算一种已演练的剧本。
- 分母含义$N_{\text{全部}}$ 表示系统可能面临的全部故障模式总数,把这份清单列全,本身就能帮团队看清风险全貌。
- 商与百分化两者相除再乘以 100%,得到 0% 到 100% 的覆盖率,用来度量「演习练到了什么程度」。
稳态假设先行
演习开始前,物业经理会先立一份「军令状」:警报响起后 3 分钟内全员到达集合点、全程无拥堵、无人员受伤。没有这份标准,演习结束你根本无法回答「这次演习算成功还是失败」。混沌工程同理——动手搞破坏之前,必须先把「系统正常」定义清楚,这就是稳态假设(Steady-State Hypothesis)。
稳态假设是一组可量化的指标描述,通常来自服务的 SLO(服务水平目标):错误率低于 0.1%、P99 延迟低于 500 毫秒、吞吐量不低于每秒 1 万请求。就像消防演习看「撤离时间」和「受伤人数」,混沌实验看的是这些指标在故障注入前后是否「破防」。选择哪些指标很有讲究,业界常用 RED 法(速率、错误、持续时间)或 USE 法(利用率、饱和度、错误)来圈定关键信号,千万别拿「CPU 高不高」这种与用户体验脱节的指标当唯一标准。
实验中还要引入对照组。想象演习时让一半员工走东楼梯、一半走西楼梯,你才能对比出哪条路真出了问题。混沌实验通常会把流量或实例划分成实验组与对照组:只对实验组注入故障,然后观察两组指标的差异——这样就能把「故障造成的影响」和「系统本身的正常波动」区分开。实验开始前还必须做前置条件验证:监控没有盲区、告警通道畅通、备份可用、回滚开关就位。这就像演习前要确认广播能响、门锁能开、担架在位,否则演习本身就是一场事故。最后设定判定标准:实验组与对照组的偏差落在什么范围内算通过。
没有「3 分钟撤离」的标准,演习就是走过场;没有稳态假设和阈值,混沌实验就是瞎折腾——数据一堆,结论为零。
- 错误率之差$\mathrm{Err}_{\text{实验}}$ 是实验组(被注入故障的那部分流量)的错误率,$\mathrm{Err}_{\text{对照}}$ 是没受干扰的对照组错误率,两者相减得到故障带来的「额外伤害」。
- 取绝对值$|\cdot|$ 保证无论实验组是变好还是变坏,我们只关注偏离程度的大小,就像只关心撤离时间偏离标准多少,不关心是快是慢。
- 阈值判定$\epsilon$ 是事先写进军令状里的容忍度(如 0.1%)。偏差小于等于它,演习通过;大于它,说明系统在故障面前「露了怯」。
故障注入设计
消防演习的剧本从来不会只有一个。堵住左侧楼梯(模拟疏散通道堵塞)、让电梯停运(模拟断电)、关掉喷淋系统(模拟消防设施失效),每个剧本都暴露建筑不同侧面的弱点。混沌工程的故障注入(Fault Injection)同样是按剧本分类设计的,常见的类型有四类。
第一类,基础设施故障。杀掉一台服务器、把磁盘写满、打满 CPU、耗尽内存。这类故障模拟的是「机房断电」「机器被回收」「资源被邻居抢走」的真实场景,好比演习中让某个房间的门打不开。第二类,网络异常。注入延迟、丢包、乱序、甚至把两个服务之间的网络完全切断(网络分区)。这对应「光缆被挖断」「跨机房专线抖动」——如果说杀节点是「封门」,那网络故障就是「把走廊变得又长又滑」。第三类,应用进程故障。直接 kill 掉应用进程、让依赖接口超时、抛异常、耗尽连接池。它模拟的是「代码写崩了」「依赖服务拖后腿」这类日常事故。第四类,数据层故障。模拟主从延迟、锁竞争、甚至数据损坏,检验的是「数据这个地基歪了,楼还能不能站住」。
设计注入时,有一个重要的工程概念叫注入强度:同样的故障,影响范围多大、持续多久、波及多少比例的流量,决定了这场演习的「火力等级」。就像演习可以只在三楼放烟,也可以全楼联动;第一次做实验,建议先从最小火力开始。
剧本越贴近真实火场,演习越有价值;故障类型越贴合线上真实风险,混沌实验的结论就越有说服力。
- 持续时长占比$\frac{D_{\text{故障}}}{T_{\text{窗口}}}$ 表示故障持续的时间占整个实验观察窗口的比例,好比烟雾弹在演习中「烧」了多久。
- 影响比例因子$R_{\text{比例}}$ 表示被故障波及的节点或流量占总量的比例,比如 10% 的实例被杀死,对应演习中只封锁一个房间。
- 两者相乘把时间占比与影响比例乘起来,就得到一个 0 到 1 之间的火力值——它越小越安全,越大越接近「真火灾」。
工具选型策略
灭火器分很多种:干粉的、二氧化碳的、泡沫的、水基的——油锅起火不能浇自来水,电气火灾不能用泡沫。物业经理的库房里一定按火源类型备齐了不同的灭火器。混沌工程也一样,市面上的工具各有脾气,选对工具比选贵的工具重要得多。
入门级代表是 Netflix 的 Chaos Monkey 及其兄弟姐妹:Chaos Monkey 随机终止实例,Chaos Kong 模拟整个区域不可用,Latency Monkey 注入延迟。它们简单直接,适合团队理解混沌工程的基本玩法。云原生时代的主力是 Chaos Mesh 和 Litmus:Chaos Mesh 是 Kubernetes 原生的故障注入平台,用声明式 CRD 定义实验,覆盖网络、磁盘、进程、时间等丰富的故障类型;Litmus 则提供了实验市场 ChaosHub,能把现成的实验模板拿来即用,还自带实验报告。企业级商业方案如 Gremlin 则主打「安全」:细粒度的爆炸半径控制、一键熔断、审计日志,适合对合规和风控要求极高的场景。
选型时,业界最看重的一个机制是爆炸半径控制。这好比演习前给所有消防通道上了自动门禁:实验只能影响指定的几个实例,一旦指标异常,系统自动中止实验并回滚。爆炸半径控制通常包含三个手段:目标白名单(只能打预先批准的服务)、流量比例上限(最多影响 5% 的请求)、自动熔断开关(误伤面扩大时立刻叫停)。另一个关键决策是是否在生产环境验证:预发环境永远复现不了生产环境的真实流量和真实依赖,所以成熟团队往往是「预发先试,生产复验」,用最小爆炸半径在生产环境积累信心。最终选型可以用加权评分来决策。
精明的物业经理不会只买一种灭火器,聪明的团队也不会只押注一款混沌工具——按场景取用,按风险定价,才是成熟的做法。
- 维度得分$c_i$ 表示第 $i$ 个评估维度的得分(如故障类型覆盖度打 8 分),等价于给某款灭火器的单项能力打分。
- 权重因子$w_i$ 表示该维度的重要程度,权重之和通常为 1;对金融系统,「安全机制」的权重就该压过「免费开源」。
- 加权求和$\sum_{i=1}^{n} w_i c_i$ 把各维度得分加权累加,得到总分 S,作为选型会议的讨论基准。
自动化编排
靠人记忆做消防演习,上个月还信誓旦旦,这个月一忙就忘了。所以正规大楼的演习是「排进日历的」:每月第几周几点拉响警报,自动触发广播,自动联动门禁,自动统计撤离人数。混沌工程要想持之以恒,也必须走自动化编排这条路,把「触发→执行→清理→通知」整条链路变成无人值守的例行公事。
定时触发是最基本的编排:用 Cron 或调度平台设定每周三凌晨、业务低谷期自动发起实验,风暴再大也不影响用户。更进一步,把混沌实验嵌进 CI/CD 流水线:每次发布完成后,自动跑一轮「冒烟级」混沌实验——注入 1% 流量的网络延迟,观察错误率是否超标——不合格就直接拦截上线。这就像新员工入职第一天就参加消防培训,而不是等出了事才补课。
自动化编排中最容易被忽略也最致命的一环是故障自动清理。实验总有意外:注入的故障收不回来、清理脚本自己挂了、运维同学正在睡觉。所以平台必须提供「超时强制恢复」机制——实验开始时倒计时,无论结果如何,时间一到自动把系统恢复原状。这相当于给演习装了自动喷淋和自动复位装置。最后是告警与通知:实验期间产生的告警要标记为「实验已知」,避免值班同学误判为真故障而半夜爬起来;实验失败则要升级通知到负责人,并把现场数据打包发送,供后续分析。
好的自动化编排,就像大楼里的声光报警加自动喷淋系统:人不在场,它也在替你守护;而每一次「自动点火、自动灭火」,都在悄悄积累系统的韧性底气。
- 注入阶段$T_{\text{注入}}$ 是故障从开始注入到完全生效的时间,对应烟雾弹从引爆到烟雾弥漫的过程。
- 观察阶段$T_{\text{观察}}$ 是保持故障状态、采集指标的时间窗口,太短看不出影响,太长则放大风险。
- 清理阶段$T_{\text{清理}}$ 是把系统恢复到故障前状态的时间,自动化平台通常给它设定超时上限,超时就强制重启恢复——这是安全的最后一道保险。
韧性度量闭环
演习结束不是终点,而是复盘的起点。物业经理会把当天的数据贴进会议室:总撤离时间、各楼梯通过率、哪个转角拥堵了 40 秒、谁没听到广播。然后开整改单——加装应急指示灯、清理杂物、调整集合点——下个月再演一遍,验证整改是否生效。混沌工程同样讲究韧性度量闭环:实验、分析、改进、再验证,循环往复,永不毕业。
支撑闭环的是一组韧性关键指标。MTTD(平均发现时间)衡量「出了故障多久才被我们发现」,对应演习中「警报响了多久才有人反应过来」;MTTR(平均恢复时间)衡量「故障发生后多久恢复」,对应「从冒烟到扑灭用了多久」。除此之外,实验通过率、故障注入覆盖率、恢复期间的错误率是否突破 SLO,都应记录在案。实验结束后要生成报告,按「现象→影响面→根因→改进建议」四段式沉淀:这个故障暴露了什么、影响了几成用户、根因是配置错误还是架构缺陷、下一轮迭代改什么。然后落地改进措施——可能是调整超时参数、给关键路径加缓存、增加跨可用区冗余,也可能是修改限流阈值——总之把报告上的「建议」变成产品里的「配置」。
最后一步是迭代复验:带着同样的剧本再来一轮实验,看改进是否真的生效。韧性的提升不是一条直线,而是随着每一次发版、每一次扩容不断波动,所以指标要持续跟踪,形成趋势图。就像物业经理把每月的演习数据贴在墙上,十二个月连成一条曲线——哪个月退步了,一眼就能看出来。
消防手册越改越厚,但每一页都是用演习踩出来的教训写成的;系统的韧性同样不是一次实验测出来的,而是一轮轮「放火—复盘—整改—再放火」改出来的。
- 单次恢复时长$t_{\text{恢复},i} - t_{\text{故障},i}$ 表示第 $i$ 次故障从发生到恢复的耗时,好比每次演习从冒烟到扑灭的用时。
- 求和累加$\sum_{i=1}^{n}$ 把 n 次故障的恢复耗时全部加起来,对应把一年的演习时间记录汇总成一本台账。
- 取平均值$\frac{1}{n}$ 除以故障次数,得到平均恢复时间。MTTR 越低,说明系统越「皮实」,也说明前几轮实验的整改真的管用了。
AI 应用场景
大模型推理网关故障注入演练
阶段:模型部署与运维(MLOps)
解决的问题:大模型推理成本高、GPU 节点少,单节点故障就可能导致线上服务大面积超时。传统做法是祈祷「别宕机」,从未验证过网关的超时、重试、降级链路是否真的生效。混沌实验定期在推理网关下游注入节点宕机和延迟,把「祈祷」变成「验证过的确定性」。
具体案例:某对话式 AI 产品每天数百万请求经过推理网关分发到 8 个 GPU Pod。团队每月凌晨在其中一个 Pod 上注入「网络黑洞」2 分钟,观察 P99 延迟变化。第一次实验就发现客户端重试风暴差点打垮网关;优化重试退避策略后,第二次实验 P99 从 1.2 秒降到了 400 毫秒——一次演习,救了一场未来的事故。
推荐系统特征数据链路韧性测试
阶段:特征工程与数据管道
解决的问题:推荐系统强依赖实时特征管道(Kafka → Flink → 特征存储),管道抖动会导致特征缺失、模型效果退化。通过在 Kafka 消费端注入消费延迟,可以验证特征兜底策略和新鲜度告警是否真的生效。
具体案例:某电商推荐团队在特征管道上注入 60 秒消费延迟,发现 CTR 下跌了 8%,而且没有任何告警弹出。事后他们为特征新鲜度增加了监控,并实现了「用上一周期特征兜底」的降级逻辑;第二轮实验,同样的故障下 CTR 跌幅被控制在 0.5% 以内。
分布式训练集群容错演练
阶段:模型训练
解决的问题:大模型训练常使用抢占式实例,节点随时可能被云平台回收。若不提前验证 checkpoint 保存与弹性调度能力,一次节点回收可能导致数小时训练白跑——相当于整栋楼演习,却发现消防水箱是空的。
具体案例:某训练平台团队每周随机终止一个训练 Worker,验证自动重启、进度恢复与 checkpoint 频率。演练倒逼团队把 checkpoint 间隔从 30 分钟缩短到 5 分钟,单次节点故障造成的训练回退从 40 分钟降到 8 分钟。
Python 演示
"""混沌实验迷你框架:注入故障、测量稳态、验证恢复。"""import random class Service: """模拟带降级缓存的微服务。""" def __init__(self, name, error_rate, fallback_rate=0.001): self.name = name self.error_rate = error_rate self.fallback_rate = fallback_rate def request(self): if random.random() < self.error_rate: # 主链路故障时走降级缓存 if random.random() < self.fallback_rate: return "error" return "ok(fallback)" return "ok" def measure_error_rate(service, samples=2000): """返回抽样错误率,相当于拍摄稳态快照。""" errors = 0 for _ in range(samples): if service.request() == "error": errors += 1 return errors / samples def chaos_experiment(service, fault_rate, baseline_rate, max_delta): """执行一轮混沌实验,返回是否通过及各阶段指标。""" baseline = measure_error_rate(service) # 1. 记录稳态基线 service.error_rate = fault_rate # 2. 注入故障 during = measure_error_rate(service) # 3. 观察实验组表现 service.error_rate = baseline_rate # 4. 清理故障自动恢复 recovered = measure_error_rate(service) # 5. 验证恢复状态 passed = (during - baseline) <= max_delta return passed, {"baseline": baseline, "during": during, "recovered": recovered} if __name__ == "__main__": svc_ok = Service("recall", error_rate=0.001, fallback_rate=0.001) svc_bad = Service("recall", error_rate=0.001, fallback_rate=0.4) ok_result = chaos_experiment(svc_ok, fault_rate=0.3, baseline_rate=0.001, max_delta=0.01) bad_result = chaos_experiment(svc_bad, fault_rate=0.3, baseline_rate=0.001, max_delta=0.01) print("有降级缓存的服务:", "通过" if ok_result[0] else "失败", ok_result[1]) print("缓存也故障的服务:", "通过" if bad_result[0] else "失败", bad_result[1])
class Service:定义故障注入的「实验对象」,好比演习中那栋楼;error_rate控制故障概率,fallback_rate控制降级缓存是否可靠。if random.random() < self.error_rate:命中故障概率的那一刻,就是「按下降烟弹开关」的瞬间。return "ok(fallback)"主链路挂了还有缓存兜底,对应消防演习里的备用疏散通道。def measure_error_rate(service, samples=2000):拍一张「稳态快照」,返回抽样错误率,对应正文中的稳态指标测量。service.error_rate = fault_rate注入故障:把错误率从 0.1% 提到 30%,相当于触发烟雾弹。service.error_rate = baseline_rate清理故障、恢复原状,对应演习结束后的自动复位。passed = (during - baseline) <= max_delta用公式 |Err实验−Err对照|≤ε 判定实验是否通过,是整套逻辑的「判决书」。svc_bad = Service("recall", error_rate=0.001, fallback_rate=0.4)故意让降级缓存也带病,模拟「备用通道也被堵死」的极端场景。
常见误区
误区混沌工程嘛,就是往生产环境扔炸弹,越乱越好,瞎搞一通反而能发现隐藏问题。
正解混沌工程是严谨的科学实验,核心是「假设—破坏—验证」三步走:动手前先定义稳态和阈值,实验中有爆炸半径控制,一旦指标异常立即熔断回滚。随机乱搞不是实验,是事故;真正的混沌工程像消防演习,每一步都有剧本和预案。
为何常见:看到「主动破坏」「故障注入」这些词,容易把「破坏手段」误当成「实验目的」,忽视了背后的方法论与安全护栏。
误区这周跑了一轮混沌实验全部通过,系统肯定很稳,以后不用再折腾了。
正解系统在持续演进——每次发版、扩容、配置变更都会改变韧性。今天验证过的故障承受能力,明天可能因为一个参数调整就归零。所以混沌实验必须自动化、定期运行,并随发布节奏不断重跑,形成「实验—改进—再实验」的闭环。
为何常见:把韧性当成一次性考试结果,而不是需要持续维护的系统属性;就像以为演习一次,防火门就永远畅通了。
误区生产环境太危险,我都在预发环境做故障演练,效果差不多。
正解很多故障恰恰只在生产环境的真实流量、真实拓扑、真实依赖下才会显现——预发环境没有真实的流量尖峰、没有真实的跨机房延迟、没有真实的数据规模。正确路径是「预发先行、生产复验」:先在预发跑通剧本,再以最小爆炸半径在生产环境验证,配合自动熔断兜底。
为何常见:对生产环境天然恐惧,却忘了混沌工程的核心安全机制(爆炸半径控制、自动清理)正是为生产环境设计的。
误区注入故障后,系统过一会儿自己恢复了,实验通过,韧性没问题。
正解恢复只是及格线,还要看恢复期间的表现:错误率有没有突破 SLO?P99 延迟崩了多久?有没有数据丢失?如果恢复花了 10 分钟、期间错误率 50%,那韧性依然不合格。就像演习虽然所有人都出来了,但有人被挤伤、用了 20 分钟,你能说演习成功吗?
为何常见:只看「最终结果」不看「过程质量」,忽略了 MTTR、恢复期错误率这些更严格的韧性指标。
误区选最贵的工具,把所有故障类型一次性全注入,效果最震撼,暴露问题最彻底。
正解实验价值在假设与验证闭环,不在破坏规模。爆炸半径过大、故障叠加太多,你根本分不清哪个故障导致了哪个现象,结论无法落地;一旦失控还可能引发真实事故。正确的做法是单变量、小范围、可对照,一次只验证一个假设。
为何常见:把工具能力等同于工程能力,以为「破坏力」就是「洞察力」,忽略了科学实验最基础的「控制变量」原则。
面试题
Q1. 混沌工程的核心理念是什么?
- A.主动注入故障验证系统韧性← 正确答案
- B.生产环境随机搞破坏试验
- C.通过压测来提升系统容量
- D.用容灾备份替代故障演练
答案:A。混沌工程本质是「消防演习」——先假设、再放火、后验证,破坏只是手段,验证韧性才是目的。B 把手段当目的,C 说的是压测,D 说的是备份演练,都不符合「主动注入故障以验证假设」的核心思想。
Q2. 混沌实验开始前首先要做什么?
- A.定义期望的稳态与阈值← 正确答案
- B.申请一笔故障注入预算
- C.把所有节点同时注入故障
- D.向全公司发布故障通知
答案:A。演习前先立「3 分钟全员撤离」的军令状,混沌实验前先定义稳态指标与判定阈值。没有标准,实验后收集的数据就无法评判,所以稳态假设必须先行。B/C/D 都是后置动作或不合理动作。
Q3. 关于混沌实验的爆炸半径,正确做法是?
- A.从最小爆炸半径逐步扩大← 正确答案
- B.爆炸半径越大暴露问题越多
- C.爆炸半径只与虚拟机关联
- D.爆炸半径与容器技术无关
答案:A。爆炸半径如同演习只封一个楼梯间,从最小范围开始、逐步扩大,才能在可控风险内建立信心;一上来全楼放火,演习就变成真事故。B 看似有道理实则违背安全原则,C/D 说法本身错误——爆炸半径是实验设计概念,与具体技术栈无关。
Q4. 以下哪些属于常见的故障注入类型?
- A.注入网络延迟与丢包← 正确答案
- B.杀死应用进程模拟宕机← 正确答案
- C.耗尽数据库连接池← 正确答案
- D.修改产品需求文档
答案:ABC。延迟丢包是网络层故障,杀进程是应用层故障,连接池耗尽属于数据依赖层故障,分别对应演习中堵楼梯、停电梯、关喷淋三类剧本。D 改变的是需求文档,与系统韧性无关。
Q5. Netflix 的 Chaos Monkey 最初是用来做什么的?
- A.随机终止生产环境实例← 正确答案
- B.自动部署微服务代码
- C.采集用户行为日志
- D.优化推荐算法模型
答案:A。Chaos Monkey 名字的由来就是「在机房里放一只随机搞破坏的猴子」,它随机终止生产环境中的 EC2 实例,验证系统能否自愈——这是混沌工程的开山之作。其余选项描述的都不是它的职责。
Q6. 混沌实验中对照组的主要作用是什么?
- A.区分故障影响与正常波动← 正确答案
- B.增加实验的复杂度
- C.为故障扩容提供依据
- D.仅用于生产环境展示
答案:A。对照组像演习中留在原地计时的那批人,用来排除「天气好所以走得快」这类自然因素。没有对照组,你分不清错误率上升是故障引起还是正常流量波动,实验结论就不成立。B/C/D 都与对照组的统计作用无关。
Q7. 混沌实验自动化的要点包括哪些?
- A.按周期定时触发实验← 正确答案
- B.结束自动清理故障← 正确答案
- C.与 CI/CD 流水线集成← 正确答案
- D.每轮实验人工审批
答案:ABC。自动化编排把演习变成日历闹钟:定时触发、流水线联动、结束自动清理,三者缺一不可——尤其自动清理是「实验变事故」的最后保险。D 说每轮都人工审批,那就谈不上自动化了;安全机制应通过白名单、熔断和超时强制恢复来实现,而不是靠人工把关。
Q8. MTTR 指标衡量的是什么?
- A.系统故障恢复的平均时间← 正确答案
- B.系统发生故障的平均频率
- C.系统每秒最大处理请求数
- D.故障注入脚本的执行速度
答案:A。MTTR 是「从着火到扑灭」的平均时间,衡量恢复速度,对应公式 MTTR = Σ(恢复时刻−故障时刻)/n。故障频率看 MTTF 或故障率,吞吐量看 QPS,执行速度是工具性能,均与 MTTR 无关。
Q9. 稳态判定中「实验组与对照组偏差小于阈值」说明什么?
- A.故障影响被控制在 SLO 内← 正确答案
- B.系统完全没有发生故障
- C.监控系统需要立即更换
- D.实验必须立刻中止回滚
答案:A。稳态判定公式 |Err实验−Err对照|≤ε 中,ε 就是 SLO 红线。偏差没超红线,说明故障虽然注入了,但被架构的降级、重试、冗余机制消化掉了——不是没发生故障,也不是监控坏了。B/C/D 都是对公式的错误解读。
Q10. 关于混沌工程与韧性测试的闭环,正确的说法有?
- A.实验报告需沉淀改进项← 正确答案
- B.修复后应重新实验验证← 正确答案
- C.韧性指标需持续追踪← 正确答案
- D.实验通过后可停止关注
答案:ABC。闭环等于「报告沉淀改进项→修复→重新验证→持续跟踪」,就像演习后开整改单、下月复验、墙上贴趋势曲线。D 说通过后就不管,等于演习完再也不演——系统每次发版都会改变韧性,必须持续关注。