代码仓
中
调速问题
更新时间: 2026/10/17
在AtomGit上查看源码

问题1:怎么看是否在调速 ​

查看app.log日志:basic cooling initializing表示启动服务初始化,basic cooling initialized表示服务初始化完成,basic cooling starting服务启动中,basic cooling started服务启动完成 [cooling] send device config to pid, cmd: 42 0 0 2 40 0 1 1 1 0 0 20 2 2 2 0 0 20 3 3 3 0 0 20 4 4 4 0 0 20 129 1 129 0 0 20 130 2 130 0 0 20 表示当前发给pid算法参与调速的器件有,风扇1 2 3 4,泵1,2(128+泵id) Send target tempconfig to pid, cmd 下发目标调速曲线(writeinfo 01),cmd格式: 164 0 0 1 162 0 7 7 60 50 0 4 1 1 2 2 3 3 4 4 20 20 103 90 0 2 3 3 4 4 ... 头部6字节:lenLow lenHigh reversed cmd reservedCmdLenLow reservedCmdLenHigh,其中cmd=1表示目标温度配置。之后每个生效的Requirement占一段: baseId slot MaxAllowedTemperatureCelsius TargetTemperatureCelsius 0(迟滞量) deviceCount [deviceId deviceSlot]... 例如7 7 60 50 0 4 1 1 2 2 3 3 4 4表示Requirement(baseId=7, slot=7),高温告警门限60°C,目标温度50°C,迟滞量0,关联4个风扇(id,slot分别为1 1、2 2、3 3、4 4)

[cooling] send envtemp config to pid 下发环温调速曲线(writeinfo 07),cmd格式: 128 0 0 7 126 0 0 1 6 6 4 1 1 2 2 3 3 4 4 27 -127 20 30 30 20 21 30 30 ... 头部6字节同上,cmd=7表示环温调速配置。之后每个生效的Policy占一段: 0(reserved) Hysteresis baseId slot deviceCount [deviceId deviceSlot]... pointCount [TempRangeLow TempRangeHigh SpeedRangeLow SpeedRangeHigh]... 例如0 1 6 6 4 1 1 2 2 3 3 4 4 27 -127 20 30 30 ...表示reserved=0,迟滞量=1,Requirement(baseId=6, slot=6),关联4个风扇,27个温度转速曲线点,第一个点为温度范围[-127°C, 20°C]对应转速[30%, 30%],最后一个点为[45°C, 127°C]对应转速[100%, 100%](127为温度上界哨兵值)

[cooling] send pid strategy pid, cmd 下发各温度点的PID策略参数(writeinfo 22),cmd格式: 98 0 0 22 96 0 15 0 6 6 2 1 10 10 7 7 2 1 10 10 ... 头部6字节同上,cmd=22表示PID策略配置。之后2字节为生效Requirement数量(如15 0表示15个),每个Requirement占6字节: baseId slot strategy IAdjustTime Kp*10 Ki*10 其中strategy:1=Fast 2=Medium 3=Slow;Kp/Ki乘以10传输(接收端除以10还原1位小数)。例如6 6 2 1 10 10表示Requirement(baseId=6, slot=6),策略Medium,积分调节时间1,Kp=1.0,Ki=1.0

问题2:当前是哪个器件的调速占主导 ​

日志分析: 环境上/var/log/cooling_control.log可以查看当前pid计算出的正常温度转速中目标调速和环温调速中最高的是哪条 或者一键收集日志:dump_info\LogDump\cooling_control.log DevID:0x101, Type:0, ReqId:7, Strategy:1, kp:2.0, ki:0.1, T:37, TarT:45, TarPWM:52, EnvTNum:1, EnvReqId:6, EnvT:29, EnvPWM:94, PIDPWM:94, MaxAllowTemp:60, TarSensorName:Outlet Temp, EnvSensorName:Inlet Temp, FrontSpeed:0, RearSpeed:11264

  • DevID:0x101 表示风扇为id为0x01, Slot为0x01
  • Type:0 0表示器件为风扇 1表示器件为泵
  • Strategy:1 表示目标调速策略类型,1:Fast 2:Medium 3:Slow
  • kp:2.0, ki:0.1 表示当前温度点的PID比例系数和积分系数
  • TarPWM 表示Requirement为7的温度点,MonitoringTempValue为37,目标温度值计算出来的占空比为52(占空比最大值当前都为255,所以转速比为52/255*100%)
  • EnvTNum:1, 表示当前曲线调速有1条在参与转速计算
  • EnvT:29, 表示当前生效的曲线调速的温度29
  • EnvPWM:94 表示当前环温曲线调速计算的占空比
  • PIDPWM:94 是综合目标调速和环温调速的最大值,也是期望值

注:可查询当前转速最高的调速温度点,指向的是CoolingRequirement的SensorName属性 mdbctl call AirCoolingConfig_1 bmc.kepler.Systems.FanSnapshot GetActivatedPolicyFactors "获取已激活的风扇转速最高的调速策略因子 ValidFlag用于表示内部是否有获取到风扇信息,若为false则无下述信息,否则 若不存在异常调速,则ActivatedType=0,PWM=xxx,FactorName=调速因子名称,否则ActivatedType=1,PWM=xx,FactorName=调速因子名称,例如返回CPU1 Core Rem对应"

问题3:有哪些调速 ​

  • 目标温度值调速。可查看cooling_control.log
  • 环温曲线调速。可查看cooling_control.log
  • 温度点温度异常调速。查看app.log日志,例: Add exception speed, key:(AbnormalRequirement:0x1e), policy(4:80 3:80 ) 调速策略中CoolingRequirement对象,RequirementId为0x1e的,MonitoringStatus为非0,即异常,触发了异常调速,风扇3和4添加了一个异常转速80%。此时环境上应当有温度相关告警(告警配置错误或者异常调速这儿配置错误会导致有异常调速无告警或者无异常调速有告警)
  • 风扇状态异常调速(不在位、转子转速偏差超过SpeedDeviationThresholdPercent(默认25%)异常、停转) Add exception speed, key:(AbnormalFan:...) 此时环境应当有风扇严重告警 Delete exception speed 删除一条异常调速
  • MPC调速,查看/redfish/v1/Chassis/1/Thermal 下ModelPredictiveControlEnabled为true表示开启了MPC调速
  • 每个转速的下发会取所有转速中的最大值下发
  • 复杂机型最终转速下发可能会有转速修正,例如某机型,所有风扇板的转速差不超过20%,转速低的板上的风扇转速会被拉高(防止转速回流)

问题4:多风扇板场景 ​

以某机型为例子,有4块风扇板参与调速,所以验证调速需要4块风扇板在位调速功能才正常 日志分析:

  • 风扇分发:CoolingFan object id identify result: 3 2 4 1 5 8 31 35 33 2 34 37 36 7 8 6 10 9 13 12 14 11 15 当前收到的风扇id,某机型预期为1-15,31-38,共23个风扇
  • 风扇板个数:Receive cooling board %s cooling obj complete, cur num: %s, cooling board num: %s,期望风扇板个数和当前收到的预期都为4
  • 强制启动调速:Fan object timeout detection starting, expect fan board num: %s, cur fan board num: %s 当超时仍未收到预期的风扇板个数,或者①中风扇id存在一致的,不符合预期。会强制启动basic cooling主线程服务,以注册所有功能(包括定制化与配置导入导出,ipmi注册,创建调速主线程)

问题5:风扇告警 ​

日志分析: scan_fan_status: Scan fan31 rear speed error, real 51%(11776), expect 100% +- 25%; expected_pwm 255 表示31号风扇后转子实际转子转速51%;最大转速规格为11776/0.51=23000;expect 100是期望转速属性ExpectedPWM占MaxSupportedPWM的百分比(ExpectedPWM/MaxSupportedPWM100%);expected_pwm 255表示实际占空比属性HardwarePWM为255;风扇转速不在[230000.75,23000*1.25]内产生告警(需连续超过5次超阈值且自愈未生效才置告警位) fan%s %s error_hardpwm = [%s] 转子转速告警时采集到的HardwarePWM值 fan%s %s error_speed = [%s] 转子转速告警时采集到的转子转速值,对应资源树的RearSpeed或者FrontSpeed乘以Coefficient系数后的值

问题6:风扇类型识别 ​

风扇类型识别逻辑:FanType_A,FanType_B,Fan_1都配置在一块风扇板上,风扇类型识别只会判断配置在一块板上的FanType。识别开始时下发给IdentifySpeedLevel(示例值为35%)的转速比,此时HardwarePWM = MaxSupportedPWM*IdentifySpeedLevel/100(四舍五入取整),然后采集5次转速,舍去最大值和最小值,取剩余3次的转速计算平均值,看平均值是落在哪个FanType的IdentifyRangeLow和IdentifyRangeHigh之间,筛选后候选型号唯一则风扇类型识别成功

问题7:出厂定制化verify校验失败 ​

  • 所有定制化项都失败 定制化服务未注册,查看日志,看注册的日志是否打印
  • 自定义CPU核温和出风口定制化项失败 查看是否配置了对应的CoolingArea,如果缺失,代码中认为该定制化项是共板场景(不支持温度点自定义),导出时该项字段缺失(TargetTemperatureCelsius为0),导入时SetTargetTemperature因CoolingArea不存在而失败,校验不通过

问题8:全风扇满转 ​

当前调速逻辑:BMC刚起来阶段所有风扇下发初始转速(定制值或默认100%)->PID接管调速 可能以下场景:

  • 无调速策略生效,但是风扇板有电
  • 调速组件异常,pid无法接管调速,风扇保持启动阶段下发的初始转速(定制值或默认100%)
  • 器件高温导致的满转 -> 先看环境是否有高温告警,再查看cooling_control.log文件的调速信息
  • 器件温度获取异常导致满转,看环境是否有告警,再看app.log日志中是否有添加异常调速的日志,见问题3异常调速部分

异常调速流程图 ​