问题描述
在传感器定制化需求里有一个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 接口不足以满足此条件。
最佳推荐方案:
使用虚拟传感器模式 —— 在运行时通过代码动态创建一个遵循标准接口的传感器对象,并由后台任务定时更新其 Value,即可实现:
- Web 页面正常显示
ipmitool sdr list 正确返回读数
- 无需修改资源树或静态配置
此方法既满足功能性要求,也保持了系统的可维护性和兼容性。
点击此处查看详细分析解答
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 Info 和 Get 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_List 或 ipmitool 捕获。
解决方案建议
方案一:使用 VirtualSensor 构建虚拟传感器(推荐)
思路:
创建一个 虚拟传感器对象(VirtualSensor),它虽然不绑定物理硬件,但实现了完整的 ThresholdSensor 流程,能向 IPMI 子系统注册自己的 SDR 记录和实时读数。
实现步骤(无需修改资源树文件):
-
创建 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
-
绑定扫描器(Scanner)机制(间接方式)
-
确保 IPMI 感知此传感器
- BMC 的
ipmi-host 或 phosphor-host-ipmid 服务会监听 D-Bus 上的传感器对象。
- 只要符合命名与接口规范,新传感器将自动注册进 SDR Repository。
- 使用
ipmitool sdr list 即可看到该传感器及其读数。
方案二:扩展 IPMI 自定义命令(备用方案)
思路:
若虚拟传感器方案受权限或架构限制,可注册一个自定义 IPMI 命令,专门返回 NPU 总功耗。
实现方式:
- 添加一条新的 IPMI OEM 命令(如 NetFn: 0x3A, Cmd: 0x20)。
- 实现命令处理逻辑,从资源树获取所有 NPU 功耗并求和。
- 客户端可通过
ipmitool raw 0x3A 0x20 获取聚合值。
优点:
缺点:
方案三:钩子机制注入 SDR 数据(高级,需评估)
思路:
修改 IPMI SDR generator 逻辑,在生成 SDR 列表时,将 NPU_total_power 的运行时计算值注入。
操作方法(假设使用 phosphor-ipmi-host):
- 查找 SDR 生成服务源码,定位
generateSensors() 函数。
- 在生成完成后,动态添加一条 SDR 记录:
addVirtualSensorSdr(
sensorId, "NPU_TOTAL",
SensorType::Power,
getNpuTotalPowerFromTree()
);
- 确保该传感器对应的
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 查看 |
注意:虽然你说“不能修改资源树”,但若允许在 运行时动态注册 对象,则上述方案完全合规且无需静态配置变更。
验证命令与预期输出
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 接口不足以满足此条件。
最佳推荐方案:
使用虚拟传感器模式 —— 在运行时通过代码动态创建一个遵循标准接口的传感器对象,并由后台任务定时更新其 Value,即可实现:
- Web 页面正常显示
ipmitool sdr list 正确返回读数
- 无需修改资源树或静态配置
此方法既满足功能性要求,也保持了系统的可维护性和兼容性。
Longbow
(ZhangZhiyang)
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 个赞