OpenAI 存储平台 Habitat 的规模化之路

OpenAI 官方博客介绍了其在线存储平台 Habitat 的演进过程。HabitatOpenAI 自建的在线存储平台,目前每秒处理超过 7000 万次请求,支撑每周超过 10 亿用户的产品,存储数据超过 500 PB,覆盖近 40 个地理区域。

Habitat 始于 2024 年中,最初只是一个简单的 Python 客户端库,直接对接 ChatGPT 主服务器,底层使用 Azure Cosmos DB。这个库的目标是让产品工程师无需关心数据库管理,包括 schema 查找、路由、鉴权、加密、序列化、请求整形和连接池等细节。由于使用简单,它在 OpenAI 内部被快速采纳。

到 2025 年中,客户端库模式达到极限。一次为了将关键数据集迁移到区域分布的 Azure Cosmos DB 账户,需要引入新的路由逻辑、通过 feature flag 控制、协调数十个服务逐步发布,整个过程耗时数天,且最终因某个团队回滚到旧版客户端而引发故障。这促使团队将 Habitat 从库重构为独立服务,从而获得部署、可观测性和平台增强的单一控制点,也能集中实施访问控制、审计日志和底层存储资源限制。

团队选择继续使用 Python 构建服务,尽管 Python 在高吞吐场景下会增加网络延迟和 CPU、内存成本。这是有意的技术债:优先解决产品开发阻塞和平台稳定性,同时押注自家 coding model(Codex、GPT)未来能简化迁移。这个赌注最终被证明是正确的。

运行 Python 高吞吐服务的核心挑战是尾部延迟。由于 Habitat 除了 I/O 代理,还承担路由、压缩、加密、校验和、健康检查、请求 shadowing 和 hedging 等大量 CPU 密集任务,asyncio 调度延迟很容易主导 p99 延迟。团队通过周期性调度后台任务并记录预期与实际执行时间的差值,实时测量事件循环调度延迟,发现高利用率下调度抖动可达数百毫秒甚至数秒。对策是让每个进程只处理少量并发请求,同时大规模增加 Python worker 进程数量。

一个具体的尾部延迟根因是 Statsig 的 feature flag 配置解析。默认配置每分钟无抖动轮询,且包含所有服务的全部生产规则,加上每个 pod 最多 8 个 Python 进程,导致每分钟所有 worker 都会停滞处理请求去解析巨型配置文件。修复方式是部署更小的定向配置、延长刷新间隔、为后台任务增加抖动。

连接池的 LIFO 复用机制曾引发 metastable failure。Python aiohttp TCPConnector 默认 LIFO 复用连接,突发流量后较慢服务器返回连接更晚,反而被后续请求更频繁选中,导致流量持续集中到已过载的 pod。改为 FIFO 复用后打破了反馈循环,也降低了稳态请求方差。现在 OpenAI 主要依赖 Istio 和 Envoy 提供连接池和负载感知的均衡策略。

大量 Python 进程带来的另一个问题是容易淹没下游依赖,即 thundering herd。团队依赖 Envoy 做连接 fan-in,将 HTTP/1 升级为 HTTP/2 多路复用,并集中实现限流和熔断。

Habitat 能扩展到如此规模,部分原因是其 API 受限。它不提供任意 SQL 查询,而是暴露类似 TAO 的 NoSQL API,围绕客户端定义的对象和边类型建模。每个对象及其边在存储层共置,但对象与边指向的远端对象不做数据库级共置,因此模型易于水平分区,但图遍历效率低。复杂查询通过 CDC 流到隔离的 Rockset 实例处理,由各客户端团队自行扩展。这是明确的设计取舍:让简单查询成为默认,同时为复杂查询提供逃生舱。

2026 年 Q2,团队仅用 2 名工程师、Codex 和 GPT-5.5 就将整个服务用 Rust 重写。新 Rust 服务已处理 95% 的生产请求,CPU 效率提升 6 倍,内存效率提升 15 倍,平均和尾部延迟显著降低。Python 版本峰值时每秒处理超过 2000 万请求。团队计划在后续文章中分享更多细节。

Rapidly scaling online storage to serve over 1 billion ChatGPT users

查看原文