NandFlash写入过量

问题描述

BMC Web中上报轻微告警,事件码为0x1A000043,事件描述为:The data written to the NAND flash in last 15 days exceeds 12G。

环境信息

  • 操作系统:OS:openEuler 20.03 (LTS-SP3);内核版本:4.19.90-2112.8.0.0131.oe1.aarch64

  • 软件版本: OpenUBMC 2509

  • 硬件配置:

重现步骤

  1. BMC Web中上报轻微告警,事件码为0x1A000043,事件描述为:The data written to the NAND flash in last 15 days exceeds 12G。

  2. 一键收集日志中查看dump_info\AppDump\bmc_soc\nandflash_info.txt,“Total data written in 15 days”这一项实际超过12G,则确认是真实告警,非误告警。

期望结果

不应当有如此大量的nandflash写入量;即:不应当出现此类告警。

实际结果

NandFlash写入过量 (written to NAND fash in last 15 days exceeds 12G)

尝试过的解决方案

1.检查一键收集日志,发现半个月内日志容量大小不超过500M;

2.检查上传固件包的数量,然后推算容量,也远不及12G.

3.通过查阅场内wiki,注意到还可能存在文件重复读写、数据库频繁写入+写入放大等问题,但是没有手段跟踪。

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

:yellow_circle: 总结与建议

项目 内容
告警性质 真实告警,NAND 写入量已达 12.026GB
严重程度 轻微(Minor),不影响运行,但有硬件老化风险
根本风险 NAND Flash 寿命下降,长期可能引发损坏或启动失败
建议措施 1. 定位高写入组件
2. 优化数据库事务处理
3. 降低日志与采集频率
4. 建立 NAND 写入监控机制

:white_check_mark: 最终建议:联系设备厂商技术支持,提供完整一键日志包,重点分析 mdb_info.lognandflash_info.txt,识别最大写入源并进行代码或配置优化。

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

NAND Flash 写入过量告警问题分析与处理

:red_circle: 问题概述

在 BMC Web 界面中上报一条轻微告警(Minor),具体信息如下:

  • 事件码0x1A000043
  • 事件描述The data written to the NAND flash in last 15 days exceeds 12G
  • 告警级别:轻微(Minor)
  • 产生时间:2025-05-31 18:40:33(依据知识图谱数据)

该告警表示:在过去 15 天内,写入到 NAND Flash 的数据总量已超过 12GB 的阈值。该行为可能影响 NAND Flash 的使用寿命,需引起关注。


:receipt: 核心信息确认

根据用户上传的 nandflash_info.txt 日志内容:

Total Written Amount          : 12.028GB
Total data written in 15 days : 12.026GB
Data written per day in 15 days : 8.993GB 2.792GB 0.241GB ...

:white_check_mark: 结论:该告警为真实告警,并非误报。实际 15 天内写入量达到 12.026GB,接近阈值。


:gear: 告警原理与背景

:white_check_mark: 相关实体解析

实体 说明
BMC Baseboard Management Controller,负责监控系统运行状态,包括 NAND Flash 写入量。
NAND Flash 非易失性存储介质,用于保存 BMC 的固件、配置和日志,频繁写入会缩短其寿命。
0x1A000043 系统事件码,对应“NAND Flash 15天写入超限”事件。
nandflash_info.txt 存放于 dump_info/AppDump/bmc_soc/ 路径下的日志文件,记录 NAND 使用详情。

:magnifying_glass_tilted_left: 触发机制

  • BMC 实时监控 NAND Flash 的写入量。
  • 当过去 15 天累计写入量 > 12GB 时,自动触发告警 0x1A000043
  • 告警归类为 Minor(轻微),不中断业务,但提示潜在风险。

:pushpin: 注:NAND Flash 寿命与 P/E 次数(Program/Erase Cycle)相关,频繁写入将加速老化。


:man_detective: 可能原因分析

尽管用户尝试确认日志和固件包体积远小于 12GB,但仍出现大量写入,结合知识库信息,可能存在以下 隐蔽性高写入来源

1. 高频传感器数据采集

  • 若启用了定期执行 ipmcget -t sensor -d list 等命令进行传感器轮询,且频率过高(如秒级),会产生持续的小写操作。
  • 此类操作会累积成大量 I/O 写入 NAND。

2. 数据库频繁写入 + 写入放大

  • 使用 SQLite 等本地数据库的组件(如 power_strategy)可能采用“先清空再逐条插入”的方式更新数据。
  • 每次插入/删除都涉及 B+ 树结构调整,导致 实际闪存写入量 >> 数据本身大小(即“写入放大”)。
  • 典型案例:300KB 数据导致 20MB 闪存写入。

:link: 参考文档:【persistence】问题定位方法&FAQ #5.4

3. 未使用事务批量提交

  • 若数据库操作未使用 db:tx() 批量事务机制,而是逐条调用 save(),每条记录都会触发一次磁盘写入。
  • 当操作 ≥5 条时,应使用事务合并写入以减少 I/O。

4. 日志刷盘频率过高

  • 系统日志、调试日志或组件 trace 日志若设置为高频率强制刷盘(flush),也会造成写入暴增。
  • 特别是 Lua 脚本中异常捕获后频繁输出 debug 日志。

5. 配置或状态频繁变更

  • 某些管理功能(如 Redfish 接口频繁修改配置)可能导致系统状态频繁持久化。
  • 如 LED 控制、电源策略切换、风扇调速等若由外部脚本高频调用,会触发大量写操作。

:hammer_and_wrench: 处理建议与优化措施

:white_check_mark: 1. 重启 openBMC(初步恢复)

reboot
  • 可临时缓解当前告警状态。
  • 注意:若根本原因未解决,告警将在后续周期重现。

:white_check_mark: 2. 分析 nandflash_info.txt 中每日写入分布

当前片段仅显示前三天写入:
8.993GB2.792GB0.241GB
:backhand_index_pointing_right: 推测存在某次突发性大量写入事件(如日志风暴或配置重置)。

:pushpin: 建议:

  • 获取完整 Data written per day in 15 days 数据。
  • 定位写入高峰发生在哪一天,结合该时间段的操作日志进行关联分析。

:white_check_mark: 3. 检查 mdb_info.log 中数据库写入统计

路径:AppDump/<component>/mdb_info.log
查找 local persistence write statistics 字段,重点关注:

  • 是否有组件在短时间内执行了数百次数据库写入?
  • 是否存在“先清空再重插”的模式?

:pushpin: 示例排查命令(设备上执行):

iostat -k -d 1 1

在触发疑似写入动作前后运行,观察 NAND 所在分区的 kB_wrtn/s 是否显著上升。

:white_check_mark: 4. 优化数据库写入逻辑

对于本地持久化组件,必须遵循:

db:tx(function()
    for _, item in ipairs(data_list) do
        table.insert(db_item, item)
    end
end)

避免:

for _, item in ipairs(data_list) do
    item:save()  -- ❌ 每次 save 都是一次写入!
end

:white_check_mark: 5. 控制日志级别与输出频率

  • 关闭不必要的 DEBUG 级别日志。
  • 避免在循环中输出日志。
  • 使用条件判断限制日志输出频次。

:white_check_mark: 6. 审查定时任务与自动化脚本

检查是否有外部监控系统或内部 cron 任务频繁调用:

  • IPMI 命令查询
  • Redfish 接口更新配置
  • Sensor 信息轮询

建议降低采集频率(如从每秒改为每10秒以上)。


:books: 参考资料与延伸

:link: 官方讨论链接(建议阅读)

https://discuss.openubmc.cn/t/topic/1693

该论坛链接已被系统推荐,可能包含类似案例分析及最佳实践。

:open_file_folder: 关键日志路径

文件 作用
dump_info/AppDump/bmc_soc/nandflash_info.txt NAND 使用统计
AppDump/*/mdb_info.log 各组件数据库写入量
journalctl -u bmc.service BMC 系统运行日志

:yellow_circle: 总结与建议

项目 内容
告警性质 真实告警,NAND 写入量已达 12.026GB
严重程度 轻微(Minor),不影响运行,但有硬件老化风险
根本风险 NAND Flash 寿命下降,长期可能引发损坏或启动失败
建议措施 1. 定位高写入组件
2. 优化数据库事务处理
3. 降低日志与采集频率
4. 建立 NAND 写入监控机制

:white_check_mark: 最终建议:联系设备厂商技术支持,提供完整一键日志包,重点分析 mdb_info.lognandflash_info.txt,识别最大写入源并进行代码或配置优化。


:pushpin: 提示:建议将 NAND 写入监控纳入日常运维巡检项,防患于未然。

日志补充:

app.log.8.txt (2.1 MB)

app.log.7.txt (2.0 MB)

app.log.6.txt (2.1 MB)

app.log.5.txt (2.1 MB)

app.log.9.txt (2.0 MB)

日志补充:

app.log.3.txt (2.1 MB)

app.log.2.txt (2.1 MB)

app.log.1.txt (2.0 MB)

app.log.txt (1.1 MB)

app.log.4.txt (2.1 MB)

查看日志发现每份日志都存在如下类似调试日志的打印,每隔几分钟会打印一次。
可以排查一下是否是调试日志刷屏导致

2026-02-07 08:44:36.038675 compute ERROR: NPUCard.lua(661): time_out ========== 9
2026-02-07 08:44:36.040206 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:44:41.029839 compute ERROR: NPUCard.lua(661): time_out ========== 8
2026-02-07 08:44:41.030448 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:44:46.031416 compute ERROR: NPUCard.lua(661): time_out ========== 7
2026-02-07 08:44:46.032093 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:44:46.847976 bios NOTICE: bios_object_mutihost.lua(842): [bios]wait password ack timeout: reset password(0) status.
2026-02-07 08:44:46.878110 bios NOTICE: bios_object_mutihost.lua(842): [bios]wait password ack timeout: reset password(1) status.
2026-02-07 08:44:51.033438 compute ERROR: NPUCard.lua(661): time_out ========== 6
2026-02-07 08:44:51.034867 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:44:56.033728 compute ERROR: NPUCard.lua(661): time_out ========== 5
2026-02-07 08:44:56.034320 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:45:01.031061 compute ERROR: NPUCard.lua(661): time_out ========== 4
2026-02-07 08:45:01.031595 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:45:06.034851 compute ERROR: NPUCard.lua(661): time_out ========== 3
2026-02-07 08:45:06.035345 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:45:11.030327 compute ERROR: NPUCard.lua(661): time_out ========== 2
2026-02-07 08:45:11.032033 compute ERROR: NPUCard.lua(662): McuFirmwareVersion = 1 MemoryCapacityKiB = 1 Elabel = 0 DeviceTemperature = 1 PcbVersion = 1 Capabilities = 1 BoardID = 1 PowerWatts = 1 FirmwareVersion = 1 McuTime = 1
2026-02-07 08:45:11.984740 bios NOTICE: bdf_service.lua(266): write_one_frame: pcie bdf reported, set bios boot stage completed.

日志已经排查过了,没有过量的日志

如果不是app日志刷屏

  1. 持久化数据的读写

看一下framework日志

  1. 串口日志

systemcom.dat

一键日志收集_AT225B2(D)_20260209-0154 (1).tar.gz (9.5 MB)