NPU_total_power类汇聚传感器定制问题

问题描述

在传感器定制化需求里有一个npu总功耗的传感器定制需求,查看sr文件发现npu power传感器的数据来源貌似不是Scanner这类对象扫描到的,而是从闭源组件来的。

我现在EXU的sr文件中新增一个Npu_total_power传感器,在代码中通过资源树计算npu总功耗然后设置到npu_total_power传感器发现Threshold接口的Reading属性是个ReadOnly类型,如果使用ThresholdDisplay接口,web上可以正常显示,但是ipmitool查询的sdr仍然没有读值

求问一下各位,在不修改资源树文件的前提下,有没有办法制作汇聚类的传感器

期望结果

ipmitool sdr elist命令和web页面可以正确显示npu_total_power读数

实际结果

ipmitool sdr elist命令返回的npu_total_power没有读数

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

结论

核心结论

要使 ipmitool sdr 显示 NPU 总功耗,必须让该传感器作为一个 有效的 IPMI SDR Entry 被注册到 BMC 的 SDR Repository 中。仅仅更新 ThresholdDisplay 接口不足以满足此条件。

:white_check_mark: 最佳推荐方案:

使用虚拟传感器模式 —— 在运行时通过代码动态创建一个遵循标准接口的传感器对象,并由后台任务定时更新其 Value,即可实现:

  1. Web 页面正常显示
  2. ipmitool sdr list 正确返回读数
  3. 无需修改资源树或静态配置

此方法既满足功能性要求,也保持了系统的可维护性和兼容性。

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

NPU总功耗汇聚传感器定制问题分析与解决方案

问题概述

用户在进行 NPU_total_power 聚合传感器定制时遇到以下问题:

  • 该传感器用于汇聚多块NPU设备的功耗数据,实现总功耗计算。
  • 数据来源并非通过 Scanner 对象扫描获得,而是由闭源组件提供或在代码中通过资源树计算得出。
  • 使用 Threshold 接口时,Reading 属性为只读(ReadOnly),无法动态设置。
  • 使用 ThresholdDisplay 接口可在Web页面正确显示数值,但使用 ipmitool sdr elist 命令查询时无法返回有效读数。

目标:在不修改资源树文件的前提下,使 ipmitool sdr elist 和 Web 页面均能正确显示 NPU 总功耗读数。


原因分析

1. ipmitool sdr 与 BMC 系统的交互机制

根据知识图谱信息:

  • ipmitool sdr list 是 IPMI 标准命令,用于获取系统中所有传感器的数据记录(SDR)。
  • SDR(Sensor Data Repository)中包含传感器类型、阈值、状态和当前读数等信息。
  • ipmitool 获取数据依赖于 BMC 的 IPMI Sensor List 实现机制。

相关实体:

  • IPMI_Sdr_List: 执行该命令会从 BMC 中获取完整的 SDR 列表。
  • Get Device SDR InfoGet Device SDR: 用于获取设备 SDR 信息和具体内容。
  • Provides Device SDRs: 确认 BMC 支持 SDR 功能(值为 “yes”)。

2. Web 显示与 CLI 查询的差异

  • Web 界面(如 openUBMC/iBMC)通常基于 Redfish 或自研 API 展示数据,可直接访问 D-Bus 或资源树属性。
  • ipmitool 查询依赖标准 IPMI 接口路径,最终调用底层服务如 bmc.kepler.Systems.ThresholdSensor 暴露的 Reading 属性。

关键实体:

  • bmc.kepler.Systems.ThresholdSensor: 表示 BMC 中管理阈值类传感器的核心接口。
  • Sensor List 可通过 Web、IPMI、CLI、Redfish 多种方式访问,但后端实现可能不同。

3. Threshold 接口为何 Reading 为只读?

  • Threshold 是标准 D-Bus 接口,遵循 xyz.openbmc_project.Sensor.Threshold 规范。
  • Reading 属性设计为 由采集器自动更新,不应手动写入,以保证一致性。
  • 若试图绕过采集逻辑手动设置 Reading,将违反行为规范,可能导致 IPMI 层不识别。

4. ThresholdDisplay 的局限性

  • ThresholdDisplay 属于 仅用于展示目的 的接口,常用于 Web 页面直接渲染。
  • 它不参与 IPMI SDR 构建流程,因此其设置的值不会被 IPMI_Sdr_Listipmitool 捕获。

解决方案建议

:white_check_mark: 方案一:使用 VirtualSensor 构建虚拟传感器(推荐)

思路:

创建一个 虚拟传感器对象(VirtualSensor),它虽然不绑定物理硬件,但实现了完整的 ThresholdSensor 流程,能向 IPMI 子系统注册自己的 SDR 记录和实时读数。

实现步骤(无需修改资源树文件):

  1. 创建 D-Bus 对象路径
    在运行时动态创建一个新路径,例如:

    /xyz/openbmc_project/sensors/power/NPU_total_power
    

    绑定以下接口:

    • xyz.openbmc_project.Sensor.Value
    • xyz.openbmc_project.Sensor.Threshold
    • xyz.openbmc_project.Sensor.Power
  2. 绑定扫描器(Scanner)机制(间接方式)

    • 尽管数据来自闭源组件,可定义一个伪扫描器任务,周期性调用你的代码从资源树读取各 NPU 功耗并求和。
    • 将结果写入上述虚拟传感器的 Value 属性。
    • 示例代码逻辑:
      double totalPower = 0;
      for (auto& npu : npus) {
          totalPower += getNpuPowerFromResourceTree(npu);
      }
      setSensorValue("/xyz/openbmc_project/sensors/power/NPU_total_power", totalPower);
      
  3. 确保 IPMI 感知此传感器

    • BMC 的 ipmi-hostphosphor-host-ipmid 服务会监听 D-Bus 上的传感器对象。
    • 只要符合命名与接口规范,新传感器将自动注册进 SDR Repository。
    • 使用 ipmitool sdr list 即可看到该传感器及其读数。

:white_check_mark: 方案二:扩展 IPMI 自定义命令(备用方案)

思路:

若虚拟传感器方案受权限或架构限制,可注册一个自定义 IPMI 命令,专门返回 NPU 总功耗。

实现方式:

  1. 添加一条新的 IPMI OEM 命令(如 NetFn: 0x3A, Cmd: 0x20)。
  2. 实现命令处理逻辑,从资源树获取所有 NPU 功耗并求和。
  3. 客户端可通过 ipmitool raw 0x3A 0x20 获取聚合值。

优点:

  • 完全绕开标准 SDR 展示限制。

缺点:

  • 不兼容 sdr list 命令,需自定义工具链。

:white_check_mark: 方案三:钩子机制注入 SDR 数据(高级,需评估)

思路:

修改 IPMI SDR generator 逻辑,在生成 SDR 列表时,将 NPU_total_power 的运行时计算值注入。

操作方法(假设使用 phosphor-ipmi-host):

  1. 查找 SDR 生成服务源码,定位 generateSensors() 函数。
  2. 在生成完成后,动态添加一条 SDR 记录:
    addVirtualSensorSdr(
        sensorId, "NPU_TOTAL", 
        SensorType::Power, 
        getNpuTotalPowerFromTree()
    );
    
  3. 确保该传感器对应的 Entity ID 合法(如 Powersupply (0x03))。

风险提示:

  • 属于对标准流程的侵入式修改,可能影响系统稳定性。
  • 需测试重启后是否持久生效。

推荐实践路径

步骤 操作 说明
1 创建运行时 D-Bus 传感器对象 路径 /xyz/openbmc_project/sensors/power/NPU_total_power
2 实现周期性采集函数 定时(如每 2 秒)读取各 NPU 功耗并汇总
3 绑定 Threshold 接口并更新 Value 自动触发 IPMI SDR 更新
4 验证 ipmitool sdr list 输出 应包含 NPU_total_power 及有效读数
5 验证 Web 页面展示 可通过 Redfish /redfish/v1/Chassis/1/Sensors 查看

:pushpin: 注意:虽然你说“不能修改资源树”,但若允许在 运行时动态注册 对象,则上述方案完全合规且无需静态配置变更。


验证命令与预期输出

1. 查询传感器列表

ipmitool sdr list | grep -i npu

期望输出

NPU_total_power     | 00h | ok  | 54.0 | 125W

2. 详细查看

ipmitool sdr get "NPU_total_power"

应显示:

  • Sensor ID: NPU_total_power
  • Entity: Power Supply
  • Sensor Type: Power
  • Reading: [计算出的数值] Watts

相关参考信息

  • bmc.kepler.Systems.ThresholdSensor: 所有阈值传感器必须实现此接口才能被监控系统识别。
  • Sensor List: ipmitool 和 Web 各自走不同路径,Web 可能直接查 D-Bus,而 IPMI 必须经过 SDR repository。
  • Get Device SDR Info: BMC 支持此类命令,说明其具备完整 SDR 功能,关键在于传感器是否注册成功。

结论

核心结论

要使 ipmitool sdr 显示 NPU 总功耗,必须让该传感器作为一个 有效的 IPMI SDR Entry 被注册到 BMC 的 SDR Repository 中。仅仅更新 ThresholdDisplay 接口不足以满足此条件。

:white_check_mark: 最佳推荐方案:

使用虚拟传感器模式 —— 在运行时通过代码动态创建一个遵循标准接口的传感器对象,并由后台任务定时更新其 Value,即可实现:

  1. Web 页面正常显示
  2. ipmitool sdr list 正确返回读数
  3. 无需修改资源树或静态配置

此方法既满足功能性要求,也保持了系统的可维护性和兼容性。

你说的web上正常显示,是修改了rackmount吗?还是目前web界面显示和ipmitool查询不一致

没有修改rackmount,是web界面显示和ipmitool查询不一致。

修改点是在代码中给传感器的ReadingDisplay属性赋值,比如是2618Watts可以在web界面显示,但是ipmitool查询还是0

请正确配置csr中传感器对象的Reading属性关联数据源,整体上对北向接口(含web、redfish、cli、snmp)体现的结果是由sensor组件内部转化为ReadingDisplay呈现的,但ipmi接口则是由ipmitool工具从sensor组件获取数据源及转换表达式参数的值另外计算的。因此如您所述直接暴力修改ReadingDisplay的值是不正确的

1 个赞