OS下电后风扇转速过高问题

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

OS下电后风扇转速过高问题分析与解决方案

根据您提供的详细信息,以下是对**OS下电后风扇转速持续保持在80%**这一问题的全面分析和建议。


:magnifying_glass_tilted_left: 问题现象总结

  • BMC版本:基于2509版本
  • 问题表现
    • OS上电时,风扇转速正常(约30%);
    • 执行OS下电操作后,约两秒内风扇转速升至80%,并持续保持高转
    • 噪声显著增大,影响使用体验;
    • 下电完成后,风扇未恢复到预期低速或停转状态。

:puzzle_piece: 根本原因分析

1. 异常调速触发机制

从配置可见,存在一条针对 PCIe 卡(如网卡)温度的 CoolingRequirement 策略配置:

{
  "RequirementID": "52",
  "MonitoringStatus": "<=/Scanner_IBTemp.Status",
  "MonitoringValue": "<=/Scanner_IBTemp.Value",
  "FailedValue": 80,
  "TargetTemperatureCelsius": 80,
  "MaxAllowedTemperatureCelsius": 100
}
  • FailedValue: 80 表示当该温度传感器的 MonitoringStatus 异常(如变为 disable、无效或读取失败)时,将触发“异常调速”,强制风扇以 80% 转速运行。

2. 上下电过程中的时序竞争

结合运行流程分析,问题本质是一个时序竞态问题(Race Condition)

时间轴 事件
t=0 开始执行OS下电
t≈1s PCIe设备或其电源先于主板断电 → 温度传感器 Scanner_IBTemp 断连或状态失效 → Status 变为异常
t≈1.1s Thermal Management模块检测到MonitoringStatus异常 → 触发FailedValue=80%调速
t≈2s Cooling组件最终识别整机电源状态为OFF,但此时高转速已生效且无回退机制 → 风扇维持80%转速

:white_check_mark: 核心问题
异常调速(abnormal cooling)先于电源状态判断生效,且下电后未清除已触发的异常策略

3. :warning: 引申风险

正如您所指出,此问题具有普遍性风险

  • 所有依赖于FailedValue策略的传感器(尤其是PCIe扩展卡、OCP网卡、GPU等外设),在下电过程中由于供电时序不一致,可能先于主系统失联;
  • 导致传感器状态异常 → 触发异常调速 → 风扇升速;
  • Cooling组件虽然后续判断电源关闭,但由于异常调速是“事件驱动型”而非“状态同步型”,缺少主动清零机制
  • 结果:风扇持续运行在非预期高速状态

这不仅带来:

  • 噪声问题;
  • 整机功耗增加;
  • 可能影响风扇寿命;
  • 严重时违背电源管理规范(如下电应尽可能静默)。

:books: 相关知识支撑(来自上下文知识库)

:white_check_mark: FailedValue 的作用定义

FailedValue 是一种故障安全机制(fail-safe mechanism),用于在温度传感器失效、值异常或监测状态异常时,设置一个默认风扇速度,确保系统仍能获得基本散热保障。

  • 默认值一般为 80%100%(视配置而定);
  • 只要 MonitoringStatus 不为正常(normal),即可能触发;
  • 一旦触发,在无更高优先级策略覆盖或无显式清除前,将持续生效。

:white_check_mark: ContBin_H20L5:用于风扇转速异常检测

  • contbin_H20L5 是一种高稳定性防抖机制(连续20次高、5次低),用于重要故障的稳定检测
  • 应用于“风扇转速异常”、“电源在位监控”等关键场景;
  • 表明此类状态变更需经过严格确认,防止误判。

但当前问题是状态误判后的响应滞后,而非防抖精度问题。


:white_check_mark: 是否属于异常?—— 结论:是异常行为

尽管 FailedValue 的设计初衷合理,但在 电源关闭状态下仍维持高风扇转速 明显不符合预期逻辑。

判断依据:

维度 分析
功能需求 下电后系统无负载,无需主动散热 → 风扇应降速或停转
功耗规范 下电后应最小化功耗 → 持续80%转速违反节能原则
用户体验 噪声过大影响机房环境
安全性 虽然保障了散热冗余,但在断电场景中无实际意义

:backhand_index_pointing_right: 结论
这是一个典型的控制策略优先级与执行时序不匹配导致的功能缺陷,应视为需修复的异常。


:light_bulb: 解决方案建议

不应仅在 thermal_mgmt 组件中添加补丁式监控线程,而应在 cooling 组件层面进行根本性优化

推荐方案一:【最优解】在 Cooling 组件中引入 电源状态优先级策略

:white_check_mark: 改进思路:

电源状态是最高优先级的状态信号。当系统进入“OFF”状态时,所有基于传感器异常的调速策略(包括FailedValue)应被强制抑制或清除

实现方式:

-- 伪代码示意
if PowerState == "OFF" then
    -- 忽略所有传感器异常导致的调速请求
    -- 清除当前由 FailedValue 触发的调速状态
    clear_all_abnormal_cooling_requests()
    
    -- 下发固定低速或0%
    set_fan_speed(target = get_shutdown_fan_speed()) -- 如30%或0%
else
    -- 正常处理温度和异常调速逻辑
end

优势:

  • 根本解决竞态问题;
  • 统一由 cooling 模块管理,职责清晰;
  • 可复用于后续类似场景(如待机模式、维护模式)。

推荐方案二:【工程缓解】为 FailedValue 增加电源状态依赖条件

修改 CoolingRequirement 的生效条件,使其仅在电源开启时有效:

{
  "RequirementID": "52",
  "MonitoringStatus": "<=/Scanner_IBTemp.Status",
  "MonitoringValue": "<=/Scanner_IBTemp.Value",
  "FailedValue": 80,
  "TargetTemperatureCelsius": 80,
  "MaxAllowedTemperatureCelsius": 100,
  "EnableCondition": "<=/SystemPower.State |> expr($1 == 'ON')"
}

:light_bulb: 若当前 SR 配置不支持 EnableCondition,建议扩展支持——这对所有外设监控都至关重要。


方案三:补充 thermal_mgmt 监视线程(临时补丁)

如短期内无法修改 cooling 核心逻辑,可采用您的建议作为过渡方案:

# 伪代码
while True:
    sleep(1)
    if get_system_power_state() == "OFF":
        current_speed = get_fan_speed()
        if current_speed > SHUTDOWN_THRESHOLD:  # e.g., >35%
            set_fan_speed(30%)  # 或 0%
            log("Forced fan down after power-off due to potential race condition.")

:warning: 注意事项:

  • 必须确保该线程晚于 cooling 组件完成状态判断
  • 应记录日志用于问题追溯;
  • 仅作为临时方案,长期仍需在 cooling 层面解决。

:hammer_and_wrench: 预防建议:增强系统健壮性

措施 说明
统一上下电时序管理 在 CPLD/FPGA 中协调 PCIe 卡与主板的供电时序,避免传感器过早失效
为外设传感器配置更合理的防抖机制 如采用 contbin_H20L5 等机制,避免瞬时断连误判为永久故障
增加日志跟踪 记录每次异常调速的原因(如Sensor X Status Changed → AbnormalCooling Activated),便于定位
支持 SNMP/BMC API 查询当前主导调速源 帮助运维快速判断为何风扇高速旋转

:white_check_mark: 总结

项目 内容
问题性质 是异常,需修复
根本原因 FailedValue 触发时机早于电源状态判断,且无清除机制
最佳解决路径 cooling 组件中,以 电源状态为最高优先级,主动屏蔽/清除异常调速
临时方案 添加 thermal_mgmt 监视线程强制降速(仅过渡用)
长期建议 所有 CoolingRequirement 增加 EnableCondition,绑定电源状态

:pushpin: 社区建议
建议在 openUBMC 社区中提出此问题,推动以下改进:

  1. CoolingRequirement 中默认支持 EnableCondition 字段;
  2. 定义标准的 “下电风扇行为策略”;
  3. 增加对“传感器异常但系统已下电”场景的日志标识。

这样可防止同类问题在其他项目中重复出现。

如有更多日志或 cooling_device.lua 中的处理逻辑,欢迎进一步提供以深入分析。

相关链接:

  1. 在WEB固件升级界面重启BMC后,风扇一直满转。
  2. 【公示中,下次评议时间7.28】网卡驱动规范v0.1
  3. BMC重启十分钟内下发的转速无法生效
  4. 设置硬盘温度后,风扇不会自动进行调速
  5. CSR硬件监控防抖机制 | 文档中心 | openUBMC