答案内容由AI生成,仅供参考:
关于 power_strategy 组件日志刷屏问题的分析
根据提供的日志信息和系统上下文,power_strategy 组件出现日志刷屏问题,主要表现为两个高频错误:
Get active psu efficiency failedpower_strategy_ipmi.lua:229: The value for the property nil is out of range.
以下是基于 Context 中提供的知识图谱(KG)和文档碎片(DC)的综合分析。
问题现象
从 app.log 截图和日志内容可以看出以下关键现象:
- 错误日志高频重复:两种错误均以“repeated X times in 300s+”的形式被合并打印,表明它们是周期性、高频触发的。
- 涉及组件:
power_strategy组件,其版本为1.75.3,与负责底层电源监控的power_mgmt组件(版本1.70.117.007)共存。 - 错误触发条件:日志显示 “上电和下电情况下都会打印”,排除了问题仅由单一状态(如稳态运行)引发的可能性。
- 核心错误:
ERROR: power_strategy_utils.lua(89): Get active psu efficiency failed:直接表明组件无法获取到当前活动电源(PSU)的效率信息。WARNING: The value for the property nil is out of range.:表明代码尝试对一个nil值(空值)进行范围校验,而该值本身不存在。
根本原因分析
1. “Get active psu efficiency failed” - 直接功能失败
该错误信息指出 power_strategy_utils.lua 的第 89 行代码在尝试获取 “active PSU efficiency” 时失败。
- 上游依赖关系:
power_strategy作为一个高级策略组件,通常依赖power_mgmt组件提供的基础数据。power_mgmt是Context中定义的 电源管理核心模块,负责 “获取电源基础信息如电压、电流、温度、功率等”(参考 Search Result 5: 电源管理机制介绍)。 - 数据来源:获取电源效率(efficiency)通常需要从 PSU 的 FRU(Field Replaceable Unit)信息或通过 PMBus 协议从 PSU 硬件中读取。
app.log日志中pmbus.lua和PsuSlot.lua的日志(如position: 00, get objects, count: 161和ps2 power monitor start)证明power_mgmt组件正在进行电源发现和监控。 - 可能的根源:
power_mgmt组件未正确获取 PSU 效率数据:这是最直接的原因。可能是power_mgmt与特定型号 PSU 的 PMBus 通信协议不兼容,导致无法读取EFFICIENCY相关寄存器。- PSU 信息未完全初始化或丢失:在上电/下电瞬间,PSU 状态不稳定,
power_strategy在power_mgmt未完成 PSU 初始化前就尝试读取efficiency,导致返回空值或失败。 PowerStrategy依赖的数据对象未就绪:Context中的hwdiscovery组件负责硬件发现和初始化。如果某个依赖的 PSU 对象未被正确发现(如hwdiscovery日志中出现ignored objects count),power_strategy将因缺少目标对象而获取失败。
2. “The value for the property nil is out of range” - 编码逻辑缺陷
这是一个 编程级错误,表明代码中存在健壮性问题。
- 错误路径:
init.lua(97) > reg_command.lua:196 > power_strategy_ipmi.lua:229。这通常发生在 IPMI 命令处理过程中。 - 核心问题:代码在第 229 行尝试对一个尚未获取到的数据(
nil)进行数值范围检查(如是否介于0-100%之间)。 - 与第一个错误的关联:这极有可能是第一个错误
Get active psu efficiency failed的直接结果。当get active psu efficiency失败时,返回值为nil,而power_strategy的 IPMI 处理逻辑未能对nil值进行恰当的空值判断,而是直接执行了范围校验,从而触发了此警告。
综合结论
该日志刷屏问题是由 功能性失效 和 编码逻辑缺陷 共同导致的级联故障。
-
根本原因:
power_strategy组件因power_mgmt组件未能成功从物理 PSU 上获取效率数据,导致 “Get active psu efficiency failed” 的功能执行失败。 -
表象触发:
由于power_strategy的代码power_strategy_ipmi.lua在处理该失败返回的nil值时,缺少空值保护逻辑,直接进行范围检查,从而引发了高频的 “The value for the property nil is out of range” 警告。
因此,高频刷屏的 WARNING 警告是 ERROR 功能失败的“症状放大器”。如果修复了 PSU 效率数据的获取,nil 值便不会出现,后续的警告也将自动消失。
定位与排查建议
-
检查底层电源监控组件:
在app.log中进一步查找power_mgmt组件是否也有关于 PSU 通信错误的记录,例如:- 检查
pmbus.lua相关日志是否有crc错误、通信超时或更新失败。 - 检查
PsuSlot.lua是否有start psu power monitor remote task成功的标记。如果没有,则更底层的发现过程已失败。
- 检查
-
验证硬件与配置:
- 核实当前固件版本
1.75.3的power_strategy是否与当前实际的 PSU 型号兼容。 - 确认 BMC 配置中是否正确识别了 PSU 的类型和数量。
- 核实当前固件版本
-
代码层面修复(建议提供给开发团队):
- 紧急措施:在
power_strategy_ipmi.lua文件的第 229 行附近,增加对efficiency变量值的空值判断。如果值为nil,则记录一条 Debug 级别的日志(避免刷屏)并提前退出,而不是直接进行范围校验。这可以立即消除日志风暴。 - 根本修复:深入排查
power_strategy_utils.lua中Get active psu efficiency的实现逻辑,确保存在有效的数据源(如通过 IPMI OEM 命令GetPowerSupplyInfo,参考 KG 关系)或正确调用了power_mgmt组件的 API。
- 紧急措施:在
-
参考关键知识:
GetPowerSupplyInfo命令是获取电源供应单元数据的关键API,在openUBMC中通过 BMC 提供给 BIOS 使用。app.log是诊断此类问题的核心,多位社区专家(如Wwhh)均建议通过分析app.log来定位 BMC 系统行为的根源。
相关链接: