Oxide机架服务处理器消失之谜:历经调试终寻得修复方案
消失的服务处理器2025年12月11日地点在洛杉矶。在设计Oxide机架时需考虑部件可访问性及访问方式。Oxide机架部署在数据中心通过网络独家访问工程师仅在更换故障部件如磁盘时才需亲自前往机架。服务处理器 (Service Processor, SP) 可通过管理网络访问。最初将下一代Cosmo雪橇式服务器插入Oxide机架时服务处理器会从网络中消失这是个难调试的问题因无网络访问权限对SP状态了解有限。调试工作基于系统其他部分状态展开AMD主机CPU仍在运行表明系统仍在供电SP未通过管理网络广播存活状态网络数据计数器未增加风扇高速恒定运转可能是风扇控制器切换到紧急全功率模式该问题在机架外的雪橇式服务器上无法重现。服务处理器运行自定义操作系统Hubris系统各部分编写为独立任务。Hubris不是有严格期限保证的实时操作系统但有任务优先级概念。假设存在软件漏洞导致任务饥饿若网络任务因其他任务占用CPU时间无法运行就无法通过网络响应。任务饥饿可能是某个任务陷入无限崩溃循环所有CPU时间用于重启该任务。为此调整了任务重启时间增加延迟还将机箱LED从“常亮”改为闪烁。通过调试更改重现了问题但结果令人困惑LED有时一直亮有时一直灭。负责LED闪烁的任务优先级高限制了任务卡住的位置。用Rust编写Hubris可消除缓冲区溢出等错误但Hubris易出现栈溢出问题因需手动设置任务栈大小计算最大栈大小有挑战。虽加入emit-stack-sizes特性提高了检测栈大小不足的能力但仍可能有边缘情况。栈溢出时任务会安全重启内核栈溢出可能使系统看似无法运行但内核栈余量较大这种情况不太可能发生。此时需从系统获取更多调试信息有SWD调试接口但生产系统中通常不用。在Oxide办公室同事帮助下进行线缆连接成功重现问题但调试探头无法暂停CPU限制了提取诊断信息的能力。服务处理器使用Cortex - M7 STM32H7导致系统出现该状态的原因有限。这使重点放在确定系统中可能导致此行为的部分。与第一代Gimlet系统相比增加了FPGA控制更多系统部件如主机闪存。FPGA通过并行总线连接通过STM32H7灵活内存控制器访问。其主要目的是将AXI事务转换为外部设备协议满足外部存储设备访问时间要求。CPU可能因未收到外部设备总线确认信号而卡住如FPGA时序错误可能使CPU读取寄存器时永远挂起。为验证理论创建FPGA测试镜像使FMC总线挂起产生了相似行为表明找对了问题所在系统部分。通常依靠完整系统转储调试Hubris问题但无法暂停CPU就无法实现。不过ARM CPU支持向量捕获可配置CPU在复位时暂停。向量捕获复位使CPU恢复正常虽丢失程序计数器运行寄存器状态但RAM中其他Hubris状态保留且一致可看到Hubris任务运行但无访问FMC迹象。硬件工程师审查FPGA时序发现可能未满足内存接口时序约束。合并修复方案认为向量捕获转储不一致可能是缓存原因。关闭缓存实验时转储结果一致但未重现实际问题。接下来几周继续Hubris开发一项与测量启动工作有关的更改使同样症状再次出现且该更改易重现问题将重现时间从24小时以上缩短到10 - 20分钟。最初转储无明显问题但仍怀疑是FMC总线问题。高重现率让进行了许多实验但都未成功如调整复位频率和次数、清除FPGA位流、限制任务访问FMC总线、删除无关任务等。研究STM32H7手册发现处理器可能对FMC总线进行未预料到的访问。现代处理器有大量内部状态程序员无法直接看到CPU可能对与当前程序计数器无关的地址进行内存访问。Hubris利用内存保护单元 (Memory Protection Unit, MPU) 实现任务隔离和特权级别强制执行。配置为非特权任务使用MPU内核使用默认内存映射。FMC在任务中映射为无缓存设备内存而选择的基地址默认内存类型为普通缓存这使FMC根据访问主体不同有不同属性。ARMv7 - m参考手册讨论了不匹配内存属性问题“保留访问大小”值得怀疑FPGA接口设计为32位访问16位或8位访问可能导致问题。内核从未有意通过普通缓存映射访问FMC最可能情况是运行非特权任务的CPU访问FMC发出的存储操作进入处理器存储缓冲区发生中断进入特权模式存储操作命中缓存缓存试图以超出预期设备内存属性的方式写入内存。ARM建议软件不要对同一位置别名使用不匹配属性STM32H7 FMC支持更改基地址使基地址出现在地址空间符合要求的部分最终修复方案是更改基地址自修复方案合并后未再出现问题。透明度一直是Oxide的价值观调试现代CPU需深入低透明度领域。此次调试得益于ARM和ST的文档希望硬件供应商继续详细记录产品以造福客户。你所拥有的云产品计算存储网络规格公司主页原则职业机会活动新闻隐私政策解决方案公共部门VMware混合云科技金融人工智能主权云高性能计算持续集成/持续交付生态系统资源On the MetalOxide Friends博客周五问答订阅GitHub图标 领英图标