问题描述
注入内存错误超过CE阈值后,maintenance.log下没有相应的overflow日志记录,但是fdm.log下依然会记录CE次数和overflow。经分析后得知可能是BMC侧做了主动注错限流机制,导致maintenance.log下没有记录对应的日志信息。
请问这个主动限流的策略是怎样的?触发后如何操作可以解除限流机制呢?
相关日志如log.tar.gz
log.tar.gz (8.9 MB)
注入内存错误超过CE阈值后,maintenance.log下没有相应的overflow日志记录,但是fdm.log下依然会记录CE次数和overflow。经分析后得知可能是BMC侧做了主动注错限流机制,导致maintenance.log下没有记录对应的日志信息。
请问这个主动限流的策略是怎样的?触发后如何操作可以解除限流机制呢?
相关日志如log.tar.gz
log.tar.gz (8.9 MB)
答案内容由AI生成,仅供参考:
| 项目 | 说明 |
|---|---|
maintenance.log 没有记录 Overflow |
最可能原因是 MemFaultIsolationEnabled 未启用或日志流控/容量满导致丢弃 |
| 是。BMC 存在日志速率控制、事件聚合和错误风暴抑制机制 | |
| 启用隔离功能、清除日志、调整注入节奏、使用调试接口 | |
启用 MemFaultIsolationEnabled,并通过 Redfish 下载全量日志以确保诊断完整性 |
建议:若用于测试验证,请在注入前确保
maintenance.log可写且空间充足,并开启所有诊断开关以保障日志完整。
maintenance.log 未记录 Overflow 日志的问题分析在注入内存可纠正错误(Correctable ECC Error, CE)超过阈值后,系统未在 /var/log/maintenance.log 文件中记录对应的 Overflow 相关日志,但 fdm.log 中仍能观测到 CE 错误次数统计和 Overflow 状态。经初步排查,怀疑是 BMC 侧存在主动的日志注错限流机制,导致关键事件未能写入维护日志。
根据当前知识库内容,可以确认以下几点关键事实:
maintenance.log 是系统维护事件的主要记录日志/var/log/maintenance.loglog:maintenance(level, fault_code, fmt, ...) 进行写入。来源:搜索结果【Lua开发框架】中明确指出:“维护日志位置:/var/log/maintenance.log。该日志用于记录系统运行过程中的维护事件。”
| 指标 | 描述 | 来源 |
|---|---|---|
CorrectableECCError |
可纠正 ECC 错误次数超过预设门限(Threshold),触发告警 | KG & 搜索文档【资源协作接口】 |
CorrectableECCOverflow |
可纠正 ECC 错误漏斗溢出(即缓冲区溢出),表示系统已无法继续跟踪高频率错误 | KG & 搜索文档【资源协作接口】 |
bmc.kepler.Systems.FDMDomain.MemoryRAS 中:
CorrectableECCError: 内存发生多次 CE 错误导致超门限,1 表示超限。CorrectableECCOverflow: 内存发生 CE 漏斗溢出,非零表示溢出。Correctable ECC Logging Limit(例如设为 3)后,系统应上报 SEL(System Event Log)事件 "Correctable ECC logging limit reached"。示例日志记录(来自 DC 文档 #1):
3,2025-11-07 10:21:00,P0_C1_D0_Status,Minor,Memory,Asserted,Correctable ECC logging limit reached
2,2025-11-07 10:20:41,P0_C1_D0_Status,Minor,Memory,Asserted,Spare
对应动作:
fault_diagnosis NOTICE: fpc_process: need SPPR
fpc_process: send isolation[1] info to imu success!!!
maintenance.log 是否记录的关键配置:MemFaultIsolationEnabled“经排查,
MemFaultIsolationEnabled这个属性值需要配置为true才可以” —— Fangzq
maintenance.log。目前尚无直接说明 “注错限流” 的机制,但从相关设计中可推断存在以下几种可能影响日志写入的保护策略:
LogAnalysis 模块支持趋势识别和早期预警,说明系统具备日志聚合能力,低级别重复日志可能被抑制。支持证据:
ErrorStormCount 字段用于统计 CE/UCE 高频爆发事件。CorrectableECCStormBurstCount 专门记录超级 CE 风暴事件。CorrectableECCOverfrequencyCount 记录错误频次超标次数。来源:文档 #5 和 #7 反映的问题:
“BMC传感器日志容量满后没有覆盖(满了之后不再记录除非先clear log)”
解决建议:
# 清除 SEL 日志(谨慎操作)
ipmcset -t maint -d clearlog
maintenance.log 事件。| 操作 | 方法 | 目的 |
|---|---|---|
| 1. 启用内存故障隔离功能 | 确保 MemFaultIsolationEnabled = true |
允许 BMC 上报并记录 ACLS/Overflow 事件 |
| 2. 修改 CE 阈值和漏斗时间 | BIOS 设置:Funnel Time 和 Correct Error Threshold |
控制 CE 计数窗口,避免漏斗过早溢出 |
| 3. 手动清除日志缓冲区 | 使用命令 ipmcset -t maint -d clearlog 或通过 Redfish API 清空日志 |
释放日志空间,恢复记录能力 |
| 4. 启用调试模式记录 | 使用 log:info_easy() 或 log:notice_easy() 强制输出调试信息 |
绕过部分流控策略 |
| 5. 下载完整日志包 | 通过 Redfish 接口下载全部日志:POST /redfish/v1/Managers/ManagerId/LogServices/Oem/Chinatelecom/DownloadAllLog |
获取包括 fdm.log、sel.log 在内的完整诊断数据 |
Redfish API 支持路径:
Redfish V1 Managers ManagerId LogServices Actions Oem Chinatelecom DownloadAllLog
确认 MemFaultIsolationEnabled 是否开启
查看 CorrectableECCOverflow 是否置位
# 查询 MemoryRAS 属性
get_dbus_property bmc.kepler.Systems.FDMDomain.MemoryRAS CorrectableECCOverflow
检查 maintenance.log 是否被流控或写满
(Log full) 或 drop log 的提示。对比 fdm.log 与 maintenance.log 时间戳
fdm.log 是否先于 maintenance.log 更新。使用 Redfish 工具一键导出所有日志
https://<BMC_IP>/redfish/v1/Managers/ManagerId/LogServices/Oem/Chinatelecom/DownloadAllLog
| 项目 | 说明 |
|---|---|
maintenance.log 没有记录 Overflow |
最可能原因是 MemFaultIsolationEnabled 未启用或日志流控/容量满导致丢弃 |
| 是。BMC 存在日志速率控制、事件聚合和错误风暴抑制机制 | |
| 启用隔离功能、清除日志、调整注入节奏、使用调试接口 | |
启用 MemFaultIsolationEnabled,并通过 Redfish 下载全量日志以确保诊断完整性 |
建议:若用于测试验证,请在注入前确保
maintenance.log可写且空间充足,并开启所有诊断开关以保障日志完整。
触发维护日志限流后,maintenance.log日志对应会有关键词“logs start suppressing”,例如这里CE overflow场景即会打印:
2026-01-26 22:44:05 INFO : SVR-0000000,CpuBoard1 DIMM000 CE overflow logs and CE Bucket logs start suppressing
CE overflow限流策略:相同FRU在2小时内触发相同日志次数=5后,触发日志限流
解除限流方法:
1.构建rw版本后,通过资源树debug方法可以查看和设置限流状态
mdbctl lsobj FDMDomain
查询限流功能开关状态:mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain GetConfigurations 0 "GetMaintenanceLogLimitingEnabled"
限流开关:treu:打开,false:关闭
设置限流开关:mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain SetConfigurations 0 "SetMaintenanceLogLimitingEnabled" 1
开关:1:开启,0:关闭
备注:执行0关闭场景,才会关闭限流状态
2.通过重启BMC可重新计时计数
澄清一下:
mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain GetConfigurations 0 “GetMaintenanceLogLimitingEnabled”
该调试接口,获取的是限流功能是否使能,不是限流状态,限流使能状态本身不做持久化,所以重启BMC后默认状态依然为true
mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain SetConfigurations 0 “SetMaintenanceLogLimitingEnabled” 0
该调试接口,0设置限流使能为关闭,执行关闭后同步会清空所有部件限流状态
我们执行成功mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain SetConfigurations 0 “SetMaintenanceLogLimitingEnabled” 0这个命令,然后再去测试内存注入错误,在注入第六次的时候,依然是有限流提示的,这是正常现象吗?
通过该命令可修改app.log日志级别
busctl --user call bmc.kepler.fault_diagnosis /bmc/kepler/fault_diagnosis/MicroComponent bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 2
麻烦修改日志级别后,提供下复现的一键收集日志