Linux 内核 RAS 原理剖析与实践案例

最后更新: 2026-03-26, 作者: 王洪磊

业务背景与挑战

在大规模分布式 AI 模型训练场景中,训练任务往往横跨数千台服务器,涉及海量计算、通信与存储资源,系统复杂度极高,硬件故障发生概率显著增加。一旦单机故障未被及时发现,常引发级联效应,导致整个训练任务中断或严重减速,造成数小时的资源浪费。

典型故障多源于单机硬件问题(如 CUDA 错误、NVLink 链路异常、内存 ECC 错误等),进而扩散至 NCCL 通信超时或网络中断,影响数百台节点同时空闲。下图展示了常见故障类型、发生频率,以及各类监控指标对故障的覆盖比例:

HUATUO 项目支持监控的硬件故障类型包括:

  • CPU 及其 L1/L2/L3 Cache、TLB
  • 内存 ECC 错误
  • PCIe 设备错误
  • 网卡物理链路状态
  • PFC / RDMA 网络拥塞
  • ACPI 系统事件
  • GPU MetaX 相关故障

本文重点剖析 Linux 内核 RAS 相关机制的原理实现,并结合实际案例说明其应用价值。

原理剖析

HUATUO(https://github.com/ccfos/huatuo)基于 Linux 内核的 MCE(Machine Check Exception)和 RAS 框架,通过 eBPF 高效捕获关键硬件事件,并关联设备详细信息。自内核 2.6 版本起,RAS 机制持续演进,引入了大量 tracepoint,支持轻量级、事件驱动的故障监控,足以覆盖绝大多数高频硬件故障场景。同时,HUATUO 还扩展支持网卡物理链路状态及 PFC/RDMA 拥塞监控。

硬件故障分类(以 Intel 处理器为例)

现代 CPU 具备一定程度的硬件故障恢复能力。固件可自动处理可恢复故障;当故障无法自行恢复时,CPU 会将错误信息记录在特定 MSR(Model-Specific Register)中,并通过中断通知操作系统。

根据 IA32_MCi_STATUS 寄存器的状态,故障主要分为以下几类:

  • SRAR(Software Recoverable Action Required):需要软件介入恢复的故障。若影响内核指令或关键数据,可能触发 kernel panic;若仅影响用户态进程,则可通过软件手段恢复。
  • SRAO(Software Recoverable Action Optional):可选恢复的故障。通常表示某些内存区域已损坏,但尚未被使用,系统仍可正常工作。MCE 或 CMCI 可上报此类错误,内核可根据 IA32_MCi_MISC 和 IA32_MCi_ADDR 等寄存器信息决定是否执行恢复操作。
  • UCNA(Uncorrected No Action Required):无需立即干预的未纠正故障。通过 CMCI 上报,表明系统已出现数据损坏,但处理器状态良好。虽无需立即处理,但大量 UCNA 事件提示潜在系统风险。

Linux 内核的 MCE 机制是硬件故障的核心感知与处理枢纽,而 RAS 框架则负责各类设备的针对性处理。

RAS

RAS(Reliability, Availability and Serviceability)是 Linux 内核保障系统可靠性的核心架构,主要包含以下子模块:

  • EDAC(Error Detection And Correction):负责主流内存控制器的错误检测与纠正。
  • APEI(ACPI Platform Error Interface):支持 ACPI 相关的电源、即插即用设备等故障检测。
  • AER(PCI Express Advanced Error Reporting):针对 PCIe 设备的增强错误报告。

RAS 相关代码在内核中分布较广,下图整理了主要模块间的关系:

MCE 与 RAS 的协同处理流程

MCE 作为故障感知中枢,大多数硬件错误会先通过 MCE 中断或轮询被捕获。MCE 尝试自主处理部分可纠正错误(如读取 ECC 信息并恢复),同时为不同设备提供注册回调机制。 RAS 支持的设备模块通过向 MCE 框架注册回调函数,将各自的故障信息统一汇总,最终以标准化格式上报用户态。 以 Intel Xeon E5-2620 处理器的内存控制器为例(EDAC 模块为 sbridge):

  • MCE 处理核心函数为 do_machine_check(),它会遍历 x86_mcd_decoder_chain 中已注册的设备回调。
  • sbridge 模块注册的回调 sbridge_mce_check_error() 负责处理内存控制器相关的 MCE:
    • 判断错误类型(Corrected / Uncorrected / Fatal 等);
    • 识别错误来源(读错误、写错误、地址/命令错误、Scrubbing 错误等);
    • 读取详细错误信息(Error Code、EDRAM Bank、物理地址、Row/Column/Bank 等)。
  • 处理完成后,调用 EDAC 公共函数 edac_mc_handle_error() 进行信息格式化与上报。

edac_mc_handle_error() 中的 tracepoint: mc_event 为上层监控工具提供了可靠的事件源。

PCIe / AER 错误报告机制

PCIe 规范定义了两种错误报告方式:基础错误报告(所有设备必备)和可选的 AER(Advanced Error Reporting)能力。AER 提供更丰富的寄存器组,用于详细错误定位与分析。

AER 通过状态寄存器记录错误,软件处理后需清除对应 bit 以恢复状态。以下为高级可纠正错误状态寄存器(Correctable Error Status Register)示例,错误发生时硬件自动置位对应 bit,软件写 1 清零:

高级可纠正错误屏蔽寄存器(Correctable Error Mask Register)允许软件选择性屏蔽特定错误报告(默认不屏蔽):

在 PCIe 拓扑中,Root Port 是错误消息的汇聚点。下游设备发生错误时,会将包含源设备 BDF(Bus:Device:Function)信息的 Error Message 发送给 Root Port。Root Port 再根据配置决定是否向系统上报。

内核中 AER 处理流程主要在中断上下文中完成:

irq_thread()
 → irq_thread_fn()
    → aer_isr()
    → aer_process_err_devices()
        → aer_print_error()      // 打印错误信息
        → handle_error_source()  // 清除或恢复错误

HUATUO 重点关注 aer_process_err_devices() 中的 tracepoint: aer_event,可获取设备标识、错误类型等完整信息,足以精确定位 PCIe 设备故障。

应用实践案例

HUATUO 通过 tracepoint 实时捕获硬件故障事件,记录故障类型、设备标识、详细错误描述及时间戳等信息,并支持本地存储与 Elasticsearch 持久化。

网卡链路故障示例

HUATUO 捕获的线上网卡 carrier down 事件(经排查为光模块信号衰减导致),导致业务指标出现明显抖动:

交换机侧确认光模块问题:

{
  "hostname": "your-host-name",
  "region": "xxx",
  "uploaded_time": "2026-03-05T18:28:39.153438921+08:00",
  "time": "2026-03-05 18:28:39.153 +0800",
  "tracer_name": "netdev_event",
  "tracer_time": "2026-03-05 18:28:39.153 +0800",
  "tracer_type": "auto",
  "tracer_data": {
    "ifname": "eth0",
    "index": 2,
    "linkstatus": "linkstatus_admindown",
    "mac": "5c:6f:11:11:11:11",
    "start": false
  }
}

linkstatus 可能取值包括:

  • linkstatus_adminup / linkstatus_admindown
  • linkstatus_carrierup / linkstatus_carrierdown

配套硬件丢包指标示例:

huatuo_bamai_netdev_hw_rx_dropped{host="hostname",region="xxx",device="eth0",driver="ixgbe"} 0

RDMA PFC 网络拥塞指标:

# HELP huatuo_bamai_netdev_dcb_pfc_received_total count of the received pfc frames
# TYPE huatuo_bamai_netdev_dcb_pfc_received_total counter
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="0",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="1",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="2",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="3",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="4",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="5",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="6",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_received_total{device="enp6s0f0np0",host="hostname",prio="7",region="xxx"} 0
# HELP huatuo_bamai_netdev_dcb_pfc_send_total count of the sent pfc frames
# TYPE huatuo_bamai_netdev_dcb_pfc_send_total counter
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="0",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="1",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="2",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="3",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="4",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="5",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="6",region="xxx"} 0
huatuo_bamai_netdev_dcb_pfc_send_total{device="enp6s0f0np0",host="hostname",prio="7",region="xxx"} 0

通用 RAS 硬件故障指标

huatuo_bamai_ras_hw_total{host="hostname",region="xxx"} 0

内存故障案例

线上机器内存 corrected 错误监控与详细日志:

触发故障的设备:MEM
故障类型:CORRECTED
tracer触发时间:2026-03-01 15:41:13.027
触发源:EDAC
具体设备反馈信息:
memory read error on CPU_SrcID#0_MC#1_Chan#0_DIMM#0 (mc: 1 location:0:0:-1 address: 0x3ddc84140 grain:32 syndrome:0x0  err_code:0x0101:0x0090 ProcessorSocketId:0x0 MemoryControllerId:0x1 PhysicalRankId:0x0 Row:0x15da Column:0x100 Bank:0x3 BankGroup:0x1 retry_rd_err_log[0001a209 00000000 00800000 0440d001 000015da] correrrcnt[0001 0000 0000 0000 0000 0000 0000 0000])

总结

Linux 内核 RAS 机制结合 MCE、EDAC、AER 等子系统,构建了从硬件错误感知到软件层上报与恢复的完整链路。HUATUO 项目通过 eBPF 轻量级捕获关键 tracepoint,实现对 CPU、内存、PCIe、网卡等硬件故障的实时、精准监控,为大规模分布式系统提供了可靠的故障诊断能力。


篇尾:

  • HUATUO(华佗)是由滴滴开源并依托 CCF 孵化的操作系统深度观测项目。
  • 关注微信公众号,或扫码加微信,邀请你加入用户群(请备注姓名+单位):

微信