OpenAI 的工程师团队耗费数周时间,试图解开 Rockset 产品中那些令人费解的崩溃谜题。Rockset 是一款基于 C++ 的数据基础设施服务,主要支撑 ChatGPT 的搜索与数据插件功能。在排查过程中,工程师发现函数返回了错误的内存地址,栈指针在执行时似乎发生了 8 字节的偏移。团队提出的种种假设,几乎都被有力的反证一一推翻。这个 Bug 似乎根本就不可能存在。

起初,团队以为这是一个单一 Bug,结果却意外发现是两个互不相关的 Bug 巧合地在同一时间暴露无遗。这一突破性的发现并非源于对单个崩溃案例的深入剖析,而是得益于他们转向了“流行病学调试”的方法:构建一套自动化管道,分析过去一年生产环境中的所有核心转储文件,从中寻找整体规律,而非仅凭直觉推断个别案例。

团队让 ChatGPT 编写了一个脚本,用于提取核心转储文件开头的寄存器数据,过滤误报,并将崩溃标记为“返回空指针”、“栈对齐错误”等类型。随后,他们将此脚本并行应用于过去一年内的所有 Rockset 核心转储文件。很快,他们便发现了其中的关联性。那些看似症状相同的崩溃事件,实际上对应着两组特征截然不同的故障源。

所有由“栈对齐错误”引发的崩溃均源自同一个 Azure 区域,且都有明确的爆发日期,且从未出现在长期运行的节点上。团队追踪定位发现,这些崩溃的源头是一台物理主机,其 CPU 正在悄无声息地产生错误计算结果。该主机既未过热,也未触发机器检查异常,仅仅是数学运算出了问题。一旦将该主机从服务中移除,因栈对齐错误导致的崩溃便随之彻底消失。

在剔除了硬件故障导致的崩溃后,剩余的“返回空指针”问题便变得可控了。此前,团队曾试图排除 C++ 异常展开作为原因,因为他们认为自己找到了反例——即在不使用异常的代码路径中发生了崩溃。然而,他们很快意识到这些反例全部来自有硬件损坏的故障集群。排除这些干扰因素后,所有剩余的崩溃都确认为发生在异常展开过程中。

问题的根源在于 GNU libunwind 库中 `_Ux86_64_setcontext` 函数内的一个已存在 18 年的竞争条件。在 C++ 异常展开过程中,libunwind 会在栈上构建一个 `ucontext_t` 结构体以保存寄存器状态,随后调用 `_Ux86_64_setcontext` 将控制权转移给清理处理程序。问题在于,该函数在尚未完成从旧结构体读取指令指针的操作时,便先将栈指针更新为指向新的栈帧。一旦栈指针改变,该结构体便不再处于活动栈范围,也不再受内核红区保护。如果信号恰好在这个时间窗口内到达,内核会在该结构体之上构建信号帧,导致指令指针被破坏,从而使函数跳转到空指针或垃圾内存地址。

竞争窗口的宽度恰好是一条指令,按现代处理器的时钟频率计算,大约只有 100 皮秒。在大多数程序中,这种情况几乎不会触发。然而,OpenAI 的 Rockset 使用了 `timer_create` 函数,每隔几毫秒的 CPU 时间就发送一次 SIGUSR2 信号,旨在实现轻量级的按查询记账。这种高频的信号发送机制,将原本只在理论上存在的竞争状况转化为了实际生产环境中的崩溃。

团队已将修复方案及自包含的重现示例提交至 GNU libunwind,并经验证确认,其他展开器(如 libgcc)不存在此问题。该修复方案通过重新排序指令,确保在更新栈指针之前先读取指令指针,从而彻底消除了这个时间窗口。

该团队对这一教训的总结值得反复引用:最重要的步骤并非巧妙地解读汇编代码,也不是对细节的深入了解,而是构建一个高质量的数据集。如果没有这个数据集,团队就会将两种截然不同的现象混为一谈,并试图通过推理来理清这种混乱。一旦获得了准确且完整的全量数据,问题的结构便一目了然。如果你的团队正在排查难以解释的生产环境崩溃问题,请检查是否将多个 Bug 混淆在了一起。那些看似与所有假设都不相符的症状,实际上可能并不矛盾;它们可能与两个不同的假设相符,而你却无意中将它们混淆了。洞察问题结构的最快途径,并非对单个案例进行更深入的分析,而是获取涵盖所有故障案例的完整、带标签的数据。

这篇完整的工程技术博文包含了详细的栈内存示意图、存在漏洞的汇编指令,以及揭示出两种不同类型故障的崩溃率可视化图表。

最新快讯

2026年10月25日

06:03
午后市场大幅反弹,小盘风格表现强势。截至收盘,科创100指数上涨3.6%,创业板200指数上涨3.5%,中证500与中证1000指数均上涨2.4%,中证2000指数上涨1.9%。其中,利亚德、明月镜片等成分股录得20CM涨停。 中证1000指数选取中证800指数样本以外、流动性好且规模偏小的1000只证券作为样本。该指数成分股多集中于电子、电力设备、机械设备...
05:33
人工智能板块午后持续拉升,市场表现活跃。截至收盘,上证科创板人工智能指数上涨6.1%,中证科创创业人工智能指数上涨4.9%,中证人工智能主题指数上涨4.3%。同花顺iFinD数据显示,易方达科创人工智能ETF(588730,联接基金A/C:023564/023565)连续两个交易日获得资金加仓,累计净流入近1000万元。
05:33
10月23日下午,创业板权重板块强势拉升,走出“深V”反转行情。截至收盘,创业板指数上涨4.2%,创业板成长指数上涨3.7%,创业板200指数上涨3.5%。据同花顺iFinD数据统计,易方达创业板ETF(159915,联接基金A/C/Y代码分别为110026/004744/022907)今日获超24亿份净申购,资金净流入态势已持续12个交易日。
05:33
截至收盘,主要汽车类指数表现强劲,中证智能电动汽车指数上涨4.8%,中证汽车零部件主题指数上涨4.5%,恒生港股通汽车主题指数上涨3.4%。据同花顺iFinD数据披露,汽车零部件ETF易方达(159565)今日获得100万份净申购,其对应的联接基金A/C代码分别为021140和021141。
05:33
10月23日,A股市场午后呈现快速反弹态势,三大指数集体收红。全市场成交额录得19728亿元,较前一交易日大幅放量4310亿元,逾4500只个股飘红。 板块方面,电机、自动化设备、软件开发以及人形机器人板块表现抢眼;银行、电力及元件板块则跌幅居前。 港股市场主要指数同步走高,软件开发、IT服务、消费电子及汽车板块领涨。截至收盘,中证A500指数上涨2.1%,...
05:33
10月23日午后,机器人板块行情快速拉升,截至收盘,国证机器人产业指数大涨8.0%,领跑全市场。同花顺iFinD数据显示,易方达机器人ETF(159530,联接基金A/C:020972/020973)当日获得超7亿份净申购,显示出资金对该板块的青睐。 市场分析指出,后续人形机器人产业仍有望迎来持续突破。一方面,需关注特斯拉Optimus的演示表现及产能爬坡进...
05:33
10月23日午后,算力硬件板块显著反弹,半导体、CPO、PCB概念及存储芯片等方向集体走强。截至收盘,中证云计算与大数据主题指数上涨4.5%,中证芯片产业指数上涨2.9%,中证半导体材料设备指数上涨0.8%,创业板算力基础设施指数上涨2.0%。同花顺iFinD数据显示,创业板算力ETF易方达(158050)今日获9600万份净申购,已连续9日实现资金净流入。...
05:33
据鼓狮财经10月25日报道,当地时间10月24日,美国司法部向加利福尼亚州全部58个县的选举官员致函,要求他们在48小时内核实联邦名单中人员的美国公民身份,并将身份尚未确认者的邮寄选票暂时单独存放,待核查结束。司法部明确警告,若地方官员拒绝配合,将面临联邦政府的严格审查。 据悉,此次行动的背景是司法部此前在加州识别出约2万名疑似非美国公民,名单中的部分人员可...
04:57
港股科技板块午后表现强劲,整体呈现震荡上行的态势。截至收盘,恒生科技指数上涨2.1%,中证港股通消费主题指数涨幅居前,达到2.4%。此外,新经济、互联网及医药卫生指数也分别录得1.8%和1.2%的涨幅。资金流向方面,同花顺iFinD数据显示,易方达恒生科技ETF(513010)昨日获得近2亿元资金净流入,显示出市场对该板块的关注度较高。