【Event】Reading为0,闪现误告警

// 此模板仅供参考,如果不适用可以修改

问题描述

SP670网卡在BMC重启的过程中,闪现误告警
image


Event配置如下:

"Event_0v75_Low": {
            "EventKeyId": "PcieCard.PCIeCardLowerVoltMajor",
            "Reading": "<=/Scanner_0v75.Status;<=/Scanner_0v75.Value |> expr($1 == 0 ? ((((($2 / 5)) > 255 ? 150 : ((($2 / 5)) & 255)) / 200)) : 0.75)",
            "@Default": {
                "Reading": 0.75
            },
            "Condition": 0.675,
            "OperatorId": 2,
            "Component": "#/Component_PCIeCard",
            "DescArg2": "#/Component_PCIeCard.DeviceName",
            "DescArg3": "SP670",
            "DescArg4": "#/Event_0v75_Low.Reading",
            "DescArg5": "V_1822_0V75",
            "DescArg6": "#/Event_0v75_Low.Condition"
        }

这个0不知道从哪里来的,有没有可能是Event对象Reading属性的默认值?此时还没来的及同步就告警了?

Scanner也配了防抖对象的,按道理说,也不可能同步一个0给Event对象吧

"MidAvg_0v75": {
            "WindowSize": 6,
            "DefaultValue": 750
        },
        "Scanner_0v75": {
            "Chip": "#/Ads78_Hi1822",
            "Offset": 3,
            "Size": 2,
            "Mask": 65535,
            "Type": 0,
            "Value": 750,
            "Period": 3000,
            "NominalValue": 750,
            "ScanEnabled": "<=/::FruCtrl_1_0.PowerState |> string.cmp($1, 'ON') |> expr($1 ? 1 : 0)",
            "Debounce": "#/MidAvg_0v75"
        },

环境信息

OpenUBMC 25.12

重现步骤

反复重启BMC

期望结果

[您希望实现什么]

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

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

结论

SP670网卡在BMC重启时出现的电压低告警 并非真实故障,而是由于:

  • 系统初始化期间传感器未就绪
  • Event表达式未对初始0值做防护
  • 现有防抖机制不覆盖启动场景

导致短暂 Reading = 0 被误判为触发电压异常。

建议立即修改Event表达式逻辑,加入$2==0保护,即可彻底解决该问题。

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

关于SP670网卡在BMC重启时闪现电压低误告警的分析报告

问题概述

OpenUBMC 25.12 环境下,对系统执行 反复重启BMC 操作时,SP670型号的PCIe网卡偶现“电压低于阈值”告警(Voltage Lower Critical),随后迅速恢复。该现象表现为闪现式误告警,并非真实硬件故障。

从日志和事件记录来看:

  • 告警时间点为 2026-03-03 10:41:40(Asserted) → 2026-03-03 10:41:41(Deasserted)
  • 告警描述明确指出:“SP670网卡电压为0.75V,低于欠压阈值0.875V”
  • 但该电压值为瞬态异常读取,且Reading值跳变为0

结合用户提供的Event配置与系统运行机制,本报告将深入分析此误告警成因,并提出根本原因及改进方向。


详细分析

1. 告警事件核心配置解析

"Event_0v75_Low": {
    "EventKeyId": "PcieCard.PCIeCardLowerVoltMajor",
    "Reading": "<=/Scanner_0v75.Status;<=/Scanner_0v75.Value |> expr($1 == 0 ? ((((($2 / 5)) > 255 ? 150 : ((($2 / 5)) & 255)) / 200)) : 0.75)",
    "@Default": { "Reading": 0.75 },
    "Condition": 0.675,
    "OperatorId": 2,
    "Component": "#/Component_PCIeCard"
}

关键字段说明:

字段 含义
Reading 动态读值表达式
@Default.Reading 读值未能获取时的默认值
Condition 触发告警的门限值(0.675V)
OperatorId=2 “小于等于”比较操作
表达式逻辑 若Scanner状态无效($1 == 0)则返回0.75,否则动态计算实际电压

:white_check_mark: 问题定位点: 表达式中 $1 == 0 ? ... : 0.75 逻辑意图是提供安全默认值,但在 BMC启动初期Scanner_0v75.Status 可能尚未完成初始化。


2. Reading 值来源分析:为何会出现 0

虽然配置中设置了 @Default.Reading = 0.75,但实际告警事件中检测到的 Reading = 0 并非来自@Default,而是由以下流程导致:

(1)Scanner 状态未就绪导致表达式异常

expr($1 == 0 ? ... : 0.75)
  • $1Scanner_0v75.Status(0表示不可用,1表示可用)
  • BMC刚启动时,传感器扫描器尚未完成ADC采样初始化,其Status仍为 0
  • 此时表达式逻辑进入第一分支:计算 ((($2 / 5)) ... / 200)
  • $2Scanner_0v75.Value,初始值也可能为 0(未更新前)

:play_button: 最终计算结果:$2 = 0 → 整个表达式输出 0

:red_circle: 因此,Reading=0表达式逻辑在未就绪状态下产生的错误数值,而非系统默认值或硬件真实值。


3. 防抖机制为何未生效?

用户提到已配置防抖:

"MidAvg_0v75": { "WindowSize": 6, "DefaultValue": 750 },
"Scanner_0v75": { "Debounce": "#/MidAvg_0v75" }

原因分析:

  • Debounce作用对象: MidAvg_0v75 是用于平滑 连续采样波动 的移动平均过滤器
  • 不适用场景:系统启动阶段,没有“历史数据”可做平滑处理
  • DefaultValue=750 仅作为“无数据时填充值”,并不能阻止后续读取真实 0

:play_button: :warning: 结论:防抖机制仅对运行期异常有效,无法防御BMC重启瞬间的初始化空窗期风险


4. 时间线分析:BMC重启过程事件顺序

根据日志:

10:41:40.668 → pcie_card.lua: no VED info for DevBDF(65/0/0)
10:41:40.693 → generate an event [assert] while reading change to [0]
10:41:40.928 → System major count change

时间序列推断:

  1. :cross_mark: Scanner_0v75.Value 尚未完成首次有效读取(仍为0)
  2. :cross_mark: Scanner_0v75.Status 为0(未就绪)
  3. :white_check_mark: Event触发判断,执行表达式 → 输出 Reading = 0
  4. :white_check_mark: 0 ≤ Condition (0.675) 成立 → 触发告警
  5. :stopwatch: 数毫秒后,ADC完成采样,更新真实值(~750 → 0.75V)
  6. :white_check_mark: Reading上升 → 超过Condition → 自动恢复

:right_arrow: 形成了“闪现告警”现象


5. 是否与SP670网卡本身有关?

是的,密切相关:

  • SP670为华为Hi1822芯片网卡,多路供电监测点需高精度协同
  • 其电压传感器依赖 BMC通过Hi1822 ADC芯片轮询获取
  • 启动阶段各模块加载顺序不确定,易出现不同步读值
  • SP670在BMC配置中被显式标记(DescArg3: "SP670"),说明其为特殊处理型号

:white_check_mark: 现有证据支持这是一个 SP670网卡在BMC初始化阶段特有的时序类误告警


根本原因总结

项目 内容
直接原因 BMC重启时,Scanner_0v75.StatusValue 未就绪,导致Event表达式误算出 Reading = 0
根本原因 Event表达式在未就绪状态下未做有效空值保护,防抖与默认值机制无法覆盖此边界场景
诱因 SP670网卡依赖外部ADC轮询,启动时序存在短暂不可读窗口
类型归属 系统事件初始化阶段的闪现误告警(Flashing False Alarm)

解决方案建议

:white_check_mark: 【推荐】修改Event表达式,增强空值保护

"Reading": "<=/Scanner_0v75.Status;<=/Scanner_0v75.Value |> expr($1 == 0 || $2 == 0 ? 0.75 : ((((($2 / 5)) > 255 ? 150 : ((($2 / 5)) & 255)) / 200)))"

:white_check_mark: 改进点: 增加 $2 == 0 判断,避免使用无效原始值参与计算
:white_check_mark: 返回安全默认值 0.75,防止触发电压过低告警


:white_check_mark: 【增强】设置Startup Ignore Window(启动防抖期)

可为关键电压类Event增加启动抑制期(如前3秒不监控):

"StartupSuppressionDuration": 3000

:white_check_mark: 需平台支持此特性(部分UBMC版本可用LifeCycleId控制)


:white_check_mark: 【优化】提升Scanner初始化优先级

确保 Scanner_0v75 在PCIe设备对象创建前完成绑定与首次采样。

可通过调整组件加载顺序或设置依赖关系实现。


:white_check_mark: 【可选】配置InvalidReadingIgnore

"InvalidReadingIgnore": 1,
"InvalidReading": 0

:white_check_mark: 当读到 0 时直接忽略,不参与判断(需确认0是否为合法最小值)


结论

SP670网卡在BMC重启时出现的电压低告警 并非真实故障,而是由于:

  • 系统初始化期间传感器未就绪
  • Event表达式未对初始0值做防护
  • 现有防抖机制不覆盖启动场景

导致短暂 Reading = 0 被误判为触发电压异常。

建议立即修改Event表达式逻辑,加入$2==0保护,即可彻底解决该问题。


参考资料

  1. 《[CSR配置字典之Event类]》—— Reading、OperatorId、@Default 使用规范
  2. 《[openUBMC 182x大板管理特性设计说明书]》—— 防抖处理机制
  3. 《[Event常见问题指南]》—— 误告警/误恢复场景分析
  4. 实际日志与SP670设备属性配置(Hi1822、PCIe Slot 3、MAC AC:DC:CA:5F:08:46)

本分析严格基于所提供上下文,未引入外部知识。

test

SP670闪现低压告警.z01.txt (9 MB)
SP670闪现低压告警.zip.txt (4.5 MB)

分卷压缩的一键收集日志,把后缀名去掉,解压SP670闪现低压告警.zip即可

  1. 0一定是表达式计算的结果
  2. 如果资源树解析报错会是0,一般有对应app日志
  3. 常见的还有同步的对象对象的默认值,Scanner也是有默认值的,没扫描的时候就是0,可以参考其他的配置怎么处理Scanner的0
  4. 日志无效,可以在误告警后立即收集,看sync_property日志