OpenAI 工程师耗时数周排查 Rockset 崩溃问题,竟是俩 Bug 同时作祟!
【导语OpenAI 工程师在排查 Rockset 崩溃问题时意外发现是两个互不相关的 Bug 同时出现。他们通过“流行病学调试”找到了问题根源并成功修复这一过程为解决复杂问题提供了新思路。】“流行病学调试”揪出俩 BugOpenAI 工程师为解释 Rockset 中神秘的崩溃问题花了数周时间。Rockset 是为 ChatGPT 搜索和数据插件提供支持的 C 数据基础设施服务。原本以为是一个 Bug 结果发现是两个互不相关的 Bug 同时出现。他们采用“流行病学调试”方法构建管道自动分析过去一年生产环境的每一个核心转储文件寻找整体规律。硬件故障引发栈对齐错误通过分析核心转储文件团队发现因栈对齐错误导致的崩溃均源自同一个 Azure 区域且有明确起始日期从未出现在长期运行节点上。追踪发现这些崩溃源自一台物理主机其 CPU 默默产生错误结果。移除该主机后栈对齐错误导致的崩溃消失。竞争条件致“返回空指针”崩溃剔除硬件崩溃问题后剩余由“返回空指针”导致的崩溃问题变得可控。根本原因是 GNU libunwind 的 _Ux86_64_setcontext 函数存在 18 年的竞争条件。在 C 异常展开过程中该函数在读取指令指针操作未完成前更新栈指针若信号在这一窗口到达指令指针会被破坏函数跳转到 NULL 或垃圾地址。OpenAI 的 Rockset 高频发送信号将理论上的竞争状况转化为实际崩溃。修复方案消除竞争窗口团队将修复方案和重现示例提交到 GNU libunwind验证其他展开器不存在此问题。修复方案通过重新排序指令确保在更新 %rsp 之前先读取 %rip彻底消除了竞争窗口。编辑观点OpenAI 此次排查过程表明构建高质量数据集对解决复杂问题至关重要也提醒开发者排查问题时要警惕多个 Bug 混淆的情况。

相关新闻