支撑 10 亿用户与 7000 万 QPS:OpenAI 拆解在线存储平台 Habitat 的架构演进与 Python 尾延迟治理

支撑 10 亿用户与 7000 万 QPS:OpenAI 拆解在线存储平台 Habitat 的架构演进与 Python 尾延迟治理

OpenAI 首次披露其支撑每周 10 亿用户、7000 万+ req/s 的在线存储平台 Habitat,详解从客户端类库到独立微服务的分拆历程、Python 极端并发下的尾延迟与亚稳态治理,以及在 2 人协作下由 Codex 与 GPT-5.5 完成全量 Rust 重写的工程实践。

OpenAI 旗下的大模型产品依赖底层存储系统的快速读写支撑1。无论是用户登录账号、读取 Codex 编程偏好,还是在 ChatGPT 开启一段新对话,应用后端通常都需要在响应前触发多次分散的数据查询1。如果这些底层查询发生延迟抖动,整个产品的交互就会明显变卡;一旦底层请求遭遇宕机,上层推理服务将直接陷入停摆1
OpenAI 官方工程团队于 2026 年 9 月 11 日发布了技术报告《Rapidly scaling online storage to serve over 1 billion ChatGPT users》,首次披露了专为全线产品构建的统一在线应用存储平台 Habitat1。这套系统目前每秒处理超过 7000 万次请求,服务于每周超过 10 亿活跃用户,托管数据体量超过 500 PB,部署范围覆盖全球近 40 个地理区域1。在过去三年中,OpenAI 的业务流量连续实现了年均超 10 倍的复合增长,这种扩张速度迫使基础架构团队在维持服务可用性的同时,完成从客户端类库、独立微服务到底层全量重写的技术迭代1
Habitat 整体系统架构与多层存储资源布局
Habitat 在线存储平台总体架构:涵盖客户端接入层、平台中枢管控层、底层多模态存储资源,以及通过变更数据捕获(CDC)支撑的下游分析流水线1

架构演进:从客户端类库到集中式微服务

Habitat 在 2024 年年中立项之初,设计目标是让产品业务工程师免于处理繁琐的底层数据库运维1。当时的 Habitat 只是一个轻量级的 Python 客户端 SDK 类库,直接嵌入在 ChatGPT 的主服务进程中运行,底层仅连接单套 Azure Cosmos DB 实例1
该类库为业务开发团队封装了标准的数据读写接口,在代码内部自动接管了元数据模式(Schema)寻址、多区域路由、身份鉴权、透明加密、序列化转换、请求整形以及数据库连接池复用等底层机制1。由于接入方式极其轻量,Habitat 很快在 OpenAI 内部各个新产品线中自发普及,逐步取代了业务团队自行搭建的独立 Postgres 和原生 Cosmos DB 实例1
随着 OpenAI 内部微服务数量急剧攀升,客户端类库模式在 2025 年年中遇到了严峻的协同瓶颈1。当数据层需要进行跨机房迁移或底层路由协议调整时,修改类库必须在全公司几十个独立服务的代码库中分批发版并逐一上线特性开关(Feature Flag)1。这种跨团队协同往往耗时数天,且面临极高的运维风险:在一次旨在缩小单地域故障爆炸半径的 Cosmos DB 迁移中,存储团队为客户端加入了路由与影子分流逻辑,历经数天协调各业务上线;就在准备全量开启特性的前夕,某个业务团队因无关代码变更紧急回滚了旧版客户端,旧版 SDK 的错误路由直接引发了全站级故障1
Habitat 独立服务架构与请求流转拓扑
通过解耦出独立的 Habitat Service 进程,存储团队收拢了部署、观测与安全鉴权的控制权,大幅降低了跨服务协同开销1
这一事故促使工程团队下定决心,将存储核心逻辑从各个业务客户端中彻底剥离,独立部署为专职的 Habitat Service 存储服务微服务集群1。服务化解耦为系统带来了三个维度的收益1
  1. 集中变更与渐进发布:底层路由策略、分片拓扑以及客户端缓存优化可以直接在 Habitat 自身集群中统一灰度上线,彻底消除了跨几十个业务工程团队的协同等待与版本碎片化痛点1
  2. 全局可观测性闭环:存储层具备了端到端的指标采集与分布式链路追踪能力,使工程师能快速排查跨地域链路中的慢查询与异常请求1
  3. 安全与隐私核心收口:独立服务成为了访问底层数据库资源的唯一合法咽喉点,团队在此集中收拢了基于访问控制列表(ACL)的细粒度鉴权、合规审计日志以及数据驻留策略,严密防范了外部攻击、内部越权以及自主智能体(Agent)可能触发的未授权跨库访问1

极限压榨 Python:超大规模下的尾延迟攻坚实战

在将 Habitat 升级为独立服务时,OpenAI 做出了一项务实的工程决策:沿用既有的 Python 代码栈启动服务开发,而不是立即重写为 Rust 或 Go1。团队非常清楚用 Python 支撑超大规模存储服务会增加额外的网络跳转跳数,并在 CPU 和内存开销上带来显著劣势;但这属于一种经过精确计算的“战略性技术债务”借贷——在业务爆发期,解绑业务研发阻塞并快速稳定核心数据 API 是第一优先级,系统重构完全可以放在平台成熟之后1
然而,当每秒请求量达到数千万级时,Python 服务面临的最大挑战集中在尾部延迟治理上1。在上层大模型调用链中,终端用户发起的一次对话交互,在应用层往往会递归扇出为数百次独立的底层数据库查询1。根据长尾效应,数百次查询中耗时最长的那一次调用,直接决定了用户的端到端交互耗时1
Python asyncio 调度延迟在低负载与高负载下的机制差异
并发执行与 CPU 并行计算的根本差异:在高 CPU 密集型任务下,Python 单线程主循环被长时间霸占,导致网络 I/O 已经返回的响应被迫在 READY 队列中持续排队等待调度1

1. 监控并量化 asyncio 事件循环调度延迟

系统工程师在排查 P99 及更高分位延迟时发现,很多请求在底层 Azure Cosmos DB 中的物理查询仅耗时数毫秒,但整个请求的端到端耗时却高达几百毫秒甚至数秒1。排查追踪表明,问题出在 Python 的运行机制上:asyncio 能够高效并发交织 I/O 等待,但在全局解释器锁(GIL)的存在下,一个 Python 进程在任意物理时刻只能有一个线程在 CPU 核心上执行1
Habitat 不仅负责网络转发,内部还承担了密集的 CPU 计算工作:动态路由算法、请求体 Snappy 压缩与解压、AES-GCM 加密解密、CRC 校验和计算、下游存活探针探测、流量镜像(Shadowing)以及对冲重试(Hedging)1。一旦某些请求在主线程中执行耗时较长的 CPU 密集任务,事件循环就无法及时调度已经收到网络返回的协程,导致大量响应卡在“数据已到、未被解析”的阻塞等待中1
为了量化这种由于主线程占用引起的抖动,OpenAI 开发了事件循环延迟实时探针:通过定期向 asyncio 循环中投递轻量的周期性探针任务,计算任务的“实际执行时间戳”与“理论预期调度时间戳”之间的差值(Delta),直接作为度量事件循环忙碌度的实时核心指标1。实测表明,在高 CPU 负荷下,即便是适度的并发请求量也会引发数百毫秒的调度抖动1。团队据此采取了应对方案:严格限制单个 Python 工作进程允许处理的并发请求上限,并通过在容器中海量横向平铺 Python Worker 进程来承接整体吞吐1

2. 拔除动态配置解析引发的周期性 CPU 尖刺

在服务上线初期的性能分析中,CPU 采样器捕获到了一个极其规律的周期性延迟尖刺:每隔整整一分钟,集群内多个容器的 CPU 利用率便会瞬间突增,伴随着大量在途请求发生长尾停顿1
故障根源最终定位到了特性开关管理组件 Statsig 的默认轮询行为1。Statsig 默认配置为每 60 秒定时拉取一次全量规则配置,并且拉取逻辑没有任何时间抖动(Jitter);配置包内还包含了全公司所有生产环境的规则集,体积庞大1。由于单个 Pod 内同时跑着 8 个独立的 Python 进程以榨取多核性能,每当一分钟周期到达时,Pod 内的所有进程同时被唤醒,争相解析巨型 JSON 配置文件,瞬间耗尽容器的 CPU 配额,使得正在处理业务网络数据的协程全线陷入停滞1
存储团队通过精准的配置治理排除了该隐患:将全量配置剥离为当前服务专用的精简规则子集,拉长后台刷新轮询周期,并在每次更新任务触发时引入随机时间抖动,成功消除了全集群共振式的 CPU 尖刺1

3. 破解客户端连接池中的“亚稳态失效”

除了单进程内的计算调度问题,多进程架构在网络层引入了复杂的负载均衡失衡风险1。在一次流量突发测试中,团队观察到一种诡异的级联雪崩现象:在突发流量已经彻底停止后,一部分 Habitat 服务端节点依然处于高负载和高错误率的瘫痪状态,并且随着时间推移,被压垮的节点反而接收到了越来越多的新流量,最终只能通过人工重启彻底恢复1
这种现象属于分布式系统中典型的“亚稳态失效”(Metastable Failure)12。团队通过限定最大连接重用生命周期锁定了诱因,问题深植于 Python 网络库 aiohttp 的底层实现之中:其内置的 TCPConnector 默认采用后进先出(LIFO)的连接复用策略1
在常规低负载场景下,LIFO 能优先复用最近活跃的 TCP 连接,让突发流量新增的闲置连接快速超时释放,有助于节约内存连接句柄1。然而在极端并发与慢速服务并存时,这一逻辑构成了致命的正反馈回路1
  • 在流量激增阶段,已经发生卡顿的慢速服务端节点,响应耗时更长,因此归还连接到客户端连接池的时间更晚;
  • 依据 LIFO 规则,客户端在派发下一个请求时,会优先抓取池顶“最新归还”的连接;
  • 结果原本就已经处于处理瓶颈的慢节点,其连接反而被客户端以最高优先级重复选中并不断灌入新请求,使得过载节点陷入更深层次的雪崩,彻底丧失自愈可能12
连接复用策略稳态运行特征突发流量下的系统行为极端场景下的故障模式
LIFO (后进先出)优先重用热连接,闲置长连接快速超时回收,内存开销低慢速节点由于处理耗时更长,其连接归还时往往位于池顶慢节点持续被选中派发新流量,诱发恶性正反馈与亚稳态雪崩
FIFO (先进先出)均衡轮询连接池内的所有可用连接,保持各连接活性请求在各个可用长连接之间公平平摊,平抑慢节点突发压力切断拥塞放大回路,在突发洪峰过后系统能够快速自发收敛至常态
连接复用机制对比:OpenAI 将底层客户端连接池修改为 FIFO 策略后,彻底打破了慢速节点聚集流量的反馈回路,显著平抑了日常请求的方差,并最终借助 Envoy 与 Istio 实现基于服务端实际负载的动态请求派发12

4. Envoy 汇聚收拢连接扇入,阻断下游惊群效应

为了压低事件循环调度延迟,集群平铺了数量庞大的 Python 进程,但这直接引发了新的次生风险:下游存储惊群(Thundering Herd)1。成千上万个 Python 独立进程各自向下游 Cosmos DB 发起并发连接,日常代码热更新时的连接重建极易造成连接风暴,甚至瞬时耗尽集群 NAT 网关的端口映射配额1
基础架构团队在服务间引入了 Envoy 代理层来实现连接扇入(Fan-in)收拢1。Envoy 接收 Python 进程发出的本地 HTTP/1 短连接,自动升级为面向下游长效维系的 HTTP/2 多路复用连接池,大幅削减了向外建立的物理 TCP 链路数量,并在代理层统一实施集中式的熔断降级与精确限速策略1

克制的数据模型:为什么 Habitat 刻意放弃强表达力

支持系统在数年内从数百万用户跃升至 10 亿规模的另一项核心设计,在于 Habitat 极其克制的数据模型约束1。与传统业务系统追求灵活复杂的 SQL 查询相反,Habitat 刻意限制自身只暴露极简的 NoSQL 点查接口1
在迁移至 Habitat 之前,OpenAI 的在线数据主要存放在自建 Postgres 数据库中1。团队在早期能够依靠人工 Code Review 严格把关每条 SQL 查询和索引变更,确保所有操作都走索引覆盖路径1。但随着开发人员和微服务数量几何级膨胀,这种人工审查机制彻底失效,关系型数据库屡屡发生线上故障1。其根源在于 SQL 固有的成本不对称性(Cost Imbalance):编写一条高开销的复杂多表关联(Join)或全表扫描查询极其简单廉价,但在高并发热路径上执行这类查询,足以导致全库 CPU 锁死并引发全站瘫痪1
为了根除这种风险,Habitat 借鉴了 Meta 在大规模社交图谱中验证过的 TAO 架构思想,设计了基于“对象(Object)”与“边(Edge)”的数据抽象模型13
  • 静态模式定义:业务方必须预先声明对象类型、有向边类型以及它们之间的实体关联,禁止客户端随机构建动态任意查询1
  • 杜绝隐式图遍历:系统在 API 层面仅支持点查某个特定对象及其直接相连的有向边列表,底层引擎绝不提供开销不可预测的递归图遍历或多跳查询算子1。如果业务需要跨对象查找关联数据,必须在客户端代码中显式发起多次串行或并行请求,从而将深层查询的资源代价透明显式化1
  • 存储级分区共置:在物理存储划分上,Habitat 确保单个对象与其直接挂载的所有边记录物理共置在同一个底层 Cosmos DB 分区中,从而保证了单跳查询的强局部性与超高吞吐1。与此同时,边所指向的目标远端对象并不强制与当前对象共置,这使系统能够实现极其线性的水平切片扩容,代价值得接受:跨对象的远端跳转可能需要跨越不同物理区域的数据库账户1
对于复杂查询与统计检索需求,Habitat 提供了专门的分析型逃生通道1。团队搭建了专职的变更数据捕获(CDC)流水线,将在线主存中的所有写入与变更事件以近实时流式同步至隔离的下游系统,包括用于复杂全文搜索与聚合统计的 Rockset 实例,以及用于离线大数据分析的 Databricks 与 Kafka 集群1。每个业务线按需自行配置和扩容其专有的 Rockset 实例,这种物理层面的严格隔离,彻底解耦了分析型读密集负载与在线事务型(OLTP)核心链路,保护了主存储的稳定性1

终局升级:利用 AI 辅助重写将核心服务迁移至 Rust

在长达两年的业务超常规爆发期中,暂缓使用低级语言全量重写为 OpenAI 争取了宝贵的战略窗口,让基础架构团队得以将精力聚焦于核心 API 契约的确立、存储隔离和多租户稳定性治理1。在 Python 技术栈的极限服役阶段,Habitat 的总吞吐量支撑突破了每秒 2000 万次请求,占据了全公司按 CPU 核心数计算的第二大服务体量(Envoy 实例占用规模位列第四)1
当系统进一步向 7000 万请求量级迈进时,语言层面的开销终于演变为必须解决的核心矛盾1。OpenAI 在立项初期所押注的赌注得到了兑现:团队坚信自身代码大模型技术的迭代速度能够大幅简化未来的系统级代码迁移1
在 2026 年第二季度,仅仅依靠 2 名工程师CodexGPT-5.5 的代码生成与形式重构协作下,OpenAI 顺利完成了将庞大 Habitat 服务全量重写为 Rust 的工程任务1。截至目前,这套全新的 Rust 服务已经平稳承载了线上超过 95% 的生产流量,官方计划在未来数周内彻底下线并废弃所有旧版 Python 实例1
线上实测生产数据展现了系统重构带来的效能阶跃1
  • 计算资源效率:Rust 服务的 CPU 利用效率比 Python 提升了 6 倍(6x more CPU efficient)1
  • 内存占用表现:内存使用效率比 Python 提升了 15 倍(15x more memory efficient)1
  • 延迟分布改善:彻底根除了 Python GIL 导致的事件循环调度延迟与垃圾回收顿挫,不仅大幅压低了请求的平均网络延迟,更将 P99 和 P99.9 等极端尾部毛刺压平至确定性的毫秒级基准线1

基础设施架构演进的工程启示

OpenAI 围绕 Habitat 构建的这套存储演进范式,为当前正在建设大模型高并发底座的技术团队提供了三点具备普适参考价值的工程启示1
第一是克制表达力是超大规模存储可扩展性的前提13。在多租户且微服务高度密集的业务环境中,任何允许任意 SQL 表达的接口都会将系统的稳定性完全寄托在业务人员的自律上。通过在底层强制收拢为常数级点查与直接边查询,并将图遍历与关联计算显式移交业务端,同时借助 CDC 数据分流将读分析彻底剥离,是在极端吞吐下维持存储底座确定性的核心原则1
第二是对隐式队列与反常识的亚稳态失效保持警惕12。无论是在单进程内由于 CPU 阻塞被隐式拉长的协程就绪队列,还是在网络层由于连接池 LIFO 复用导致的过载集中,在常规低负载下表现良好的优化策略,在洪峰场景下极易异化为放大雪崩的正反馈陷阱。在设计关键基础设施时,需要通过精确的调度度量和基于 FIFO 的公平负载分配来防御这种内生故障12
第三是重新评估架构重构的时机与生产力边界1。在业务发展的初期与中期,以高阶语言快速打通业务闭环并承受一定的资源开销是合理的战略借贷;而当底层接口契约足够固定后,借助前沿编程模型(如 Codex 与 GPT-5.5)进行全量语言级重构,正在成为极少数人驱动巨型基础设施演进的现实路径14
根据官方计划,OpenAI 后续将在该系列的第二篇报告中进一步深入披露 Habitat 在多租户海量数据下的隔离机制、分层读性能优化,以及团队与微软 Azure Cosmos DB 深度协同支撑极限规模的底层存储技术细节1

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content