在 OpenAI 扩展 Git:引入 Pando
OpenAI 开发了 Pando,这是一种全新的水平可扩展 Git 后端,旨在通过解耦仓库范围的一致性并重用 packfile 来支持高并发开发。通过摒弃传统的两阶段提交和预写日志模式,Pando 将中位推送延迟降低了近 80%,目前每天处理近 1 PB 的 Git 数据,同时保持与标准 Git 客户端的完全兼容。
Pando 的动机
Codex 在 OpenAI 的采用显著增加了并发分支、推送和拉取的数量,将现有的源代码控制基础设施推向了极限。传统的 Git 服务器源于基于电子邮件的补丁交换历史,难以应对现代自动化工作流的规模。OpenAI 面临着频繁的拉取缓慢、合并失败和可靠性问题,因此需要一个能够处理大规模并行写入和高吞吐量读取,且不干扰现有工程工作流的系统。
架构原则
Pando 通过放宽通常限制 Git 性能的传统约束来实现可扩展性:
- 因果一致性 (Causal Consistency): Pando 不强制执行需要全局协调的仓库范围一致性,而是使用因果一致性。这允许对不相关分支的推送并行进行。客户端可以看到单个引用的可序列化历史记录,尽管它们在整个仓库中可能会观察到不同的时间点。
- Packfile 重用: 传统的 Git 服务器通常根据客户端的本地历史记录为每个客户端生成唯一的 packfile。Pando 将传入的 packfile 存储为不可变 blob,并直接提供给读取者。这消除了昂贵的即时计算需求,并允许系统通过同时向多个客户端提供相同的数据来饱和网络带宽。
技术实现
Pando 通过三个主要服务运行:推送、拉取和后台压缩。
扩展推送
当客户端推送时,Pando 会在单次传递中验证 packfile,并将其流式传输到可水平扩展的 blob 存储中。然后,它使用多键事务在元数据存储中记录“引用版本 (ref version)”。通过限制通告引用的集合,Pando 确保客户端生成的 packfile 更容易被其他用户共享和重用,从而使通告大小保持恒定,而不受分支数量的影响。
线速拉取
拉取操作通过将 Git 协议的 haves 和 wants 映射到一系列引用版本来进行优化。Pando 使用了 packfile-uri 功能(OpenAI 帮助改进了上游版本)来返回指向缓存 packfile 的链接。这允许客户端从区域缓存下载数据,实现饱和 10 Gbps 网络链路的吞吐量。
压缩
为了防止管理数千个小 packfile 的开销,Pando 采用了类似于日志结构合并树 (log-structured merge-trees) 的后台压缩过程。此过程将 packfile 分组为几何“覆盖层 (covers)”(从 L0 到 L4)。这些覆盖层提高了压缩比,并使系统能够以对数时间执行拉取规划,从而确保随着仓库的增长,性能保持稳定。
开发与部署
Pando 使用 Rust 在 10 周内构建完成,开发过程得到了 AI 代理的大力协助。团队利用了包括 Lean 和 TLA+ 在内的形式化验证方法来证明系统属性并识别边缘情况。该系统最初通过充当读/写直通代理进行部署,从而实现了现有工作流的无缝迁移,且无需停机。
OpenAI 继续向上游 Git 项目贡献改进,特别是在与 packfile-uri 性能、并发下载以及拉取操作的更好追踪相关的领域。团队目前正在探索与更广泛的开发者社区共享 Pando 技术的方法。
Sources
- OriginalScaling Git at OpenAI