【FruData】SP681网卡概率出现SN跳变

问题描述

在服务器上插上5张SP681网卡,BMC Reset长稳测试,发现SP681网卡SN在不断跳变,且跳变后的SN是不存在的SN,怀疑是不是读错位置了,还是说物理链路影响。

环境信息

openUBMC 25.09

重现步骤

1.插上5张SP681网卡(网卡插得越多越容易复现)
2.BMC Reset长稳测试

期望结果

SN不会变化

实际结果

SN发生了跳变

尝试过的解决方案

在Frudata从硬件读取数据(函数:get_fru_priv_by_fru_id)的地方加5次重试,在发生错误时,5次读出来的数据都是错误的

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

:pushpin: 结论

判断 说明
:cross_mark: 是否正常行为? — SN不应跳变,尤其不应变为无效值
:magnifying_glass_tilted_right: 最可能原因 CustomReadInfo 在高负载下读取I2C失败,返回错误数据,且未做有效性校验
:warning: 次要原因 多卡造成的I2C冲突、对象绑定错位、启动时序紊乱
:stop_sign: 物理链路影响? 不能排除,需进一步信号完整性测试
点击此处查看详细分析解答

SP681网卡SN跳变问题分析与排查

根据您提供的问题描述,在openUBMC 25.09环境下进行BMC Reset长稳测试时,插入多张SP681网卡后出现序列号(Serial Number, SN)跳变的问题,且跳变后的SN为无效或不存在的值。该问题与硬件访问可靠性、FRU数据读取机制及系统稳定性密切相关。


:magnifying_glass_tilted_left: 问题概要

项目 内容
问题现象 SP681网卡的SN在BMC重启后发生跳变,跳变后为无效SN
触发条件 插入5张SP681网卡 + 多次BMC Restart
环境版本 openUBMC 25.09
复现规律 网卡数量越多越容易复现
尝试措施 get_fru_priv_by_fru_id 中增加5次重试,但仍读取到错误数据

:puzzle_piece: 根本原因分析(基于上下文信息)

1. SN跳变并非配置问题,而是底层读取异常

  • SerialNumber 属性通常来源于 FRU (Field Replaceable Unit) 数据,通过 I2C 总线从网卡EEPROM中读取。
  • 知识图谱中明确指出:

    Bmc 依赖 CustomReadInfo 函数读取硬件数据,该函数“有时返回无效数据”,可能直接导致读错 SN。

  • 您尝试在 get_fru_priv_by_fru_id 添加重试失败,说明:
    :backhand_index_pointing_right: 问题不是临时性通信抖动,而是持续性读取错误或硬件映射错乱

2. 高密度PCIe卡导致I2C总线竞争或地址冲突

  • 多张SP681网卡同时接入可能引起:
    • I2C总线负载过高
    • EEPROM地址冲突(尤其是在共享I2C通道的拓扑下)
    • CSR对象分发顺序不固定,导致FRU数据绑定错位(参考文档ID 1)

:light_bulb: 参考知识:
“传感器对象的注册及相应 sdr 数据的注册都是根据传感器 csr 对象的分发顺序依次处理的,无法保证 csr 对象分发给组件的顺序。”
—— 这意味着在多设备场景下,对象绑定可能出现错位风险

3. BMC重启过程中FRU刷新机制不一致

  • BMC重启后会调用 update_fru_data 方法刷新FRU数据。
  • 若多个网卡的FRU数据刷新存在竞态或时序问题,可能导致数据错乱。
  • 且有记录表明:FruData_Service 存在初始化失败的情况(如 FruData_Expander_0101 初始化失败),反映FRU服务本身存在健壮性风险。

4. 物理链路干扰的可能性

  • 虽然目前无直接证据表明是物理层问题,但以下因素不能排除:
    • 多卡插入造成PCIe插槽供电/信号完整性下降
    • I2C信号反射或串扰(尤其在长走线或未端接设计中)
    • 电磁干扰导致EEPROM读取错误

:white_check_mark: 已知相关机制和组件

组件/命令 作用 与问题关联性
ipmicfg -d fruinfo / ipmcget -d fruinfo 获取FRU信息 可用于验证当前SN是否一致
bmc.dev.Fru 接口 提供FRU元数据 SP681网卡应实现此接口
update_fru_data 方法 强制刷新FRU数据 BMC重启后自动触发
CustomReadInfo 函数 从硬件读取FRU数据 核心嫌疑点:可能读取错误数据
AppDump 目录 存储诊断日志 可提取 bmc_network, bmc_health 日志分析异常

:hammer_and_wrench: 建议排查与解决方案

:white_check_mark: 步骤一:确认SN读取路径是否正确

  1. 使用命令手动获取FRU信息:

    ipmcget -d fruinfo
    

    ipmitool fru print
    

    查看各网卡的实际FRU输出,确认是否与预期SN一致。

  2. 检查FRU数据源配置:

    • 确保 PCIeCard_1.SerialNumber 正确指向 <=/FruData_Fru0.BoardSerialNumber
    • 验证 FruData_Fru0 是否绑定到正确的I2C设备地址(如0x50~0x57)

:white_check_mark: 步骤二:加强FRU读取的防抖与校验

  1. 增加CRC校验或内容合法性检查

    • 对读出的FRU数据做基本校验(如字符串合法性、长度、格式)
    • 若检测到非法SN(如全0、全F、非ASCII字符),则标记为“读取失败”而非使用
  2. 引入ContBin类防抖机制

    • 参考 CSR硬件监控防抖机制文档(ID 4),对FRU读取使用类似 contbin_H5L5cont_5 防抖
    • 只有连续多次读取一致才更新SN

:white_check_mark: 步骤三:优化FRU初始化流程

  1. 确保所有网卡FRU按固定顺序加载

    • 在CSR配置中显式定义PCIe插槽与FRU ID的映射关系
    • 避免依赖动态发现顺序
  2. 延迟FRU读取时机

    • BMC启动后稍作延迟(如2秒)再开始读取FRU,避开电源不稳定期

:white_check_mark: 步骤四:增加日志与抓包分析

  1. 开启I2C访问日志:
    echo 1 > /sys/module/i2c_core/parameters/debug_status
    
  2. 抓取 AppDump 中的 bmc_healthbmc_upgrade 日志
  3. 使用逻辑分析仪抓取I2C总线通信,确认是否存在NACK、超时、地址错乱等问题

:white_check_mark: 步骤五:固件与配置建议

  1. 升级openUBMC版本

    • openUBMC 25.09可能存在已知缺陷,建议升级至25.09.03.01或更新版本
    • 查看是否有 bmc_networkFruData_Service 的修复补丁
  2. 检查网卡EEPROM状态

    • 使用调试工具直接读写网卡EEPROM,确认其SN内容是否稳定
    • 排除硬件EEPROM损坏或写保护异常

:pushpin: 结论

判断 说明
:cross_mark: 是否正常行为? — SN不应跳变,尤其不应变为无效值
:magnifying_glass_tilted_right: 最可能原因 CustomReadInfo 在高负载下读取I2C失败,返回错误数据,且未做有效性校验
:warning: 次要原因 多卡造成的I2C冲突、对象绑定错位、启动时序紊乱
:stop_sign: 物理链路影响? 不能排除,需进一步信号完整性测试

:white_check_mark: 推荐最终对策

  1. 立即措施

    • 增加FRU数据读取的重试+校验机制
    • 添加日志记录每次读取的原始数据
  2. 中期优化

    • 固件层面引入防抖机制(cont_5contbin
    • 优化CSR中设备绑定逻辑,避免依赖发现顺序
  3. 长期建议

    • 上升为openUBMC社区Issue,推动 FruData_Service 初始化健壮性提升
    • 改进 bmc.kepler.Systems.Fru 模块的错误处理机制

:paperclip: 附加提示:可结合Redfish接口 /redfish/v1/Chassis/{id}/NetworkAdapters 查询网卡SN,交叉验证带外管理数据一致性。


如需进一步协助分析日志或CSR配置,请提供具体的FRU dump输出或I2C拓扑图。

相关链接:

  1. BMC重启或AC后,网卡Sensor number发生变化是否是问题?
  2. 【BMC Studio】BMC Studio新特性介绍:基于Qemu进行代码调试与资源协作接口调试
  3. qemu仿真devmon组件,加载网卡驱动正确操作是什么?
  4. 【SNMP】snmpget接口报错:认证失败,但密码是正确的
  5. 时间管理问题手册 | 文档中心 | openUBMC

告警的SN是取自Component,Component的数据源是Frudata吗

是的,就是因为frudata读的数据跳变了

那应该是eep的问题了

复位后都会主动读一次

日志:
SP681跳变_20260210-0935.z01.txt (9 MB)
SP681跳变_20260210-0935.zip.txt (6.3 MB)

收到,分析了回复

这个txt是收集的日志吗,后缀好像不对

看下后缀名呢,改了也解析不了