【SDR 】偶现ipmitool sdr list查询到NPU传感器值为负数

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

IPMI SDR 查询偶现 NPU 传感器值为负数问题分析

根据您提供的问题描述和上下文信息,该问题是关于在 OpenUBMC 2509 版本中执行 ipmitool sdr list 命令时,偶现 NPU 温度与功耗传感器读取值为负值的现象。以下基于提供的 知识图谱(KG)文档块(DC)及搜索结果 进行全面、深入的分析。


:magnifying_glass_tilted_left: 一、问题核心总结

项目 内容
问题现象 偶现 ipmitool sdr list 查询到 NPU 的温度、功耗等传感器数值为负数
环境 OpenUBMC 25.09,NPU 卡(如 Atlas 300I A2)
对比现象 Web UI 和 OS 层面(npu-smi)显示正常
复现方式 稳定性测试中循环执行 IPMI 查询
初步结论 数据转换或读值同步机制存在边界条件缺陷

:puzzle_piece: 二、根本原因分析

结合多份文档和知识图谱信息,该问题可能由以下几个关键因素共同导致:

1. 传感器读值(Reading)未正确进行补码处理

  • 根据 Document Chunk 1 中对 ThresholdSensor 的属性说明:

    bmc.kepler.Systems.ThresholdSensor.Reading:是一个 U16 类型的字段,但实际计算时需要作为**有符号数(二补数)**处理。

  • 正确公式为:
    原始值(Raw Reading) = (M × RawSensorValue + B × 10^k1) × 10^k2
    
  • 如果原始 RawSensorValue 是通过 SMBus 等接口获取的字节流,并且本应解释为有符号整数(Signed Integer),而 BMC 软件未正确识别符号位,则高位为 1 时会被误判为极大的无符号数,经 M/B 转换后可能导致溢出或符号错误,最终呈现为“负值”。

:white_check_mark: 支撑证据
ref_id:2 的日志中,Reading=255,而传感器实际功率为 3079W —— 这说明 255 是缩放后的中间值,需通过 M/B/RBExp 配置还原。若未用补码,可能出现计算错误。


2. NPU 传感器数据源不稳定,导致瞬时读取异常

  • 来自 DC 3DC 7 的信息表明:

    • 对于 Atlas 300I A2 卡,NPU 的温度与功耗数据来源于 NPU 对象(而非 NPUCard)。
    • 当 OS 下电或驱动未就绪时,读值默认为 0,但在某些异常路径下会返回 32768(表示 BMC 通信失败)甚至 32767
  • 若 BMC 的驱动(如 compute 组件)未能正确处理这些特殊值:

    • 32767 和 32768 均超出 U8 范围(0–255),强制截断为低 8 位会造成数值混乱。
    • 若这些值直接参与计算且无符号处理,极易导出负数。

:white_check_mark: 支撑证据

  • DC 3 中提到:32768 = BMC 从卡侧获取温度失败;32767 = 卡侧已返回,但卡没读到真实值。
  • DC 7 显示日志中频繁出现 find_object nil 错误,表明 BMC 与 NPU 通信链路不稳定。

3. IPMI SDR 数据获取路径与其他接口不一致

  • Web UInpu-smi 使用的是:

    • Web 接口:基于 Restful API 从 D-Bus 或对象模型获取;
    • npu-smi:直接通过 NPU 驱动从设备读取;
  • ipmitool sdr list 是通过 IPMI 协议 → SDR(Sensor Data Record) → BMC 内部转换逻辑 获取:

    • 涉及 GetDeviceSDR, Get Sensor Threshold, Get Sensor Reading 等命令;
    • 需依赖 M, B, RBExp 参数进行线性转换;
    • 若该流程中的某环节缓存失效、数据脏读、并发竞争,则可能返回异常中间值。

:white_check_mark: 支撑证据:

  • 搜索结果 #9 术语表 明确指出:SDR = Sensor Data Record,是 IPMI 提供的传感器元数据记录方法
  • DC 6 规定 Reading 必须是一个在门限范围内的初始值,防止产生 SEL 时间。若该值初始化不当,会导致展示异常。

:gear: 三、潜在技术路径剖析

1. 传感器数值转换流程缺陷

flowchart LR
    A[RAW 数据来自 NPU] --> B{是否为有效值?}
    B -->|0 或 32767/32768| C[异常标记]
    B -->|正常值| D[除以缩放倍率 → 控制在 0-255]
    D --> E[写入 Sensor.Reading]
    E --> F[应用 M/B/RBExp 公式]
    F --> G[输出最终值]
  • 问题点:
    • 步骤 D 中未对高值做截断或替换;
    • 步骤 F 中未判断符号类型(signed vs unsigned);
    • 若 M/B 值配置不合理(如 M 太大),易导致溢出。

2. BMC 组件版本兼容性问题(尤其 compute 模块)

  • DC 7 得知:

    “baixin_lipengbo:当时我用的 openUBMC 25.06 基线,升级到 25.09 基线就可以了,25.09 基线的闭源组件 compute 有适配

  • 说明 compute(负责解析 NPU 数据的核心组件)在不同版本间对异常值、数据转换逻辑存在差异。

  • 当前虽然使用的是 25.09,但仍可能因为固件未完全同步、配置未更新等原因继承旧逻辑。


:white_check_mark: 四、验证与修复建议

:white_check_mark: 1. 确认传感器的读值处理逻辑

# 查看具体 NPU 传感器配置
ipmcget -t thresholdsensor -d list | grep NPU

# 或通过 D-Bus 查看传感器属性
busctl get-property bmc.kepler.Systems.ThresholdSensor_<NPU> Reading
busctl get-property bmc.kepler.Systems.ThresholdSensor_<NPU> M
busctl get-property bmc.kepler.Systems.ThresholdSensor_<NPU> B
busctl get-property bmc.kepler.Systems.ThresholdSensor_<NPU> RBExp

检查 M/B/RBExp 是否合理,例如:

  • 功率类传感器,若原始值单位为 0.1W,则应 M=1, RBExp=249(表示 ×0.1)

:white_check_mark: 2. 增强异常值处理策略

修改 compute 或传感器处理逻辑,在接收到以下值时进行特殊处理:

原始值 处理建议
0 视为无数据,维持上次有效值或设为 N/A
32767 视为临时异常,不更新 Reading
32768 触发 ReadingStatus = 1(异常),并触发 Mgmtmt Health 告警

参考:DC 3 中提到 Mgmtmt Health 会因 ReadingStatus=1 触发告警。

:white_check_mark: 3. 检查并固定传感器的 Reading 类型

确保 sensor.Reading 存储时支持有符号类型,或在转换函数中显式使用:

int8_t reading = (int8_t)raw_value; // 强制补码解析

避免将 0xFF 视为 255 而不是 -1。


:white_check_mark: 4. 校验 SDR 与 Web 数据源一致性

接口 数据来源
ipmitool sdr list SDR → IPMI Command (Get Sensor Reading)
Web UI D-Bus → bmc.kepler.Systems.ThresholdSensor
OS npu-smi Drm/NPU Driver → Direct Memory Access

:white_check_mark: 建议统一底层数据源,所有接口均基于同一 scannerreader 组件更新。


:white_check_mark: 5. 建议增加稳定性测试监控点

在长期压测脚本中加入:

while true; do
    output=$(ipmitool sdr list | grep NPU | awk '{print $2}')
    if [[ "$output" == *-* ]]; then
        echo "$(date): Found negative value!" >> /tmp/npu_negative.log
        # 记录完整上下文
        ipmitool sdr list | grep NPU >> /tmp/npu_negative.log
        dmesg | tail -5 >> /tmp/npu_negative.log
    fi
    sleep 1
done

用于捕获异常时刻的日志、温度、SEL 等信息。


:pushpin: 五、总结

成因 是否成立 说明
未正确处理补码 :white_check_mark: 高概率 尤其在高温或高功耗时,高位被置 1
异常值 32767/32768 被直接使用 :white_check_mark: 成立 导致 Reading 溢出,转换失真
compute 模块未完全适配 :warning: 可能 不同批次固件间行为不一致
IPMI SDR 与 Web 数据链路不一致 :white_check_mark: 存在 解释为何 Web 显示正常
并发或脏读引起瞬时负值 :white_check_mark: 可能 多线程更新 Reading 变量时缺少保护

:white_check_mark: 结论与建议

根本原因:BMC 在处理 NPU 传感器数据时,对异常值(如 32768)、原始数据补码解析、以及 Reading 缩放逻辑存在边界处理缺陷,导致在 ipmitool sdr list 中偶现负值。

修复建议

  1. compute 或传感器模块中增加异常值过滤;
  2. 显式以有符号方式解析 Reading
  3. 校准 M/B/RBExp 参数,确保数值转换安全;
  4. 统一 Web 与 IPMI 的底层数据源;
  5. 在发布前加入“负值检测”自动化检查项。

临时规避方案

  • 重启可恢复 → 表明是状态错误而非硬件问题。
  • 可设置监控脚本,发现负值后自动刷新传感器状态或重新加载模块。

如能提供 ipmitool sdr list 的具体负值样例(如 -23°C)、对应 M/B/RBExp 配置、以及 SEL 日志,可进一步精准定位计算环节的错误点。

相关链接:

  1. 300I A2 NPU卡温度读值策略疑问
  2. 版本级自动化冒烟测试设计分享
  3. ipmitool sensor与ipmcget -t sensor -d list返回不同
  4. openUBMC通用测试点分享
  5. 传感器管理常见问题指南 | 文档中心 | openUBMC