引言
在现代服务器系统中,散热控制是确保硬件稳定运行、延长设备寿命和提高能源效率的关键技术。随着高性能计算组件(如多核CPU、GPU加速卡)的广泛应用,服务器的热设计和散热控制变得越来越复杂和重要。
本文档将详细介绍openUBMC的调速策略适配指导,主要介绍风冷散热系统的调速策略。
散热系统组成
服务器散热系统通常由以下组件构成:
- 热源:产生热量的硬件组件,如CPU、GPU、内存、硬盘、电源等
- 散热介质:传递热量的物质,如空气、液体(水或制冷剂)
- 散热设备:
- 散热片(Heat Sink):增大散热面积
- 风扇(Fan):提供强制 airflow
- 热管(Heat Pipe):快速传递热量
- 液冷系统:循环液体带走热量
- 温度传感器:监测关键组件温度
- 控制单元:根据温度数据调整散热设备运行状态
散热工作原理
散热系统的基本工作原理是通过热传导、对流和辐射三种方式将热量从热源传递到外部环境:
- 热传导:热量通过固体材料(如金属散热片)传递
- 热对流:热量通过流体(空气或液体)流动传递
- 热辐射:热量以电磁波形式直接散发
在服务器系统中,主要依靠热传导和强制对流来实现高效散热。
openUBMC常用风扇调速技术
PWM调速(Pulse Width Modulation)
- 原理:通过改变脉冲宽度调制信号的占空比来控制风扇转速
- 特点:调速范围宽(通常20%-100%),效率高,噪音低
- 接口:通常使用4Pin风扇接口
- 工作电压:保持12V恒定,通过PWM信号(通常25kHz频率)控制转速
一般情况下,风扇转速与PWM占空比呈线性关系:
风扇转速 = 最大转速 × PWM占空比例如:
- 当PWM占空比为50%时,风扇转速约为最大转速的50%,实际上,大多风扇的占空比和转速比存在一定偏差
- 当PWM占空比为100%时,风扇转速达到最大值
散热控制策略
基于阈值的控制策略
这是最常用的散热控制策略,根据温度传感器的读数与预设阈值比较来调整风扇转速:
- 单阈值控制:当温度超过阈值时,风扇逐渐增加转速,直到全速运行;低于阈值时,风扇低速运行,对应目标调速
- 多阈值分段阶梯控制:设置多个温度阈值和对应的风扇转速等级,对应区间调速的台阶式调速,对应代码中“TemperatureRangeLow”和“TemperatureRangeHigh”的区间对应值相同,在调速策略中,该方式较目标调速复杂,但调速精准性提高很多
- 多阈值分段线性控制:设置多个温度阈值和对应的风扇转速等级,对应区间调速的线性调速,对应代码中“TemperatureRangeLow”和“TemperatureRangeHigh”的区间对应值不同,该方式调速较为复杂,很多转速点依赖代码计算,风扇转速较前两种更平滑,不易出现转速忽高忽低的情况
示例:
| 温度范围(℃) | 风扇转速(%) |
|---|---|
| <= 40 | 20 |
| 40-50 | 40 |
| 50-60 | 60 |
| 60-70 | 80 |
| > 70 | 100 |
PID控制策略
openUBMC的调速策略都会给到PID调速库,PID调速库根据各种调速策略计算出生效的PWM占空比,最终输出到风扇控制器,控制风扇转速。
散热控制对象
散热控制对象关系
调速对象主要有:
- CoolingConfig:cooling模块全局配置,包含风扇转速设置范围、BMC启动初始转速等,CoolingConfig必须配置在PSR,不能重复加载
- CoolingArea:主要用于将CoolingRequirement、CoolingPolicy、CoolingFan(风扇对象)对象关联起来,该配置描述了一个温度点调速需要哪几个风扇参与,也描述了温度点关联哪些环温调速曲线,CoolingArea必须配置在PSR,不能重复加载
- CoolingRequirement:一个温度点对应一个CoolingRequirement对象,用于关联硬件温度和配置目标调速策略
- CoolingPolicy:用于承载cooling模块的策略配置,包含策略名称、预期生效条件、实际生效条件、温度区间、转速区间等,CoolingPolicy为线性调速策略对象,一个CoolingPolicy对象代表一条环温曲线,每个温度点可能关联0个或多个CoolingPolicy对象,取计算出的转速最大值下发,删除CoolingPolicy需要在对应CoolingArea的PolicyIdxGroup里面删除对应的PolicyIdx,CoolingArea必须配置在PSR,不能重复加载
- AbnormalFan:异常调速风扇对象,用于描述异常状态下的风扇转速、异常类型、关联的CoolingFan、触发异常后,参与异常转速调速的风扇Id等
- BasicCoolingConfig:配置多个风扇组之间转速差容忍区间、PSU风扇的转速校准等
- FanGroup:风扇组对象,用于描述风扇槽位号列表、风扇组ID等
- FanGroupPolicy:风扇组策略对象,用于描述风扇组之间的转速差容忍区间、异常调速策略等
{
"CoolingConfig_Basic": { // CoolingConfig类通常不配置在板卡的配置文件中,不能重复加载
"SmartCoolingState": "Enabled", // 智能调速是否启用,取值范围"Enabled","Disabled"
"SmartCoolingMode": "EnergySaving", // 智能调速模式,取值范围"EnergySaving","HighPerformance","LowNoise","Custom","LiquidCooling"
"LevelPercentRange": [20, 100], // 手动设置转速级别(百分比)允许的范围,样例中为调速范围为20-100
"InitLevelInStartup": 100, // 启动时默认调速等级,取值范围0-100
"DiskRowTemperatureAvailable": false, // 硬盘温度是否可获取
"SysHDDsMaxTemperature": 80.0, // HDD硬盘最大温度阈值
"SysSSDsMaxTemperature": 80.0, // SSD硬盘最大温度阈值
"SensorLocationSupported": false, // 是否支持温度海洋界面
"FanBoardNum": 1, // 含有调速风扇的风扇板个数(多风扇板机型需要配置,默认值为1)
"MinimalLevel": 20, // 最小转速级别(百分比),取值范围0-100
"MaximalLevel": 100 // 最大转速级别(百分比),取值范围0-100
},
"CoolingPolicy_EnergySaving": { // 线性调速策略需要配置在PSR中,不能重复加载,若配置了PCIeCardName、HDDBackPlaneName、FanType多个条件,需每个条件都满足,该Policy才生效;即环境插入了PCIeCardName中的网卡之一(若配置了PCIeCardName),环境加载了HDDBackPlaneName中的硬盘背板之一(若配置了HDDBackPlaneName),环境的风扇类型包含FanType中的类型之一(若配置了FanType)
"PolicyIdx": 6, // 线性调速策略Id,PolicyIdx必须全局唯一
"ExpCondVal": "EnergySaving", // 预期生效条件,CoolingPolicy生效前提是实际条件与期望条件一致,取值范围"EnergySaving","HighPerformance","LowNoise","Custom","LiquidCooling"
"ActualCondVal": "<=/CoolingConfig_1.SmartCoolingMode", // 实际生效条件,取值范围"EnergySaving","HighPerformance","LowNoise","Custom","LiquidCooling"
"TemperatureRangeLow": [-127, 20, 30, 40, 50], // 线性调速策略温度区间低门限
"TemperatureRangeHigh": [20, 30, 40, 50, 127], // 线性调速策略温度区间高门限,线性调速策略温度区间为左闭右开
"SpeedRangeLow": [20, 32, 70, 100], // 线性调速策略转速区间低门限
"SpeedRangeHigh": [20, 32, 70, 100], // 线性调速策略转速区间高门限
"FanType": ["02314BLG 8038+"], // 风扇类型列表,环境风扇类型为列表之一时,风扇条件生效
"HDDBackPlaneName": ["BC83NHBF"], // 关联的PCIe卡名称该列表中,环境插入了该列表中网卡之一时,网卡条件生效
"PCIeCardName": ["SF200HT"] // 硬盘背板名称列表,环境有该列表中背板之一时,背板条件生效
},
"CoolingRequirement_1_7": {
"RequirementId": 7, // 目标调速策略Id,Id必须全局唯一,当前Id支持有效16位,前8位baseid,后8位槽位号,如服务器可能加载多次同一个sr文件,可用类似配置"${Slot} |> expr((58 << 8) | $1)",不支持配置为同步属性
"TemperatureType": 11, // 目标调速温度点类型,1:Cpu 2:Outlet 3:Disk 4:Memory 5:PCH 6:VRD 7:VDDQ 8:NPUHbm 9:NPUAiCore 10:NPUBoard 11:Inlet 12:SoCBoardOutlet 13:SoCBoardInlet
"MonitoringStatus": "<=/Scanner_Lm75_Inlet.Status", // 温度点传感器状态,0:正常 1:异常
"MonitoringValue": "<=/Scanner_Lm75_Inlet.Value;<=/Scanner_Lm75_Inlet.Value |> expr((($1 + 5) > ($2 - 10)) ? ($1 + 5) : ($2 - 10))", // 参与调速的温度值
"FailedValue": 80, // 温度状态异常后的异常调速转速,不配代表不触发异常调速;如果配置了值,温度点读取失败的时候,异常调速会固定下发这个转速值
"TargetTemperatureCelsius": 50, // 当前调速目标值, PID会基于当前温度点的温度值和目标温度值进行转速计算,该属性为持久化属性,不能配置为同步或引用
"MaxAllowedTemperatureCelsius": 60, // 目标调速满转温度,当前温度点达到该温度则触发满转,该属性为持久化属性,不能配置为同步或引用
"TargetTemperatureRangeCelsius": [ // 自定义温度允许范围,用于自定义目标值时的合法性判断
40,
60
],
"SmartCoolingTargetTemperature": [ // EnergySaving/HighPerformance/LowNoise 三种模式下的目标温度值,可不配置
50,
47,
53
],
"CustomSupported": true, // 是否支持自定义目标温度值,true:支持,false:不支持
"CustomTargetTemperatureCelsius": 50, // 用户自定义温度值,255为无效值
"SensorName": "#/ThresholdSensor_InletTemp.SensorName", // 传感器名称
"ActiveInStandby": false, // 是否在待机状态下生效
"Enabled": "<=/CoolingRequirement_1_6.MonitoringStatus > expr($1 == 0 ? true : false)", // 是否生效,可关联其他CoolingRequirement的状态,支持条件表达式
"CoolingMedium": "Air", // 冷却介质类型,取值范围"Air","Liquid"
"LiquidFailedValue": 0, // 液体冷却介质下,温度状态异常后的异常调速转速,不配代表不触发异常调速;如果配置了值,温度点读取失败的时候,异常调速会固定下发这个转速值
"IsBackupRequirement": false, // 是否为备份策略
"BackupRequirementIdx": 0, // 备份策略Id,IsBackupRequirement为true时必填
"ObtainTempFaildToValid": false // 温度点读取失败时生效该策略
},
"CoolingArea_1_25": { // oolingArea主要用于将CoolingRequirement、CoolingPolicy、CoolingFan(风扇对象)对象关联起来,该配置描述了一个温度点调速需要哪几个风扇参与,也描述了温度点关联哪些环温调速曲线,如果新增了CoolingRequirement,则需要增加对应的CoolingArea对象,若CoolingArea不参与调速,则PolicyIdxGroup和LiquidCoolingDeviceGroup默认配置为空即可,CoolingArea必须配置在PSR,不能重复加载
"AreaId": 25, // 调速域ID,用不同的AreaId来区分不同调速区域
"RequirementIdx": 25, // 目标调速策略ID,用来区分不同目标调速策略
"PolicyIdxGroup": [1,2], // 线性调速策略ID组,用来记录不同线性调速策略
"FanIdxGroup": [ // 调速域风扇组,用来记录参与该区域调速的风扇id,风扇Id必须按数字由小到大顺序配置
1,
2,
3,
4
]
},
"CoolingFan_1": {
"FanId": 1, // 风扇ID,通常配置为风扇的槽位号,当有多个风扇板时,风扇id不能相同
"FrontPresence": "<=/Fan_1.FrontPresence", // 前转子在位状态:1:在位;0:不在位
"FrontStatus": "<=/Fan_1.FrontStatus", // 前转子状态:1:异常;0:正常
"RearPresence": "<=/Fan_1.RearPresence", // 后转子在位状态:1:在位;0:不在位
"RearStatus": "<=/Fan_1.RearStatus", // 后转子状态:1:异常;0:正常
"HardwarePWM": "#/Accessor_Fan1_PWM.Value", // 风扇硬件占空比
"MaxSupportedPWM": 255, // 最大支持转速
"Slot": 1 // 槽位号
},
"BasicCoolingConfig": {
"FanGroupSpeedDiffThresholdPercent": 25, // 两个分区间的转速差容忍区间,即转速差不超过25%
"PsuFanSpeedCalibration": 5 // psu风扇转速校准值,即psu风扇转速按照+5%下发,无psu风扇则不配置改属性
},
"FanGroup_1": {
"Id":1, // 风扇组ID,用于区分不同的风扇组
"FanSlots": [1, 2] // 风扇组包含的风扇槽位号列表
},
"FanGroupPolicy_1": {
"Id": 1, // 风扇组策略ID
"PolicyType": 2, // 策略类型:1:FanGroupIds中各风扇组之间的转速差不超过SpeedPercentDifference; 2:FanGroupIds中各风扇组的转速比RelativeGroupIds的转速高至少SpeedPercentDifference
"FanGroupIds": [1], // 风扇组ID列表
"RelativeGroupIds": [2], // 关联的风扇组ID列表
"SpeedPercentDifference": 20 // 两个组间的转速差容忍区间,即转速差不超过20%
},
"AbnormalFan_1": {
"Id": 1, // 异常调速ID
"FanIdx": 1, // 关联的CoolingFan的索引
"Status": "AbnormalRotation", // AbnormalRotation、NotInPosition,如需要两种则配置2个AbnormalFan对象,每个对应一种类型
"FanGroup": [1, 2, 3, 4], // 异常调速生效的风扇组
"SpeedPercentage": 80 // 异常调速的转速百分比,为0则表示异常时不进行调速
}
}主要调速方式
目标调速
目标调速是指根据用户设置的目标温度,通过调整风扇转速来实现温度控制。目标调速通常用于服务器等需要严格控制温度的场景。
以该需求为例,出风口目标调速,目标温度45,全速阈值60,节能、高性能、低噪模式下目标温度分别为50,47,53。当传感器失效时,所有风扇转速设定80%,配置如下
{
"CoolingRequirement_1_7": {
"RequirementId": 7, // Id必须全局唯一,当前Id支持有效16位,前8位baseid,后8位槽位号,如服务器可能加载多次同一个sr文件,如网卡、PCIE卡、硬盘等,可用类似配置"${Slot} |> expr((58 << 8) | $1)",不支持配置为同步属性
"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]
}
}线性调速
线性调速是指根据温度与目标温度的偏差,通过线性公式计算所需风扇转速。线性调速通常用于需要平滑调整风扇转速的场景。目前opemUBMC主要支持阶梯式线性调速和折线式线性调速。
- 线性调速温度区间为左闭右开
- 阶梯式调速如下面的例子中温度范围[-127, 20) 转速范围为[30, 30]
- 折线式调速以下面的配置为例,温度范围[-127, 20) 转速范围修改为类似[20, 30]即为折线式调速
- CoolingPolicy对象若配置了ExpCondVal 、PCIeCardName、HDDBackPlaneName、HDDRearBackPlaneName、FanType多个条件,需每个条件都满足,该Policy才生效
{
"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, // 迟滞量,温度过高触发风扇满转后,当温度降到MaxAllowedTemperature减Hysteresis以下时,风扇退出满转调速状态
"TemperatureRangeLow": [ // 线性调速策略温度区间左值
-127, 20, 30, 40
],
"TemperatureRangeHigh": [ // 线性调速策略温度区间右值
20, 30, 40, 127
],
"SpeedRangeLow": [ // 线性调速策略转速区间左值
30, 50, 80, 100
],
"SpeedRangeHigh": [ // 线性调速策略转速区间右值
30, 50, 80, 100
],
"FanType": [],
"HDDBackPlaneName": [],
"HDDRearBackPlaneName": [],
"PCIeCardName": []
}
}异常调速
- 当温度获取异常时,会触发异常调速,转速为CoolingRequirement对象配置的FailedValue值,部分调速不建议增加异常调速,如光模块温度
- 风扇状态为AbnormalRotation时,会触发异常调速,转速为AbnormalFan对象配置的SpeedPercentage值
- 风扇状态为NotInPosition时,会触发异常调速,转速为AbnormalFan对象配置的SpeedPercentage值
{
"CoolingRequirement_1_6": {
"RequirementId": 6,
"TemperatureType": 11, // 温度类型为入风口
"MonitoringStatus": "<=/Scanner_Lm75_Inlet.Status",
"MonitoringValue": "<=/Scanner_Lm75_Inlet.Value",
"FailedValue": 80, // 温度状态异常后的异常调速转速为80%
"BackupRequirementIdx": 8, // 该温度点的备用温度点Id为8
"SensorName": "#/ThresholdSensor_InletTemp.SensorName" // 该温度点关联的传感器名称
},
"AbnormalFan_1": {
"Id": 1,
"FanIdx": 1,
"Status": "AbnormalRotation", // AbnormalRotation、NotInPosition
"FanGroup": [1, 2, 3, 4],
"SpeedPercentage": 80 // 异常调速的转速百分比,为0则表示异常时不进行调速
}
}分区调速
多个风扇按区域管理,不同区域调速可以不同,常见的场景如风扇1,2主要负责CPU1的散热,风扇3,4主要负责CPU2的散热。
每个风扇区域的温度点和策略关联,不同区域的温度点和策略可以不同。
不同区域的风扇转速差异不能超过FanGroupSpeedDiffThresholdPercent配置的百分比。
{
"BasicCoolingConfig": {
"FanGroupSpeedDiffThresholdPercent": 20, // 两个分区间的转速差容忍区间,即转速差不超过20%
"PsuFanSpeedCalibration": 5 // psu风扇转速校准值
},
"FanGroup_1": {
"Id":1, // 风扇组ID,用于区分不同的风扇组
"FanSlots": [1, 2] // 风扇组包含的风扇槽位号列表,常见的如4个风扇分2个风扇组,8个风扇分2个风扇组等
},
"FanGroup_2": {
"Id":2,
"FanSlots": [3, 4]
}
}分组调速
分组调速和分区调速类似,但也有些不同,多用于多风扇板场景,不同分组的风扇转速不同。
{
"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]
}
}standby调速
standby调速,配置CoolingRequirement对象的ActiveInStandby属性为true即为支持standby调速。常用于DPU卡等在OS下电后仍需保持正常工作,且无辅助散热的情况下,自身散热片等散热无法满足散热需求的场景,该场景需要服务器支持在下电后仍能保持某些板卡,如DPU卡、发热较大的OCP卡等正常工作。
{
"CoolingRequirement_1_2": {
"RequirementId": 2,
"Description": "xxx",
"MonitoringStatus": "<=/DPUCard_1.Inlet1TemperatureCelsius |> expr(($1 == 32767) ? 1 : 0)",
"MonitoringValue": "<=/DPUCard_1.Inlet1TemperatureCelsius |> expr(($1 == 0 || $1 > 200) ? 40 : ($1 & 255))",
"FailedValue": 80,
"TargetTemperatureCelsius": 55,
"MaxAllowedTemperatureCelsius": 65,
"ActiveInStandby": true, // ActiveInStandby配置为true表示支持standby调速
"SensorName": "#/ThresholdSensor_XX.SensorName"
},
"CoolingArea_1_2": {
"AreaId": 2,
"RequirementIdx": 2,
"PolicyIdxGroup": [],
"FanIdxGroup": [
1,
2,
3,
4
]
}
}调试策略调试
新增调速策略后,如果要验证调速策略的效果,建议把环境中其它调速策略全部禁用,只保留新增的策略,然后再模拟不同的温度验证。
1、目标调速常用调试方法:
查询所有的CoolingRequirement对象:
mdbctl lsobj CoolingRequirement模拟设置所有的CoolingRequirement对象目标温度为0,等同于禁用该调速策略:
mdbctl setprop set CoolingRequirement_xx bmc.kepler.Systems.CoolingRequirement TargetTemperatureCelsius 0测试完毕后,恢复所有的CoolingRequirement对象的目标温度:
mdbctl setprop unset CoolingRequirement_xx bmc.kepler.Systems.CoolingRequirement TargetTemperatureCelsius2、线性调速速常用调试方法:
查询所有的CoolingRequirement对象:
mdbctl lsobj CoolingPolicy模拟设置所有的CoolingPolicy对象生效状态为不生效,禁用该调速策略:
mdbctl setprop set CoolingPolicy_xx bmc.kepler.Systems.CoolingPolicy IsValid 0测试完毕后,恢复所有的CoolingPolicy对象的生效状态:
mdbctl setprop unset CoolingPolicy_xx bmc.kepler.Systems.CoolingPolicy IsValidPS:测试时可自己写脚本一次禁用所有调速策略,测试完毕后再恢复。
常见问题
1、无法确认配置的调速策略是否生效
->按上文介绍的方法禁用所有非待测试的调速策略。
->模拟待测试调速策略的不同的温度。
->查看log,确认待测试策略是否生效。
2、预期的风扇转速和实际的风扇转速存在偏差
说明:BMC控制风扇调速通常是设置占空比给风扇,风扇根据占空比提供散热,实际的风扇转速比和占空比并不相同,有些风扇的占空比和转速之前的关系并不是一个平滑的直线,BMC只能决定风扇的占空比,实际的转速需要查询风扇规格书确认。
3、调速策略不生效
- 检查对应的CoolingRequirement对象RequirementId是否重复
- 检查对应的CoolingRequirement对象配置是否正确,如TargetTemperatureCelsius、MaxAllowedTemperatureCelsius等
- 检查对应的CoolingPolicy对象PolicyIdx是否重复
- 检查对应的CoolingPolicy对象配置是否正确,ActualCondVal和ExpCondVal是否匹配,FanType、HDDBackPlaneName、PCIeCardName是否配置且是否同时匹配
- 检查对应的CoolingPolicy对象TemperatureRangeLow,TemperatureRangeHigh,SpeedRangeLow,SpeedRangeHigh配置属性的数量是否一致,且数据合理