调速策略配置与调试技巧
一、调速对象关系
一、调速对象关系
CoolingRequirement:一个温度点对应一个CoolingRequirement对象,用于关联硬件温度和目标调速配置
CoolingPolicy:每个对象代表一条线性调速曲线
CoolingArea:用于将CoolingRequirement、CoolingPolicy、CoolingFan对象关联起来,该配置描述了,这个温度点需要哪些风扇 参与调速和关联了哪些线性调速曲线
二、目标调速
场景:出风口目标调速,目标温度45,全速阈值60,节能、高性能、低噪模式下目标温度分别为50, 47, 53。当传感器失效时,所有风扇转速设定80%
"CoolingRequirement_1_7": {
"RequirementId": 7,
"TemperatureType": 2,//目标调速温度类型为出风口
"MonitoringStatus": "<=/Scanner_Lm75_Outlet.Status",//同步Scanner_Lm75_Outlet的状态
"MonitoringValue":"<=/Scanner_Lm75_Outlet.Value",//同步Scanner_Lm75_Outlet的值
"FailedValue": 80,//温度状态异常后的异常调速转速为80%
"TargetTemperatureCelsius": 45,//目标温度为45摄氏度
"MaxAllowedTemperatureCelsius": 60,//温度大于等于60摄氏度时触发满转
"SmartCoolingTargetTemperature": [50, 47, 53], //节能、高性能、低噪三种模式下的目标值温度分别为50、47、53
"SensorName": "#/ThresholdSensor_OutletTemp.SensorName"
},
"CoolingArea_1_7": {
"AreaId": 7,
"RequirementIdx": 7,
"PolicyIdxGroup": [],
"FanIdxGroup": [1, 2, 3, 4]
}
三、网卡带光模块目标调速
场景:xx网卡正常目标温度为90,全速阈值为102,当网卡光模块温度获取异常时xx网卡目标温度调整为80,且网卡支持standby调速
"CoolingRequirement_1_50": {
"RequirementId": "${Slot} |> expr((50 << 8) | $1)",
"Description": "xx网卡芯片调速",
"MonitoringStatus": "xx",
"MonitoringValue": "xx",
"FailedValue": 80,
"TargetTemperatureCelsius": 90,
"MaxAllowedTemperatureCelsius": 102,
"ActiveInStandby": true,
"Enabled": "<=/CoolingRequirement_1_52.MonitoringStatus |> expr($1 == 0 ? true : false)"
},
"CoolingRequirement_1_51": {
"RequirementId": "${Slot} |> expr((51 << 8) | $1)",
"Description": "xx网卡芯片调速 (光模块异常)",
"MonitoringStatus": "xx",
"MonitoringValue": "<=/NetworkAdapter_1.TemperatureCelsius",
"FailedValue": 80,
"TargetTemperatureCelsius": 80,
"MaxAllowedTemperatureCelsius": 102,
"ActiveInStandby": true,
"Enabled": "<=/CoolingRequirement_1_52.MonitoringStatus |> expr($1 ~= 0 ? true : false)"
},
"CoolingRequirement_1_52": {
"RequirementId": "${Slot} |> expr((52 << 8) | $1)",
"Description": "xx网卡光模块温度调速",
"MonitoringStatus": "xx",
"MonitoringValue": "xx",
"FailedValue": 80,
"TargetTemperatureCelsius": 55,
"MaxAllowedTemperatureCelsius": 75,
"SmartCoolingTargetTemperature": [60, 55, 65],
"ActiveInStandby": true
}
四、线性调速
四、线性调速
| Temp | T<20 | 20<=T<30 | 30<=T<40 | T>=40 | 传感器失效异常调速 |
|---|---|---|---|---|---|
| Speed | 30 | 50 | 80 | 100 | 入风口传感器失效时,使用FanBrdTemp调速,若也失效,则所有风扇转速设定80% |
| 注:温度区间为左闭右开,下面的例子中温度范围[-127, 20) 转速范围为[20, 20] |
"CoolingRequirement_1_6": {
"RequirementId": 6,
"TemperatureType": 11,//温度类型为入风口
"MonitoringStatus": "<=/Scanner_Lm75_Inlet.Status",
"MonitoringValue": "<=/Scanner_Lm75_Inlet.Value",
"FailedValue": 80,
"BackupRequirementIdx": 8,//该温度点的备用温度点Id为8
"SensorName": "#/ThresholdSensor_InletTemp.SensorName"//该温度点关联的传感器名称
},
"CoolingRequirement_1_8": {//备用温度点
"RequirementId": 8,
"MonitoringStatus": "<=/Scanner_FanBrdTemp.Status",
"MonitoringValue": "<=/Scanner_FanBrdTemp.Value",
"IsBackupRequirement": true,
"SensorName": "#/ThresholdSensor_FanBoardTemp.SensorName"
},
"CoolingArea_1_6": {
"AreaId": 6,
"RequirementIdx": 6,//该调速区域关联的温度点(CoolingRequirement)Id为6
"PolicyIdxGroup": [6, 7],//该调速区域关联的调速策略(CoolingPolicy)Id为6、7
"FanIdxGroup": [1, 2, 3, 4]
]
},
"CoolingPolicy_1_6": {
"PolicyIdx": 6,
"ExpCondVal": "EnergySaving",//调速策略预期生效的条件为节能模式
"ActualCondVal": "<=/CoolingConfig_1.SmartCoolingMode",//实际的模式
"Hysteresis": 1,//迟滞量
"TemperatureRangeLow": [//线性调速策略温度区间左值
-127, 20, 30, 40
],
"TemperatureRangeHigh": [//线性调速策略温度区间右值
20, 30, 40, 127
],
"SpeedRangeLow": [//线性调速策略转速区间左值
30, 50, 80, 100
],
"SpeedRangeHigh": [//线性调速策略转速区间右值
30, 50, 80, 100
],
"FanType": [...],
"HDDBackPlaneName": [...],
"HDDRearBackPlaneName": [...],
"PCIeCardName": [...]
}
注:若配置了ExpCondVal 、PCIeCardName、HDDBackPlaneName、HDDRearBackPlaneName、FanType多个条件,需每个条件都满足,该Policy才生效
五、分区调速1
场景:风扇1 2和风扇3 4分别为两个分区,两个分区间的转速差不超过20%,psu风扇转速按照+5%下发
"BasicCoolingConfig": {
"FanGroupSpeedDiffThresholdPercent": 20,
"PsuFanSpeedCalibration": 5 //psu风扇转速校准值
}
"FanGroup_1": {
"Id":1,
"FanSlots": [1, 2]
},
"FanGroup_2": {
"Id":2,
"FanSlots": [3, 4]
}
六、分区调速2
场景:风扇123 4和风扇4567分别为两个分区,两个分区间的转速差不超过20%,psu风扇转速按照+5%下发
注:无psu风扇转速下发需要则不用配置PsuFanSpeedCalibration
"BasicCoolingConfig": {
"FanGroupSpeedDiffThresholdPercent": 20,
"PsuFanSpeedCalibration": 5
}
"FanGroup_1": {
"Id":1,
"FanSlots": [1, 2, 3, 4]
},
"FanGroup_2": {
"Id":2,
"FanSlots": [4, 5, 6, 7]
}
七、分组调速
场景:多风扇板环境,如双风扇板,要求风扇板2的5678风扇转速比风扇板1的1234转速高至少20%
"FanGroupPolicy_1": {
"Id": 1,
"PolicyType": 2, // 策略类型:1:FanGroupIds中各风扇组之间的转速差不超过SpeedPercentDifference; 2:FanGroupIds中各风扇组的转速比RelativeGroupIds的转速高至少SpeedPercentDifference
"FanGroupIds": [1],
"RelativeGroupIds": [2],
"SpeedPercentDifference": 20
}
"FanGroup_1": {
"Id":1,
"FanSlots": [1, 2, 3, 4]
},
"FanGroup_2": {
"Id":2,
"FanSlots": [5, 6, 7, 8]
}
注::PolicyType为1代码暂未移植
八、拓展多风扇板调速
场景:在单风扇板4风扇的基础上拓展Pro机型,需要新增一块风扇板
需要新增以下配置, 还有对所有CoolingArea中FanIdxGroup和AbnormalFan的FanGroup做风扇拓展,新增拓展风扇的AbnormalFan对象
需要新增以下配置:
"CoolingConfig_1":{
...
"FanBoardNum": 2
},
"Fan_5": {},
"Fan_6": {},
"Fan_7": {},
"Fan_8": {},
"CoolingFan_1_5": {},
"CoolingFan_1_6": {},
"CoolingFan_1_7": {},
"CoolingFan_1_8": {},
"Chip_Fan_PWM":{
},
"Fans_1": {
"PWMChip": "#/Chip_Fan_PWM",
"SetPWMCmd": xx //风扇板smc的转速批量下发接口地址,若不配置则走单个风扇转速下发
}
九、风扇器件异常调速
场景:当风扇不在位或者风扇转速异常时所有风扇转速设定80%
"AbnormalFan_1": {
"Id": 1,
"FanIdx": 1,
"Status": "AbnormalRotation", //AbnormalRotation、NotInPosition
"FanGroup": [1, 2, 3, 4],
"SpeedPercentage": 80
}
十、关于如何选取RequirementId
场景:新增器件调速策略
RequirementId为id + slot组成一个unsigned int 16数字
查找所有PSR中的CoolingArea的属性AreaId,未被使用的1~255皆可以被用于id,往大的数字去寻找,且新器件遵循独立配置原则,不要与已有器件配置成相同的baseid
十一、RequirementId冲突自适应
设计:在CoolingRequirement对象中,使用的RequirementId作为主键,RequirementId由一个器件id + slot组成,会通过传入PID算法计算转速
场景1:多个Riser的相同槽位插入相同卡等场景,如果slot维护存在bug,出现传递相同slot,例如直接使用Riser上的Slot,而不是Riser的Slot和Riser上的槽叠加计算
场景2:RequirementId 同步了其他组件的对象属性,当其他组件对象未上树,此时拿到的引用属性会是默认值0,造成冲突
自适应解决:当CoolingRequirement对象分发时thermal_mgmt组件识别到冲突,会将冲突的slot从255往下寻找未被占用的slot于id重组为新的RequirementId
注:这个会打印一条error日志,建议是版本测试用例中增加该日志的用例,作为必须解决的问题
十二、注意事项
1.CoolingRequirement中的属性RequirementId作为主键必须全局唯一,当前id支持有效16位,前8位baseid,后8位槽位号
2.CoolingArea对象关联的风扇Id列表FanIdxGroup中,风扇Id必须整体按数字由小到大顺序配置
例如[3, 2, 1, 4],预期1 2和 3 4为最小分组,实际2 3风扇转速一致,1 4风扇转速一致
3.CoolingRequirement对象的TargetTemperatureCelsius和MaxallowedTemperatureCelsius为持久化属性,不能配置为同步或引用
会导致不能使用接口设置目标温度值和全速阈值
4.RequirementId 不能关联同级的其他组件属性
调速组件仅支持接收首次对象分发时的RequirementId值,对象分发时其他组件对象还未上树,散热组件会接收到不符合预期RequirementId
5.ActiveInStandby含义为是否支持standby调速,默认值为false,若配置为true则意思是OS上电需要调速,OS下电也会调速
6.Enabled属性表达式配置为a ? false : true 会落入Lua三目运算符陷阱中,使得表达式永远返回为true
7.要求是所有的CoolingArea和CoolingPolicy配置在PSR,作为整机的调速配置。如果CoolingArea配置在器件上,这个对象里面的FanIdxGroup只配置了4风扇,而这个器件可以用于4风扇机型和8风扇机型,那么在8风扇机型上就会有调速问题
8. CoolingRequirement对象的名字可以配置为CoolingRequirement_sensorname_{RequirementId的BaseId} 这样就可以结合cooling_control.log中的ReqId和mdb.log 看当前是什么器件主导调速
十三、调试目标与环温调速配置
场景:新增调速策略后的调试
1、目标调速:
mdbctl lsobj CoolingRequirement
模拟设置所有的CoolingRequirement对象目标温度为0:mdbctl setprop set CoolingRequirement_xx bmc.kepler.Systems.CoolingRequirement TargetTemperatureCelsius 0
再恢复你新增的对象:mdbctl setprop unset CoolingRequirement_xx bmc.kepler.Systems.CoolingRequirement TargetTemperatureCelsius
再模拟对应温度
2、线性调速
mdbctl lsobj CoolingPolicy
模拟设置所有的CoolingPolicy对象生效状态为不生效:mdbctl setprop set CoolingPolicy_xx bmc.kepler.Systems.CoolingPolicy IsValid 0
再恢复你新增的对象:mdbctl setprop unset CoolingPolicy_xx bmc.kepler.Systems.CoolingPolicy IsValid
再模拟对应温度
十四、关于调速策略中一些软件属性的解释
Hysteresis:线性调速迟滞量,20度,21度分别对应转速A,B。温度上升时,20度则使用转速A,从21 降低到20度时候,则使用转速B
ActiveInStandby:是否支持standy调速(DC下电,即下后电),默认值false,表示仅支持上电调速,配置为true则表示上电与下电都需要调速
MonitoringStatus与MonitoringValue:在调速组件中这个status属性只有0和1的状态,0表示温度状态正常,搭配Value进行调速,Status为1表示温度异常,使用FailedValue调速。
对于硬件,不在位和器件下电不需要调速,在位且温度获取异常需要异常调速,考虑场景时候可以搭配Enabled(调速使能状态)使用
