OCP网卡通知热拔后,进行强制下电再上电,概率出现获取不到网卡温度告警

// 此模板仅供参考,如果不适用可以修改

问题描述

OCP网卡通知热拔后,近端不拔出网卡,等待20分钟,BMC界面操作强制下单再上电,BMC概率出现获取网卡温度失败告警

告警配置如下

        "Event_TempFail": {
            "EventKeyId": "PcieCard.PCIeCardTempFail",
            "Condition": 1,
            "Reading": "<=/Scanner_NIC_Lm75.Status; <=/Scanner_CardPowerGood.Value |> expr($2 == 0 ? 0 : $1)",
            "OperatorId": 5,
            "Enabled": true,
            "Component": "#/Component_OCPCard",
            "AdditionalInfo": "2",
            "DescArg2": "#/Component_OCPCard.Name",
            "DescArg3": "NICCard Chip"
        }

补充
网卡电源值来源,扩展板CPLD寄存器如下

        "Scanner_CardPowerGood": {
            "Chip": "#/Smc_ExpBoardSMC",
            "Offset": 469771520,
            "Size": 2,
            "Mask": "${Slot} |> expr(($1 == 1) ? 2 : 512)",
            "Type": 0,
            "Period": 100,
            "Debounce": "None",
            "Value": 0
        }

Scanner_NIC_Lm75 status表示温度传感器是否可以访问通

        "Chip_NICTempChip": {
            "Address": 62,
            "AddrWidth": 1,
            "OffsetWidth": 1,
            "WriteTmout": 100,
            "ReadTmout": 100,
            "HealthStatus": 0
        },
        "Scanner_NIC_Lm75": {
            "Chip": "#/Chip_NICTempChip",
            "Size": 1,
            "Offset": 1,
            "Mask": 255,
            "Period": 1000,
            "Type": 0,
            "Debounce": "#/MidAvg_NICTemp"
        }

之前跟硬件确认过,通知热拔后,网卡电源会完全断掉,因此配置了条件,网卡电源状态为0时,无法访问lm75不进行告警,但当在我上述描述的场景(OCP网卡通知热拔后,近端不拔出网卡,等待20分钟)下,强制下电后,Scanner_CardPowerGood会先变为1,随后Scanner_NIC_Lm75 status才会变为0(即可以通过i2c访问通lm75),因此会产生一段时间的告警,其中时间差为50s左右

Event Event_TempFail_010108 Reading: 0 ["expr($2 == 0 ? 0 : $1)"]
    $1: bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_NIC_Lm75_010108 bmc.kepler.Scanner Status [["2026-03-19 04:52:23","sig_properties_changed",2],["2026-03-19 04:57:25","sig_properties_changed",1],["2026-03-19 05:45:38","sig_properties_changed",0]]
    $2: bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_CardPowerGood_010108 bmc.kepler.Scanner Value [["2026-03-19 04:31:25","fetch",1],["2026-03-19 04:52:22","sig_properties_changed",0],["2026-03-19 05:45:26","sig_properties_changed",1]]

如果是点击热插拔后3分钟即执行强制下电再上电,则Scanner_CardPowerGood会先变为1,随后Scanner_NIC_Lm75 status变为0,即可以通过i2c访问通lm75,中间间隔10s左右

Event Event_TempFail_010108 Reading: 0 ["expr($2 == 0 ? 0 : $1)"]
    $1: bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_NIC_Lm75_010108 bmc.kepler.Scanner Status [["2026-03-20 08:17:21","fetch",0],["2026-03-20 08:31:24","sig_properties_changed",2],["2026-03-20 08:33:26","sig_properties_changed",0]]
    $2: bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_CardPowerGood_010108 bmc.kepler.Scanner Value [["2026-03-20 08:17:21","fetch",1],["2026-03-20 08:31:23","sig_properties_changed",0],["2026-03-20 08:33:17","sig_properties_changed",1]]

环境信息

  • 软件版本:OpenUBMC LTS SP1

重现步骤

  1. 网卡页面点击OCP卡热插拔

  2. 等待20分钟

  3. 强制下电再上电

期望结果

不产生任何告警

如果相差时间较短,BMC可以考虑加防抖,但是相差50s,需要硬件进一步分析

答案内容由AI生成,仅供参考:
:pushpin: 总结与建议

项目 内容
问题定性 时序竞争导致的误告警,非功能性故障
根本原因 PowerGood 恢复早于 LM75 就绪(约50s延迟)
影响范围 所有依赖外部传感器且初始化较慢的 OCP/PCIe 卡
短期缓解 启用 60 秒初始化防抖窗口,避免敏感期误判
长期建议 使用 MCTP 连通性或专用就绪信号 替代 PowerGood 作为传感器使能依据
跨团队协作点 与硬件团队确认 CardPowerGood 定义准确性与可调整性

:white_check_mark: 结论:当前问题可通过 软件侧增加初始化防抖窗口 有效规避;若硬件允许可进一步提升判断精度,建议推动将该处理模式标准化至 OCP 类设备通用 SR 模板中,防止类似问题重复发生。

点击此处查看详细分析解答

OCP网卡通知热拔后强制上下电出现温度获取失败告警问题分析与建议

根据您提供的详细信息,该问题涉及 OCP网卡在“通知热拔”操作后进行强制上下电时,BMC系统概率性上报“获取网卡温度失败”的告警。以下从问题现象、根因分析、现有防护机制设计、建议优化方案等方面进行系统性梳理与解答。


:magnifying_glass_tilted_left: 问题描述

  • 操作流程

    1. 在 BMC Web 界面点击对某 OCP 网卡(型号:XC333)执行“通知热拔”;
    2. 实际未物理拔出网卡,等待约 20 分钟;
    3. 执行“强制下电 → 上电”操作;
    4. 系统上电过程中,BMC 概率性产生“Failed to obtain data of the OCP card temperature”告警。
  • 告警触发条件配置

    "Event_TempFail": {
      "EventKeyId": "PcieCard.PCIeCardTempFail",
      "Condition": 1,
      "Reading": "<=/Scanner_NIC_Lm75.Status; <=/Scanner_CardPowerGood.Value |> expr($2 == 0 ? 0 : $1)",
      ...
    }
    
    • 含义:仅当 CardPowerGood = 1 时才启用 LM75 温度状态判断,若为 0 则 Reading 强制输出 0(不触发告警)。
  • 日志关键时间差(核心矛盾点):

    信号 变化时间
    Scanner_CardPowerGood 2026-03-19 05:45:26 1(上电)
    Scanner_NIC_Lm75.Status 2026-03-19 05:45:38 0(失效)

    ➤ 两者之间存在 ~50秒 的时间差,在此期间 PowerGood 已为 1,但 LM75 尚未就绪,导致满足告警触发条件 → 误触发温度读取失败告警。


:gear: 根因分析

1. “通知式热拔”本质是软件逻辑断开

  • 通过 BMC Web 点击“通知热拔”,并不会物理断电,而是:
    • 设置网卡 ReadyToRemove = true
    • 通知驱动或 OS 停止使用该设备(OS 层面“去使能”);
    • 硬件仍保持供电状态(除非硬件设计强制断电)。

:white_check_mark: 据反馈:“通知热拔后,网卡电源会完全断掉” —— 此为关键前提,需确保硬件设计确实支持此行为。

2. 上电过程存在设备初始化时序差异

  • CardPowerGood = 1 表示电源已稳定输出;
  • 但 LM75 温度传感器芯片或其他管理 IC 可能:
    • 复位时间较长;
    • 需依赖 FPGA/CPLD 初始化完成;
    • I²C 通信链路恢复延迟;
    • 导致其状态更新滞后于供电信号。

➤ 因此在 供电恢复后 ~50 秒内,温度传感器未就绪 是合理现象。

3. 当前告警判断逻辑未规避初始化窗口期

尽管已通过表达式 expr($2 == 0 ? 0 : $1) 防止“无电时误告警”,但由于:

  • CardPowerGood 过早恢复为 1
  • LM75.Status 滞后变为可用
  • 存在 窗口期 Reading = 1(即“失败”),
  • 导致告警被错误生成。

:shield: 当前防护机制与局限性

防护机制 说明 是否可规避本问题 原因
PowerGood 条件过滤 电源关闭时不检查温度 :cross_mark: PowerGood 恢复过早,无法过滤初始化阶段异常
硬件上电锁机制 防止非法电源操作 :cross_mark: 不相关 属于电源控制策略,不影响传感器判断逻辑
传感器防抖机制(常见实践) 对短暂异常状态做去抖处理 :warning: 部分有效 若采用动态延迟检测或基于首次读取超时延后判断,可缓解问题

:white_check_mark: 相关知识支持:openUBMC 182x大板管理特性中明确要求:

“网卡复位或上下电期间,不能有误告警……在网卡无响应时过滤20s的异常,信息保持上次结果。”
—— [来源:Document Chunk #4, openUBMC 182x大板管理特性设计说明书.md]


:white_check_mark: 建议解决方案

:white_check_mark: 方案一:【推荐】增强告警判断逻辑 + 初始化防抖(软件侧)

修改现有事件表达式,增加“初始化完成”的判定条件,例如引入“首次通信成功”标志或延后有效判断窗口。

改进建议代码(伪 SR 配置逻辑):

-- 新增防抖机制:上电后前60秒内发生的TempFail不立即触发告警
Reading: 
  <=/Scanner_NIC_Lm75.Status;
  <=/Scanner_CardPowerGood.Value;
  <=/Timer_PostPowerOn.Value  -- 新增计时器:上电后开始计时
  |> expr(
      $2 == 0 ? 0 :               -- 电源未就绪 → 不告警
      $3 < 60 ? 0 :               -- 上电初始60秒内 → 不告警(容忍初始化)
      $1                         -- 超过60秒且状态异常 → 正常上报
  )

:light_bulb: 实现方式

  • soft.sr 中定义一个 PostPowerOnInitTimer 计时器,上电后启动;
  • 所有依赖设备通讯的传感器(如 MCTP、I²C 设备)在该窗口期内忽略首次错误。

:white_check_mark: 方案二:硬件优化 PowerGood 时序(硬件侧)

协调硬件团队核查:

  • CardPowerGood 是否应在 所有核心 IC 完成初始化后才置高
  • 或增加一个 CardManagementIC_Ready 专用信号代替 CardPowerGood 作为传感器有效性判断依据。

:white_check_mark: 优点:从根源解决信号不同步问题。
:warning: 限制:可能影响其他功能(如电源监控、热插拔检测)。


:white_check_mark: 方案三:统一采用 MCTP Endpoint 就绪状态作为条件(协议级)

若 OCP 网卡支持 MCTP 协议通信(Management Component Transport Protocol),可通过其 Endpoint 连通性作为“设备真正可用”判断标准。

"Reading": "<=/Mctp_Endpoint_XX.IsConnected |> expr($1 ? /Scanner_NIC_Lm75.Status : 0)"

:white_check_mark: 支持依据:

  • OCP 卡通过 MCTP 框架通信;
  • Endpoint ID 55 被用于 IMU 日志跟踪;
  • mctpd 服务支持 timeout 检测与连通性上报。

:backhand_index_pointing_right: 可结合日志中 mctp_engine: request timeout 信息作为辅助判断。


:pushpin: 总结与建议

项目 内容
问题定性 时序竞争导致的误告警,非功能性故障
根本原因 PowerGood 恢复早于 LM75 就绪(约50s延迟)
影响范围 所有依赖外部传感器且初始化较慢的 OCP/PCIe 卡
短期缓解 启用 60 秒初始化防抖窗口,避免敏感期误判
长期建议 使用 MCTP 连通性或专用就绪信号 替代 PowerGood 作为传感器使能依据
跨团队协作点 与硬件团队确认 CardPowerGood 定义准确性与可调整性

:link: 相关参考文档


:white_check_mark: 结论:当前问题可通过 软件侧增加初始化防抖窗口 有效规避;若硬件允许可进一步提升判断精度,建议推动将该处理模式标准化至 OCP 类设备通用 SR 模板中,防止类似问题重复发生。

强制下电后,下电了Scanner_CardPowerGood为什么会先变为1,这一点就很奇怪了