8 月 17 日的故障,以及接下来要做的工作

查看原文 HN 讨论

文章摘要

这篇文章由 GitHub 首席技术官 Vlad Fedorov(Vladimir Fedorov,曾在 Meta 任负责隐私、广告和平台的工程 SVP,管理超过 2000 人的团队,此前在微软工作、Caltech 计算机科学本硕,创办过数据治理创业公司 UserClouds)于 2026 年 8 月 20 日署名发布,配套的详细技术根因分析(RCA)发布在 githubstatus.com 上。

时间线与影响范围

按 GitHub 状态页的正式 RCA:2026 年 8 月 17 日 13:28–21:15 UTC,共 7 小时 47 分钟,github.com 在 Issues、Pull Requests、各类 API、Actions 和 Copilot 上出现错误率与延迟升高。峰值时 Web/API 错误率约 20%,归档下载与 raw 内容下载的错误率高达约 50%。受影响的还包括 SAML/OIDC 认证、SCIM、Team Sync,以及启用了数据驻留(Data Residency)的 GHEC 中依赖 github.com 上托管的公共 workflow step 定义的 Actions 工作流

分阶段恢复情况是:随着 Central US(美国中部)数据中心恢复,大部分服务在 16:36 UTC 前恢复Actions 降级持续到约 18:03 UTCCopilot Token Service 到 21:02 UTC 才完全恢复。恢复期间团队把部分失败流量从 Central US 挪到了 Northern Virginia(北弗吉尼亚)承接,直到 Central US 的网络故障被排查并解决。

这是 GitHub 8 月的第二起重大事故。前一起是 8 月 6 日 15:05 UTC 至 8 月 7 日 00:14 UTC 的 Actions 故障:workflow 运行失败或长时间排队,GitHub 托管的 runner 和自托管 runner 都受影响,峰值时 71% 的 workflow 运行遭遇基础设施故障,剩余 workflow 中 75% 被延迟超过 5 分钟

根本原因

8 月 17 日的直接原因是 Central US 负载均衡器的网络饱和,起因是流量创下新峰值。 更精确的链路是:一个 Istio sidecar pod 触到并发上限,却因为一条错误配置的策略未能正确自动扩容——那条策略只监控宿主服务(host service)的上限,没有监控 sidecar 的上限。一处失败级联到更多处,最终四个 HAProxy 节点耗尽了各自的流(flow)上限,导致网关认证路径降级,进而引发大范围的认证延迟与失败。过于乐观的重试逻辑(optimistic retry logic)加剧了问题,把内部负载均衡器压垮。转折点很戏剧化:同时暂停这几个节点上的 HAProxy,立刻带来了广泛的恢复

Northern Virginia 侧的重试风暴通过两步扑灭:一是用一个 PR 临时降低网关的重试逻辑;二是在负载均衡器上以 403 直接拦掉进来的 Copilot Token Service token 请求,然后按站点逐步把流量爬回去,让调用方能够成功。

Copilot 的残留故障来自客户端行为的放大。 对某个内部端点的响应延迟触发了 VS Code 中一个潜伏的重试 bug,把流量放大了约 10 倍;一次失败的 token 操作可以产生大量额外请求并进入重试循环。数字非常直观:Copilot Token Service 的流量从正常的 7,000–9,000 RPS 飙到 70,000–100,000 RPS。降低网关认证重试、并拦掉会触发重试的响应之后,该服务才稳定下来并完成恢复。另有一个拖慢恢复的复杂因素:codeload 端点上同时存在若干抓取(scraping)攻击

8 月 6 日那起的根因则是:一次对内部 Actions 服务(负责处理事件、生成 Actions 作业)的例行部署暴露出既有的容量与并发弱点——部署过程中 pod 被替换时,剩余容量被打满,服务崩溃并跨多个集群和下游服务级联。17:00 通过扩容、限流 webhook 触发的工作、并提高积压事件的处理能力恢复。第二阶段的影响是作业分配系统积压后,一个潜伏 bug 让 runner 被分配到已失效的作业并卡在反复重试上,无法领取有效作业。此外一项缓解措施意外影响了部分 Actions Runner Controller(ARC) runner,导致它们离线直到人工恢复(该变更随后被回滚,并将在后续 Runner 与 ARC 版本中加入自动恢复)。有些期间创建的作业既不能重试也不能取消,GitHub 在社区 discussion 里给出了 CLI 和 UI 的处理方案;部分 push 和 PR 事件在故障期间未被处理且无法自动重放,用户需要重新推一个 commit 或手动重跑 workflow。

Fedorov 在博客里给出了一个重要判断:两起故障都不是由代码或配置变更引起的,本质上都是容量失败——我们没能在需求超过容量之前把关键组件扩上去。 他给出的增长数据是自 4 月以来,月度 commit 数从 14 亿涨到 29 亿;「这个增长解释了系统上的压力,但它不为这些故障开脱」。

已做的和接下来要做的

作为年初可靠性承诺的一部分,GitHub 围绕三条优先级推进:加容量、提效率、拆掉架构瓶颈。已完成的部分包括:新增超过 300 万个 CPU 核心、120 PB 高速存储,以及大量网络容量;在现有数据中心里「装满了可用电力所允许的全部硬件」,同时加速向 Azure 迁移。今天 Azure 承载约 58% 的 GitHub 平台负载和一半的 Git 操作,而 5 月时平台负载占比只有 12%。下一个里程碑是一套让读容量随读者数量线性扩展、从而实现无限读操作的架构,将从最大的 monorepo 开始逐步推出。

Fedorov 也承认非容量层面的问题:「随着变更的节奏与复杂度上升,我们现有的运维实践没能跟上」,团队与资源已被重新投向可用性,并加强了测试、更安全的发布、更好的可观测性和更有效的告警;同时正在隔离关键系统、拆除它们之间的共享依赖

两起故障直接催生了两项即时改动:第一,在服务间调用上统一施加一致的重试上限、重试预算(retry budget)和可变超时,以防止重试风暴和级联负载;第二,重新审视优先级较低的 CPU 与内存告警,找出可能在突发流量峰值中失效的组件。 状态页 RCA 列出的后续行动更具体:修正自动扩容策略以纳入服务网格 sidecar 的并发与容量;审计受影响服务上的 Istio 请求、并发与扩容限制;审查各网关与客户端的重试上限与退避行为;修掉那个放大 Copilot token 流量的 VS Code 重试行为;改进负载均衡器容量监控与跨区域故障转移保障。

HN 评论精华

这条帖子拿到 636 分、约 717 条评论,是本期规模最大的讨论。讨论大幅偏离了复盘本身:真正围绕 RCA 技术细节的讨论只占一小部分,主线是三条——「月 commit 从 14 亿到 29 亿」这个数字意味着什么(以及它是不是 AI 垃圾)该不该逃离 GitHub / 自托管、以及由此彻底跑偏成一场关于「AI 到底有没有让人更高产」和「数据中心环境成本」的百层大辩论。付费客户的补偿问题、以及「这篇公告里没有一句『对不起』」也各自引出了一串。