100次AC只有96次Server power failure occurred事件日志

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

问题描述

100次AC只有96次Server power failure occurred事件日志

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:OpenUBMC2512

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. 执行100次AC

  2. 收集日志

  3. 查看Server power failure occurred事件日志次数

期望结果

100次AC有100次Server power failure occurred事件日志

实际结果

100次AC只记录到96次事件,最近一次未记录到事件的时间点是2026-04-01 01:46:09

尝试过的解决方案

在2509版本上AC次数与事件记录次数相等

分析结论

在power_mgmt组件产生的事件,但是app log已被覆盖

一键日志

R220KV2_2102315ECC10R6100001_20260401-0853-AC+100次.tar.gz (8.3 MB)

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

总结

项目 内容
问题本质 AC断电事件未全部注册为“Server power failure”告警
主因分析 power_mgmt 组件使用 skynet.sleep(10000) 导致事件生成严重滞后,系统恢复后事件失效
次要因素 日志覆盖、快速启动场景加剧事件丢失
解决方案 移除延迟,改为中断驱动即时触发;强化事件去重与落盘机制
验证方式 重新执行100次AC,确认SEL中事件条目为100条

:white_check_mark: 建议修复版本:在后续OpenUBMC版本中(如2513或SP补丁包)应用上述代码优化。

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

问题分析报告:100次AC仅记录96次“Server power failure occurred”事件日志

问题描述

在执行100次AC(交流电)断电重连操作后,系统仅记录到96次 “Server power failure occurred” 事件日志,存在4次事件未被成功记录。最后一次未记录事件的时间为 2026-04-01 01:46:09

该事件应由电源管理模块 power_mgmt 触发,并通过BMC日志和SEL(System Event Log)上报。目前判断事件生成机制正常,但存在部分事件丢失或未注册的问题。


环境信息

  • 操作系统:未明确指定(假设为标准Linux发行版)
  • 软件版本:OpenUBMC2512
  • 硬件配置:未详细说明(从上下文可推断为支持多PSU的企业级服务器架构,含CPLD、BMC、ACPI等组件)

重现步骤

  1. 执行100次AC断电与上电操作(AC Power Cycle)
  2. 收集系统日志(包括SEL、BMC Log、app.log等)
  3. 查询并统计“Server power failure occurred”事件条目数量
  4. 对比实际记录事件数与预期事件数(应为100)

期望结果

每次AC操作都应触发一次 “Server power failure occurred” 事件,并生成对应日志条目,共计 100条


实际结果

  • 共记录事件数:96条
  • 缺失事件数:4条
  • 最近一次未记录时间点2026-04-01 01:46:09 UTC
  • 日志文件提示:Server power failure Aa_&.* 第1页, 共96页] —— 直接表明仅有96条相关事件

事件机制分析

1. “Server power failure occurred”事件来源

  • 该事件由 PSUServerPowerFailure 表示,其EventKeyId为:
    EventKeyId = "PSUServerPowerFailure"
    
  • 消息模板为:

    “Server power failure occurred at %1, The power has been already restored.”

  • 属于 Major(严重)级别告警,由BMC侧 power_mgmt 组件生成。

2. 触发路径与依赖

AC断电信号 
  → CPLD检测AC状态变化 
    → GPIO信号触发中断 
      → BMC Log记录AC Lost Signal(代码0x0300001F)
        → power_mgmt组件调用 add_event.generate_power_failure() 生成事件
          → 写入SEL及app.log/maintenance.log

支持证据:

  • AC Lost Signal 事件在日志中表现为:
    Get AC lost signal [repeated xx times from ...]
    
  • 来自搜索结果9和文档块1中的日志片段显示该机制存在,且曾在2509版本中正常运行。

问题根因分析

:white_check_mark: 已知事实

  1. OpenUBMC2509版本 中,AC次数与事件记录数相等 → 说明机制本身可行。

  2. 当前版本(2512)虽能记录大部分事件,但存在漏记。

  3. 最近一次未记录事件时间点 2026-04-01 01:46:09 前后日志如下:

    • 238: BMC重启(openBMC is restarted after AC power supply is restored)
    • 237: ACPI处于工作状态
    • 缺少“Server power failure”事件条目
  4. 根据用户提供的代码段:

    skynet.sleep(10000)  -- 延迟10秒才触发事件
    add_event.get_instance().generate_power_failure('true', time_stamp)
    

    表明:事件注册存在显著延迟(10秒)


:cross_mark: 根本原因推测(基于证据)

:red_circle: 事件注册延迟导致系统状态已恢复,事件被跳过或丢弃

  • 原因:事件生成函数 generate_power_failure 被延后执行(skynet.sleep(10000),即10秒)。
  • 结果:在AC Power Cycle过程中,若系统启动速度较快, BMC和主机可能在10秒内已完成初始化并进入工作状态
  • 此时再调用 generate_power_failure(true) 已失去意义,组件可能判定“非断电状态”,拒绝生成重复/无效事件。
  • 因此导致 部分快速重启场景下的事件被遗漏

:yellow_circle: 日志覆盖问题加剧排查难度

  • 用户指出:“分析结论:在power_mgmt组件产生的事件,但是app log已被覆盖”
  • 多次AC循环会频繁写入日志,若日志轮转机制不完善(如文件大小限制、保留份数不足),旧事件可能已被清除。
  • 特别是 /var/log/app.logmaintenance.log 易受高频操作影响(参考搜索结果8“日志刷屏测试”)。

:yellow_circle: Event Registration Failure 现象关联

  • 知识图谱中存在 Event Registration Failure 概念:

    “指系统事件在AC cycle测试期间未被正确注册”

  • 并且与 PSU 和 PSUServerPowerFailure 有关联。
  • 当事件无法匹配静态配置(如EventKeyId缺失、Schema错误),将导致注册失败。

验证与排查建议

:white_check_mark: 已有验证

  • 确认事件机制在2509版本中完整(版本间差异需调查)
  • 获取一键日志包(R220KV2_…tar.gz)用于深入分析

:magnifying_glass_tilted_left: 进一步排查建议

1. 检查事件注册流程是否完成

  • 确认 HwBMCEvent_v1_0_0 Schema是否正确定义:
    {"event": "PSUServerPowerFailure", "schema": "HwBMCEvent_v1_0_0"}
    
  • 检查EventKeyId是否一致:
    • 正确值应为:PSUServerPowerFailureSystem.PowerFailure
    • 否则会导致 event miss-match

2. 分析AC周期时间和事件延迟关系

  • 提取每次AC操作的开始与结束时间
  • 比对BMC重启时间(如openBMC is restarted after AC...)与事件生成时间
  • 判断是否 事件生成滞后于系统启动完成

3. 检查skynet.sleep(10000)合理性

  • 当前延迟 10秒(10000 ticks ≈ 10s) 明显过长
  • 推荐优化至 1~3秒内完成事件触发
  • 可改为事件驱动模式,而非定时触发:
    -- 替代sleep,改为GPIO中断触发后立即处理
    on_ac_lost_signal(function()
        generate_power_failure(true, current_time)
    end)
    

4. 检查日志保留策略

  • 查看日志配置:
    ls -l /var/log/app.log*
    cat /etc/logrotate.d/openobmc
    
  • 确保设置合理保留策略,例如:
    • 保留至少5个历史文件
    • 单个文件不超过50MB

解决方案建议

:white_check_mark: 方案一:【代码修复】优化事件生成时机(优先级高)

修改 power_mgmt 中事件生成逻辑,移除skynet.sleep(10000)延迟,改为:

local function on_ac_lost_detected()
    local timestamp = get_current_utc_time()
    add_event.get_instance().generate_power_failure('true', timestamp)

    -- 2秒后自动清除告警
    skynet.fork(function()
        skynet.sleep(200)
        add_event.get_instance().generate_power_failure('false', timestamp)
    end)
end

优点:确保事件在断电后立即注册,避免因系统启动过快而错过。


:white_check_mark: 方案二:【增强健壮性】添加事件状态校验机制

在事件生成前,检查最近一次是否已记录同类事件:

if not is_recent_event_recorded('PSUServerPowerFailure', 30) then
    generate_power_failure(...)
end

作用:防止重复事件,同时可以弥补因延迟导致的“看似重复但实为漏记”的问题。


:white_check_mark: 方案三:【日志优化】分离关键事件日志

将电源类事件(如power failure)输出到专用日志文件,如:

/var/log/power_events.log

并禁用该文件的自动压缩或频繁轮转。

优势:避免被大量其他日志冲刷,便于长期追踪。


总结

项目 内容
问题本质 AC断电事件未全部注册为“Server power failure”告警
主因分析 power_mgmt 组件使用 skynet.sleep(10000) 导致事件生成严重滞后,系统恢复后事件失效
次要因素 日志覆盖、快速启动场景加剧事件丢失
解决方案 移除延迟,改为中断驱动即时触发;强化事件去重与落盘机制
验证方式 重新执行100次AC,确认SEL中事件条目为100条

:white_check_mark: 建议修复版本:在后续OpenUBMC版本中(如2513或SP补丁包)应用上述代码优化。

日志里最近一次异常时间点2026-04-01 01:46:09的app.log日志已经刷没了,能否重新复现下,收集下日志看下当时app.log的日志

测试AC间隔问题,偶现的那几次事件产生的慢了点,还未记录就下次AC了