优化系统,而不是优化其组件
Hamming的系统工程第一条规则
Hamming的核心原则来自Ch. 28:如果你优化组件,你可能会破坏系统性能。
他用差分分析仪的故事来说明这一点。两个单元需要相互连接。建设者们改进了第二个单元中的放大器。在接收日,Hamming运行了标准测试——解y'' + y = 0,绘制y vs y',预期是一个圆形。它失败了。原因:改进的放大器通过地面电路吸收了更多电流。原设计的接地是足够的。它没有为新的电流水平进行评估。接口出现了问题,而不是组件。
他的总结:大多数系统故障都源于接口,而不是组件。组件被设计、测试和认证。接口被设计为后来事,很少测试,永远不会独立进行认证。当一个组件发生变化,它的接口行为也会发生变化。下游没有为那个新的接口设计。
关键不对称:如果一个组件喂养一个受限接口,组件的10×改进可以产生10×的系统退化。这个改进不会增加——它会减少。
教育系统作为失败的系统工程
Hamming关于教育的案例
Hamming将这个原则应用于教育。优化单个学科成绩——让学生们在每个学科中最大化测试成绩——会产生学生们在各个测试中得分高,但无法将知识跨学科集成在一起的能力。
每个组件(学科成绩)都有所提高。系统(教育,定义为跨学科集成的理解)却退化。学生在不同学科之间的接口能力(即应用知识跨领域的能力)从未被优化。它萎缩了。
这不是实现的偶然。这是结构性的。当你衡量和奖励组件性能,你会得到组件优化。接口对组件指标是不可见的。
他的处方:找到系统中的瓶颈,然后问一个问题:当你移除它时,下游会发生什么?瓶颈移除会使下一个队列泛滥。一个无约束的优化变成了一个新的约束。
追溯接口退化
Hamming 证明了提高一个组件性能会改变其接口行为——而整个系统都是基于旧接口行为设计的。
节点、队列、洪峰分数
一个MOAD工厂模型
每个软件依赖图都形成了一个工厂。每个节点是一个工作站。每条边是一个队列。工作进入节点的队列,得到处理,然后流向下游队列。
每个节点有两个分数:
Surge score = speedup × in-degree
当这个瓶颈消失时,下游会涌入多少工作。一个在-degree 为 5 (5 个上游依赖都向它提供)且速度提升 100× 的节点,将在下游产生 500× 的涌入。
Betweenness = in-degree + out-degree
这个工作站在总流程中的中心程度有多高。高之间性意味着许多路径通过这个节点。
两个典型的类型:
Workaholic node: 高之间性,高涌入分数。这是瓶颈。上游的所有队列都因为它而积压。没有为下游增加容量的情况下,去除这个瓶颈,下游的所有内容都会同时崩溃。
Glutton node: 高out-degree,低涌入分数。消费掉所有喂给它的东西。它的瓶颈是内部的,而不是通过率。忘记停止的机器 - 工作进入,什么也不会退出,节点会永远报告'忙'。
MOAD-0001 & MOAD-0005: 耦合情况
GHC 案例
在 GHC 的依赖解析器应用 MOAD-0001 修复之前:N=50,000 个依赖在 17 分钟内构建。之后:10 秒。速度提升:100×。
下游会发生什么?每个原本以 17 分钟批次到达节奏自我调节的构建缓存、艺术品存储和 CI 运行者现在接收到每小时完成的构建数量增加了 100×。设计容纳每小时 60 个构建艺术品的缓存现在接收到 6000 个。
这是 MOAD-0005:缓存大闹潮现象。每个缓存键都同时被错过,因为没有为新到达率预热缓存。MOAD-0001 的修复制造了 MOAD-0005。
这个耦合不是偶然的。它是结构性的。in-degree > 1 时,O(N²) → O(N) 速度提升将产生大于 1 的涌入分数。涌入分数大于 100 的是 MOAD-0005 候选者。
在披露之前进行阶段性准备
一个构建系统每小时处理 1000 个包依赖图。您在其图遍历中修复 MOAD-0001,减少构建时间从 60 分钟到 30 秒 - 速度提升 120×。现在这个系统每小时处理 120,000 个图。
何时停止:停止条件
停止条件
补丁满足停止条件——意味着:不要揭示——当四个条件同时满足时:
1. 补丁在运行系统中(合并,部署)
2. 未分配看守者来拥有下游影响
3. 下游缺陷(MOAD-0005)未解决
4. 加速≥100×
四个一起 = 婴儿哭泣。合并之前分配团队,不要在合并之后。
没有看守者的节点就像没有工人的工作站。工作积累。有人崩溃。永久计算原则:您不能修复分发算法,没有预先加载驱动程序。三个驱动程序,三百万人:解锁算法创建了一个 yerine 快速交付 rather than 更多未服务请求的惊雷群。
WALL-E:贪吃鬼 & 工作狂
WALL-E 模型
Pixar的WALL-E描绘了工厂模型失效的最清楚形式。贪吃鬼在悬浮椅子上,毫无摩擦地被喂养。工作狂——WALL-E,EVE——在站点上死去,以保持喂养运行。
贪吃节点(人类在悬浮椅子上的节点)具有最大出度:它消耗掉它接收到的所有东西,产生 nothing。它的洪峰得分为零——它是一个汇点。它感觉不到痛苦,因为 nothing 在其输出中积累。它只是消耗。
工作狂节点(WALL-E)具有最大之间度:一切都通过它流动。它吸收所有输入。它产生唯一的输出。它的洪峰得分,如果有更快的模型替换它,将会同时淹没每个下游队列。
WALL-E系统的缺陷不是贪吃鬼。它是缺少看守者的缺陷:没有人被分配来平衡工作站。没有人在运行算法之前预先加载容量。
Pip Case:揭示之前的检查清单
您在Python的pip依赖解析器中发现了MOAD-0001。测量的加速:200×。pip每天运行大约4000万次。PyPI提供包。