冷复位BMC产生电源冗余告警问题分析
更新时间: 2026/05/28
在Gitcode上查看源码

问题背景

  • 单板类型:NA;
  • 软件版本:openUBMC 25.09;
  • 涉及功能:事件&告警;
  • 触发条件:冷重启BMC。
  • 业务表现:预期重启正常无误告警;实际冷复位BMC偶现产生电源冗余告警。

问题复现步骤

冷复位BMC产生电源冗余告警。

关键日志信息

查看日志,确认报错如下:

定位过程

  1. 分析整体故障链路

  2. 关键组件交互分析

    • RedundancyFailure的状态

      • 默认值:false(冗余正常)
      • 触发为 true 的条件:
        • AC 上电时检测到可用 PSU 数量 < 配置数量
        • 系统运行中 PSU 故障或移除
        • BMC 初始化阶段,主动设置为 true(来自 power_strategy 模块)
      • 恢复为 false 的时机:
        • 检测到所有 PSU 可用且输出稳定
        • 依赖 OnePower 模块加载完成并上报状态
    • Event_PSURedundancyLost_01010A 触发逻辑

      • 事件对象:Event_PSURedundancyLost_01010A
      • 触发条件:Reading <= /PowerStrategy_1.RedundancyFailure
      • 操作符:OperatorId: 5(表示“小于等于”)
      • 条件值:Condition: 1
      • Hysteresis(回差):0(无防抖)

    这意味着:

    • 当 RedundancyFailure == true(即值为 1)时:
      • 1 <= 1 → True → 触发告警
    • 当 RedundancyFailure == false(即值为 0)时:
      • 0 <= 1 → 依然为 True,但这是“恢复”条件,不会重复触发

    所以:只要 RedundancyFailure 曾短暂为 true,且持续时间足够触发事件判断,就会生成 SEL 告警。

  3. 日志中分析,确实存在异常时序:

    text
    2025-07-21 07:56:15.119412 power_strategy NOTICE: base.lua(99): Sync object prop(NormalAndRedundancy_Supported): false
    2025-07-21 07:56:19.610659 power_strategy NOTICE: energy_metric.lua(187): Set RedundancyFailure to true
    2025-07-21 07:56:28.855209 power_strategy NOTICE: base.lua(99): Sync object prop(NormalAndRedundancy_Supported): false
    2025-07-21 07:56:42.281822 event NOTICE: events.lua(110): System major count change 0 to 1 by [Event_PSRedundancyLost_01010A]

    RedundancyFailure 被设置为 true 约 23 秒后才触发告警(实际可能由事件轮询周期决定),在此期间,OnePower 尚未加载,无法确认 PSU 是否真实冗余失效。

问题原因

虽然 RedundancyFailure 为 false 表示冗余正常,但在 BMC 冷复位(Cold Reset)过程中,该状态会经历一个短暂的变化周期(false → true → false)。告警触发的原因是这个状态在短时间内为 true,而非 false。power_strategy 模块在 BMC 重启时,在 PSU 状态尚未同步前就将 RedundancyFailure 设置为 true,且未设置防抖。

解决方案

  1. 增加状态防抖机制:

    • 在 PowerStrategy_1.RedundancyFailure 从 false 变为 true 时,设置一个 30 秒的等待窗口,仅当持续为 true 才触发事件。
    • 修改 Event_PSURedundancyLost_01010A 的 Hysteresis 属性为 30(单位秒)。
  2. 延迟冗余状态判断:

    • 将 RedundancyFailure 设置为 true 的逻辑,推迟到 OnePower 模块加载完成之后。
    • 可通过监听 OnePower 的初始化完成信号来实现。
  3. 优化初始化流程:

    • 在 energy_metric.lua(187) 中增加前置检查:
    lua
    if OnePower.isInitialized() then
        RedundancyFailure = true
    end