OS启动/重启阶段,误报Mngmnt Health告警

答案内容由AI生成,仅供参考:

OS启动/重启阶段误报Mngmnt Health告警分析与解决方案

问题描述

OS启动或重启阶段,系统产生 Mngmnt Health 告警(事件状态为 Asserted),提示“Sensor access degraded or unavailable”,该告警在OS启动完成后自动消除(Deasserted)。此现象虽为临时性事件,但导致装备流程误判系统异常,影响自动化运维稳定性。


环境信息

  • 操作系统:Ubuntu 24.04
  • 软件版本:OpenUBMC 2509
  • 硬件配置:安装华为 300IA2 NPU 卡(64GB)
  • 关键实体
    • NPU_1
    • Entity_GPUCard
    • ThresholdSensor_GPUPowerThresholdSensor_GPUDeviceTemp 等 NPU 相关传感器

故障现象

  1. 系统上电后,BMC 日志中出现多条 Mngmnt Health 告警:

    Sensor access degraded or unavailable
    
  2. 告警时间点集中在 OS 启动初期(BIOS 初始化之后,OS 完全加载之前)。

  3. 多个告警条目中,Sensor Number 不同,但均对应 Management Subsys Health 类型,事件类型为:

    Management Subsys Health #0x03: Sensor access degraded or unavailable

  4. 告警在 OS 启动完成后约 30–60 秒内自动清除。


根本原因分析

1. Mngmnt Health 告警机制原理

根据知识库信息:

  • Mngmnt Health 是一种 离散传感器(Discrete Sensor),用于聚合管理子系统的健康状态。
  • 当任意一个底层传感器出现 扫描异常无法访问 时,会触发该传感器上报“Sensor access degraded or unavailable”事件。
  • 触发条件是:某传感器的 ReadingStatus 属性值 非0(即 != 0)。
  • 在 IPMI 协议中,SelData2SelData3 字段用于标识具体是哪个传感器引发了事件。

:link: 参考文档:传感器管理常见问题指南


2. 日志分析定位问题传感器

从用户提供的 app.logsensor.log 提取关键信息:

(1)事件日志片段:

{
  "SelData2": 171,
  "SelData3": 0,
  "SensorNumber": 3,
  "SelType": 2,
  "Description": "Sensor access degraded or unavailable"
}
  • SelData3 == 0 → 传感器编号 = SelData2 = 171

(2)sensor.log 查找编号 171 的传感器:

[2026-01-28 07:46:33] sensor ThresholdSensor_GPUPower_0101010302 of host 0 is registered, number is 171.

:white_check_mark: 定位到:编号为 171 的传感器是 NPU 卡的功耗传感器(ThresholdSensor_GPUPower)


3. 上电阶段传感器行为分析

(1)NPU 上电顺序

  • BMC → BIOS → OS → 驱动加载完成 → NPU 通信建立 → 温度/功耗数据可读
  • OS 启动初期,BMC 尝试轮询 NPU 传感器,但由于:
    • NPU 驱动未加载
    • PCIe 链路未完全建立
    • MCU/FW 未就绪
      导致传感器 读值失败

(2)ReadingStatus 异常机制

根据文档《传感器管理常见问题指南》:

若连续传感器的 ReadingStatus 属性值 非0,则视为扫描异常,触发 Mngmnt Health 告警。

在 OS 启动初期,以下情况发生:

  • ThresholdSensor_GPUPowerThresholdSensor_GPUDeviceTemp 等传感器因无法获取真实值,其 ReadingStatus 被设为 1(异常)
  • sensor 模块检测到该状态变更,立即生成 SEL 事件
  • 事件类型:Sensor access degraded or unavailable
  • 汇总上报至 Mngmnt Health 传感器

4. 为什么 PowerState 无法用于控制

用户尝试使用 NPUCard.PowerState 来抑制告警:

"PowerState": "U8"  // 0: 下电, 1: 上电

但发现:

  • 即使 OS 已启动,PowerState 仍为 0
  • 表明 PowerState 依赖于驱动上报,存在延迟
  • 早于 PowerState 更新前,已有传感器状态异常

:cross_mark: 因此无法作为前置条件屏蔽告警。


解决方案建议

:white_check_mark: 推荐方案:引入 传感器防抖延迟机制

思路

OS 启动完成前,对 NPU 类传感器设置一个初始化窗口期,在此期间:

  • 允许传感器 ReadingStatus 为异常
  • 不生成 Sensor access degraded or unavailable 的 SEL 事件
  • 或将 Mngmnt Health 的上报延迟至 OS 稳定后

实现方式(基于 openUBMC 架构)

  1. 监听 OS 启动状态

    • 监控 Bios.SystemStartupStateOS_Status 信号
    • 状态变迁:BootCompleteOS running 为真时,认为初始化完成
  2. 配置传感器延迟使能

    • 在 CSR 配置中为 NPU 传感器添加 InitializationDelay 字段

    • 示例:

      {
        "ThresholdSensor_GPUPower_0101010302": {
          "Initialization": 127,
          "Capabilities": 232,
          "InitializationDelay": "P0DT30S",  // 延迟30秒后再启动监控
          "AssertMask": 128,
          "DeassertMask": 28800,
          ...
        }
      }
      
  3. 结合 ReadingStatus 过滤逻辑

    • 修改 sensor 模块逻辑,在 OS 启动完成前忽略 ReadingStatus == 1 的异常
    • 或仅当 ReadingStatus 持续异常超过阈值时间才上报

:white_check_mark: 替代方案:通过 Entity 在位状态控制传感器扫描

参考文档中提到:

传感器扫描状态受其关联 Entity 的 在位状态上电状态 控制。

可优化如下配置:

"ThresholdSensor_GPUPower": {
  "EntityId": "<=/Entity_GPUCard.Id>",
  "EntityInstance": "<=/Entity_GPUCard.Instance>",
  "EnableCondition": "expr($1.PowerState == 1 && $1.Health == 'OK')"
}
  • 只有当 Entity_GPUCardPowerState == 1 且健康时,才启用该传感器扫描
  • 避免在设备未就绪时强行读取数据

:pushpin: 要求:确保 Entity_GPUCardPowerState 能准确反映硬件真实状态。


:white_check_mark: 增强建议:添加日志关联提示

Mngmnt Health 告警触发时,自动输出 SelData2 对应的传感器名称(而非仅编号),便于快速识别源头。

可结合脚本实现:

# 解析 SEL 日志,映射编号到传感器名
grep "add sel" sensor.log | grep "Sensor access degraded" | \
awk '{print $NF}' | xargs -I {} grep "number is {}" sensor.log

结论

项目 内容
问题本质 OS 启动阶段 NPU 传感器未就绪,ReadingStatus 异常,触发 Mngmnt Health 告警
定位结果 告警由 ThresholdSensor_GPUPower(编号171)等 NPU 传感器引发
根本原因 缺乏 初始化等待机制,导致对未就绪传感器误判为故障
解决方向 引入 启动延迟状态依赖条件,避免早期误报
影响范围 所有依赖 OS 驱动通信的 PCIe 扩展卡(如 GPU/NPU/网卡)均可能复现

参考资料

:light_bulb: 建议:将此类启动阶段的瞬态告警纳入“可忽略事件白名单”,并通过 BMC 提供“系统启动中”状态标志,供上层管理系统判断是否应忽略这些临时告警。

相关链接:

  1. 板卡温度模拟获取失败,Mngmnt Health传感器信息无变化
  2. 使用ipmitool/web查看传感器事件出现报错的问题
  3. OS下电后NPU卡传感器的读值
  4. BMC CPU1 0V9_UNCORE传感器只有Deasserted没有Asserted事件
  5. CSR配置字典之TemperatureInfo类 | 文档中心 | openUBMC