脚本轮询sensor和fan信息,产生了NAND flash写入过多告警

问题描述

脚本轮询sensor和fan信息,产生了NAND flash写入过多告警

重现步骤

期望结果

没有写入过多告警

实际结果

尝试过的解决方案

收集日志查看,大量cli超时日志打印刷屏

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

7. 结论

脚本高频轮询 + 同步日志写入 是导致 NAND Flash写入超标告警 的根本原因。

该问题虽为“轻微”级别,但长期存在将显著缩短NAND Flash寿命,可能导致BMC固件损坏或启动失败

建议立即优化脚本策略,采用低频采样、内存缓存、异步写入、日志轮转等机制,从根本上缓解Flash写入压力。


:white_check_mark: 最终目标:在满足监控需求的前提下,最小化对NAND Flash的写入负担。

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

关于脚本轮询导致NAND Flash写入过多告警的分析与处理建议


1. 问题描述

用户通过脚本周期性轮询 sensorfan 信息,执行命令如下:

ipmcget -t sensor -d list
ipmcget -d coolingdeviceinfo -v fan

并将结果记录日志或保存至CSV文件。
结果:

  • 脚本运行约15天后,BMC(基板管理控制器)触发告警:

    “The data written to the NAND flash in last 15 days exceeds 12G”

  • 告警级别:轻微(Minor)
  • 事件码:0x1A000043
  • 产生时间:2026-02-21 21:57:30(示例)

同时,系统日志中出现大量CLI超时信息,进一步加剧了NAND Flash写入压力。


2. 根本原因分析

(1) 高频脚本轮询导致日志频繁写入
  • 脚本每15秒执行一次,每日执行约 5760次
  • 每次执行:
    • 执行命令并输出结果
    • 调用 logger.info() 写入日志
    • 保存数据至CSV文件
  • 所有日志和文件写入均落盘至NAND Flash,而NAND Flash为非易失性存储,有写入寿命限制。
  • 长时间累积写入量超过系统预设阈值 12GB / 15天,触发告警。

:white_check_mark: 知识库依据

  • 实体 NAND Flash 明确指出:“NAND Flash是服务器中的一种非易失性存储设备,其寿命受频繁写操作影响。”
  • 实体 "The Data Written to the NAND Flash in Last 15 Days Exceeds 12G" 对应事件码 0x1A000043直接由NAND Flash写入量超标触发
  • 文档搜索结果指出:“大量静态数据写入flash会影响性能和flash寿命。”
(2) 日志系统无缓冲或异步机制
  • logger.info()同步写入,每次调用均直接写入文件系统。
  • 未采用异步日志、缓存、轮转或压缩策略,写入效率低且频率极高
  • 加之CSV文件持续追加写入,频繁触发文件系统元数据更新,进一步放大实际写入量

:white_check_mark: 知识库依据

  • 搜索结果【持久化机制常见问题】指出:“避免频繁结构性写入,批量插入应使用事务机制 db:tx(),否则可能导致实际flash写入量远大于数据量。”
  • 类似场景中,300KB数据实际写入20MB Flash
(3) 脚本日志刷屏与CLI超时加剧问题
  • 日志中出现大量CLI超时记录,如:
    cli NOTICE: base.lua(467): processing_flow_1 foreach_1 timeout
    
  • 这些系统层面的日志也可能因负载过高而被反复记录,形成恶性循环。
  • 高频脚本执行可能导致BMC资源紧张,进一步引发CLI响应慢或超时,形成**“写入→负载高→超时→更多日志→更多写入”** 的死循环。

:white_check_mark: 知识库依据

  • 《openUBMC devmon特性设计说明书》提到:“磁盘I/O限制处理:需通过日志轮转、缓存、异步写入等方式减少磁盘访问。”

3. 告警详情摘要

项目 内容
告警名称 The data written to the NAND flash in last 15 days exceeds 12G
事件码 0x1A000043
严重级别 轻微(Minor)
检测主体 BMC
触发条件 15天内NAND Flash写入总量 > 12GB
当前写入量 实测为 12.084GBTotal Data Written In 15 Days
记录文件 nandflash_info.txt(由BMC生成)

4. 问题重现路径

步骤 操作 结果
1 编写Python脚本,每15秒轮询sensor与fan信息 成功获取数据
2 使用 logger.info() 输出日志并保存至CSV 日志持续增长
3 脚本持续运行超过10天 NAND Flash写入量累积接近阈值
4 约15天后 BMC触发轻微告警 0x1A000043

5. 处理建议与优化方案

:white_check_mark: 建议1:减少脚本执行频率
  • 将轮询周期从15秒提升至60秒或更长
  • 若非实时监控需求,每5分钟执行一次已足够。
  • 可降低写入频率约4倍以上

:pushpin: 示例:

time.sleep(300)  # 替代 time.sleep(15)
:white_check_mark: 建议2:使用内存缓冲 + 批量写入
  • 在内存中缓存数据,定时批量写入文件
  • 避免每次轮询都执行磁盘写操作。

:pushpin: 示例:

buffer = []
if len(buffer) >= 10:  # 每10次写入一次文件
    save_to_csv_batch(buffer, "fan_collect.csv")
    buffer.clear()
:white_check_mark: 建议3:启用异步日志机制
  • 使用异步日志库(如 concurrent-log-handler)或BMC内置异步I/O机制。
  • 减少对NAND Flash的直接冲击。

:white_check_mark: 知识库支持

  • 《Metrics度量数据采集》提到支持 异步仪器(observable_counter)通过回调采集,避免频繁直接写入。
:white_check_mark: 建议4:配置日志轮转与压缩
  • 启用日志轮转(log rotation),如按大小或时间切分。
  • 自动压缩旧日志,减少长期存储压力

:white_check_mark: 知识库支持

  • 《openUBMC devmon》建议:“日志轮转:自动轮转和压缩日志文件,防止磁盘空间耗尽。”
:white_check_mark: 建议5:使用临时文件系统(tmpfs)缓存
  • 将临时CSV文件写入内存文件系统(如 /tmptmpfs)。
  • 定期汇总后,再批量落盘至NAND Flash。
:white_check_mark: 建议6:通过Redfish或IPMI订阅机制替代轮询
  • 使用 IPMI Sensor EventRedfish Event Service 订阅事件。
  • 仅在状态变化时记录日志,避免无意义轮询。

:white_check_mark: 知识库支持

  • Get Sensor Event Status 支持事件状态查询。
  • ThresholdSensor_CPUTemp 等传感器支持健康状态事件触发。

6. 验证方法

方法 说明
查看NAND写入统计 检查 nandflash_info.txt 文件,确认写入量趋势
监控BMC告警页面 登录BMC Web界面 → “维护诊断 → 当前告警” 查看是否仍有 0x1A000043 告警
使用iostat监控写入 执行 iostat -k -d 1 1 查看分区写入速率
日志写入量测试 修改脚本,对比优化前后日志文件大小与系统写入量差异

7. 结论

脚本高频轮询 + 同步日志写入 是导致 NAND Flash写入超标告警 的根本原因。

该问题虽为“轻微”级别,但长期存在将显著缩短NAND Flash寿命,可能导致BMC固件损坏或启动失败

建议立即优化脚本策略,采用低频采样、内存缓存、异步写入、日志轮转等机制,从根本上缓解Flash写入压力。


:white_check_mark: 最终目标:在满足监控需求的前提下,最小化对NAND Flash的写入负担。

查询下是否CPU占用率过高导致接口响应变慢

上面日志截长一点

看后面哪个接口超时了 都用了多久

这个就是日志刷太多了

超时的原因是什么呢?这个查询具测试说半分钟查一次,没有很频繁,超时应该不正常吧?

是的 正常不应该超时

所以说看一下后半截详细的日志

具体哪个接口 哪里超时了

主要就是fan和sensor超时了,因为脚本就在一直查这个,日志附上

app.log.txt (1.7 MB)

看起来就是单纯的遍历性能问题

麻烦确认一下

  1. 轮询时CPU内存占用是否较高
  2. 传感器/Fan数量是否比较多
  3. 单台环境还是多台环境出现

其实单个接口超时不超过100ms

但是也超过日志的阈值了

Nandflas 写入过多.z01.txt (8 MB)
Nandflas 写入过多.zip (3.4 MB)

现在论坛能上传后缀为zip的文件了,但是10mb的限制太小了,导致只能分卷压缩,把第一个文件的txt去掉,即可解压