OpenAI通过人口级核心转储分析修复18年老漏洞
•2 阅读•3分钟•视野
OpenAIAzurelibunwind
•2 阅读•3分钟•视野

调查背景
OpenAI 的 ChatGPT 在推理时依赖高吞吐量的数据检索服务——内部代号 Rockset。该服务使用 C++ 实现,以追求极致性能,却也因缺乏内存安全检查而容易出现段错误。2026 年 5 月底,运维监控发现多起异常退出,堆栈显示返回地址指向空指针或栈指针错位,导致整个查询节点失效。
崩溃表现
- 返回空指针:函数返回后指向
0x0,内核立刻终止进程。 - 栈指针错位:%rsp 偏移 8 字节,随后在返回阶段触发 SIGSEGV。
- 频率约为每日 10+ 次,跨多个可用区,初步排查未发现统一代码路径。
数据驱动的流行病学方法
团队放弃单例调试,转而构建 核心转储人口库:
- 使用 ChatGPT 编写脚本,批量下载 Azure Blob 中的核心文件。
- 自动抽取寄存器、栈帧信息并标记为 return‑to‑null、misaligned‑stack 或 其他。
- 将标签结果与节点元数据(地区、SKU、内核版本)关联,生成结构化表格。
该数据集在数小时内完成,随即显现出两条截然不同的聚类趋势。
两大根本原因
1. 硬件故障(Bad Host)
- 崩溃全部集中在同一 Azure 物理主机上。
- 该主机的 CPU 在高负载下出现算术错误,导致寄存器值被篡改。
- 将其下线后,所有 misaligned‑stack 事件即刻消失。
2. GNU libunwind 竞态缺陷(18 年老 Bug)
- 剩余的 return‑to‑null 核心均在异常展开阶段触发。
- GNU libunwind 在
_Ux86_64_setcontext中先修改 %rsp,再读取同一栈上保存的 ucontext。 - 若此时正好收到频繁的 SIGUSR2(OpenAI 为了细粒度 CPU 计时而使用的自定义信号),信号处理器会在 %rsp‑128 处写入新帧,覆盖尚未读取的返回地址。
- 竞争窗口仅一条指令宽,概率极低但在 高异常抛出率 + 高频信号 的组合下被放大,符合每日数十次的观测频率。
解决方案与后续措施
- 硬件层面:将故障主机加入黑名单,完善自动检测脚本,实现故障节点的快速剔除。
- 软件层面:从 GNU libunwind 切换至 libgcc unwinder,避免该竞态路径。
- 代码层面:在致命信号处理器中加入寄存器快照,便于后续无需 core dump 即可定位同类异常。
- 运营层面:更新 Runbook,加入“硬件异常+库竞态双重检查”流程,提升团队对跨层面故障的感知速度。
启示
这次调试展示了 人口级诊断 在大规模 AI 基础设施中的价值:只有在完整、干净的数据集支撑下,才能把表面上的单一症状拆解为多因子组合。未来,OpenAI 将继续投入自动化监控、核心转储分析以及跨团队协作平台,确保底层平台的可靠性不成为模型能力的瓶颈。
本文是对第三方新闻源的主观解读。消息可能出现过时、不准确、歧义或错误的地方,仅供参考使用。点击此处查看消息源。