当前位置: 首页 > news >正文

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 Metal
  • Oxide & Friends
  • 博客
  • 周五问答
订阅

GitHub图标 领英图标

http://www.jsqmd.com/news/921846/

相关文章:

  • 豆包GEO获客:我理解的豆包GEO,不是技巧,而是一套获客系统 - 招财兔数字员工
  • 《Interfaces》杂志聚焦界面设计,订阅享多权益开启构建界面知识之旅
  • 如何快速部署医疗AI:18个医学图像数据集的完整实战指南
  • Windows 11自带神器Hyper-V,零成本搭建Linux测试环境保姆级教程
  • Win11系统下Eplan2023安装保姆级教程,附hosts文件修改与防火墙关闭避坑指南
  • 从‘椒盐八人图’到你的科研数据:手把手教你用MATLAB medfilt2处理实验图像与二维数据
  • 破解“仅我可见”难题:构建可感知上下文的数字产品设计
  • SpaceX拟募资750亿美元冲击最大IPO,2万亿美元估值是机遇还是套利?
  • UE5.2 + Win10 + AirSim 避坑指南:从编译报错到成功运行Car模式的完整流程
  • 【免费开源】STM32 MQTT远程继电器网关4路智能开关物联网控制完整工程项目分享
  • 保姆级教程:在VMware上给Ubuntu 22.04虚拟机配置国内镜像源(附最佳服务器选择)
  • AI读懂企业:企业要成为豆包愿意推荐的答案,先要让它读懂你 - 招财兔数字员工
  • GPT驱动SaaS产品交互革命:从JSON到提示词驱动UX的工程实践
  • 从‘图书馆出版物’到你的项目:手把手教你用类图、状态图和DFD完成一次完整的OOA
  • 超越TextMeshPro?手把手教你为Unity旧版Text组件实现智能标点避头尾
  • 从马克·吐温的讽刺实验到现代AI伦理:用Python和GPT-4重演《可恶的人类》动物对比
  • 移动端项目实战:手把手教你用Vue3+Vant封装一个树状多选组件(附完整代码)
  • 5分钟搞定B站视频下载:免费保存大会员4K超清内容终极指南
  • 告别随机采样!用Python手把手实现强化学习中的优先经验回放(附SumTree代码详解)
  • Qt5.15项目里QWebEngine加载网页卡死?别急着改代理,先看看Windows这个隐藏设置
  • 有效内容覆盖,豆包GEO的核心不是刷屏,而是让内容有意义地覆盖 - 招财兔数字员工
  • UE4材质进阶:别再直接调UV了,手把手教你精准控制法线贴图强度(附完整蓝图)
  • 基于Wav2Vec 2.0构建端到端语音识别系统:从原理到实践
  • 别再乱用-duty_cycle了!用create_generated_clock搞定复杂时钟占空比的3个实战技巧
  • 别再只会用默认缓动了!Unity DOTween 20+种Ease曲线实战速查手册(附场景应用建议)
  • 保姆级教程:在Ubuntu 14.04上为ARM平台交叉编译支持WebRTC的ZLMediaKit
  • 3步智能激活:Windows与Office永久授权的完整解决方案
  • 从灵感到产品:系统化评估与实现App创意的完整指南
  • 加密数据湖架构:安全查询与密钥管理解析
  • 别再重启服务器了!手把手教你用Livepatch给Linux内核打热补丁(附实战避坑)