MCX623436AN-CDAB热插拔操作产生温度告警

测试MCX623436AN-CDAB热插拔功能时


点击热插拔操作后,产生了温度异常告警:

BMC查看温度读值

我理解点击热插拔操作后,应该是给OCP riser进行了断电操作,不应该能够再获取到温度值,不知道180这个值从哪来的,测试多次,都会产生这个180固定值

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

总结

项目 分析结论
现象 热插拔后出现“超温”告警
根本原因 断电后传感器仍返回固定值180,状态未置为不可访问
根源机制 驱动/BMC中间层未正确处理设备离线状态,返回虚假有效值
风险点 导致误报严重告警,影响运维判断
解决方案 1. 修复Status状态判断
2. 增加电源状态过滤
3. 屏蔽热拔期间告警

:wrench: 建议动作
联系BMC开发团队检查 Scanner_NIC_Lm75 模块的异常处理逻辑,并在 openUBMC 中提交缺陷单进行修复。

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

MCX623436AN-CDAB热插拔后温度告警问题分析

问题概述

在对 MCX623436AN-CDAB 网卡执行热插拔操作后,系统出现了OCP卡温度异常告警。实际监测到温度读值为180(对应122°C),超出了105°C的过温阈值,触发了轻微和严重级别的告警。

值得注意的是,用户预期在执行热插拔操作(即通知式断电)后,OCP riser 应已断电,理论上不应再能获取到有效的温度数据。然而系统仍读取到了一个固定的 180 值,表明存在异常行为。


设备信息确认

根据提供的信息,该网卡具体信息如下:

  • 网卡型号:MCX623436AN-CDAB
  • 制造商Mellanox
  • 芯片型号:CX6-DX
  • 接口类型:2×100GE
  • 资源归属:CPU0
  • PCB版本:.A
  • 总线地址:0000:20:08.0(注:文档中显示为0000:60:00.0可能存在不一致,需核实)

此网卡为 Mellanox ConnectX-6 Dx 系列产品,支持 OCP(Open Compute Project)标准,具备热插拔能力。


告警与温度读值分析

当前告警详情

  • 事件码0x08000003
  • 告警描述

    “The OCP Card 5 (MXC623436AN-CDAB) OCP temperature (122 degrees C) exceeds the overtemperature threshold (105 degrees C).”

  • 告警级别:轻微 → 严重
  • 产生时间:2026-04-02 17:38:36

温度传感器读取情况

执行命令查看传感器状态:

% lsprop Scanner_NIC_Lm75_0101030B08

返回结果显示:

  • Status=0:表示传感器访问正常(成功通信)
  • Value=180:原始寄存器读数
  • Offset=1Size=1Type=0:配置表示从指定地址偏移1字节读取1字节温度值

该原始值 180 会被转换为摄氏温度(通常为带符号8位整数),即:

  • 180(无符号) → 转换为有符号后为 -76°C
    但系统显示为 122°C,说明存在错误解析或虚假值。

:warning: 矛盾点:热插拔后理应断电,但传感器仍可访问且返回固定值180,严重违背硬件逻辑。


根本原因分析

结合知识库信息及现象,可能的原因如下:

1. 热插拔后电源未完全切断(电源残留或控制异常)

尽管执行了“热插拔”操作,其本质是通过BMC向Riser板CPLD发送指令进行“通知式断电”,但以下情况可能导致电源未真正关闭:

  • CPLD控制逻辑异常,未正确切断 CardPowerGood
  • 电源模块存在回路或电容残存电压
  • Riser板设计缺陷导致部分电路仍带电

然而,即使电源未完全切断,也不应返回固定不变的180值,这更倾向于伪数据或默认值


2. 温度传感器返回假数据或寄存器未正确初始化

Scanner_NIC_Lm75 使用的是 LM75 类型温度传感器,其数据存储于 I²C 设备寄存器中。若设备断电或未响应,正常情况应出现:

  • I²C 通信失败(NACK)
  • Status ≠ 0
  • Value 不应更新或保持上次缓存值

但当前 Status=0Value=180,说明:

  • I²C 通信被模拟成功(可能是驱动/中间层伪造)
  • 传感器驱动未检测到设备离线
  • 可能存在软件层缓存或默认值注入机制

在相关文档(如ID=1)中提到:Scanner_NIC_Lm75 status 表示是否可以访问 LM75。当电源断开时,应无法访问。若 Status=0 却读出固定值,表明硬件层面访问失败但软件未正确处理异常


3. 驱动或BMC中间件返回默认/残留值

最可能的解释是:

  • 网卡断电后,I²C 设备不再响应
  • BMC 的 hwproxykepler 组件在扫描失败时,未将 Status 设置为错误,反而返回了上次缓存值或默认值 180
  • 上层应用错误地将此值作为真实温度解析,导致误报高温

此外,测试中“多次都返回180”这一现象进一步支持这是一个固定兜底值或初始化默认值,而非真实测量。


4. 配置逻辑缺陷:告警条件未考虑热拔状态

根据知识库文档:

"Event_TempFail": {
    "Reading": "<=/Scanner_NIC_Lm75.Status; <=/Scanner_CardPowerGood.Value |> expr($2 == 0 ? 0 : $1)"
}

该表达式意为:当 CardPowerGood = 0(断电)时,忽略温度不可访问的问题,不触发告警

但当前触发的是 “超温”告警,而非“读取失败”告警,说明:

  • 系统认为温度可读且过高
  • 即使在断电状态下,由于 Status=0Value=180,系统误判为真实高温

:white_check_mark: 结论:真正的Bug在于——断电后仍返回“有效”温度读数,导致防护机制失效。


解决建议

:white_check_mark: 1. 检查并修复传感器访问逻辑

  • 修改驱动或 scanner 模块行为:当检测到设备断电或I²C通信失败时,必须设置 Status ≠ 0
  • 禁止在设备离线时返回有效 Value

:white_check_mark: 2. 加强告警判断条件

在“超温”告警判断前,增加对以下状态的校验:

if Scanner_CardPowerGood.Value == 0 then
    -- 卡已断电,忽略所有传感器告警
    return false
end

:white_check_mark: 3. 引入热拔状态过滤机制

network_adapter 组件中,点击热插拔后设置 ReadyToRemove = true,此时应:

  • 主动屏蔽该卡的所有传感器告警
  • 清除缓存的传感器读数
  • 直到重新插入并完成识别流程后再恢复监控

:white_check_mark: 4. 验证I²C通信底层行为

建议执行底层命令验证设备是否存在:

i2cget -y -f <bus> 0x3E

(LM75默认地址为0x48~0x4F,此处Chip_NICTempChip地址为62即0x3E)

预期结果:

  • 热拔后应返回 Connection timed outNACK
  • 若仍可读取,需检查硬件设计或CPLD隔离逻辑

总结

项目 分析结论
现象 热插拔后出现“超温”告警
根本原因 断电后传感器仍返回固定值180,状态未置为不可访问
根源机制 驱动/BMC中间层未正确处理设备离线状态,返回虚假有效值
风险点 导致误报严重告警,影响运维判断
解决方案 1. 修复Status状态判断
2. 增加电源状态过滤
3. 屏蔽热拔期间告警

:wrench: 建议动作
联系BMC开发团队检查 Scanner_NIC_Lm75 模块的异常处理逻辑,并在 openUBMC 中提交缺陷单进行修复。