Introduction
In modern server systems, cooling control is a critical technology for ensuring stable hardware operation, extending device lifespan, and improving energy efficiency. With the widespread use of high-performance computing components such as multi-core CPUs and GPUs, server thermal design and cooling control have become increasingly complex and important.
This document describes how to adapt the cooling policy of for openUBMC, primarily focusing on air-cooled systems.
Cooling System Composition
A server cooling system typically consists of the following components:
- Heat sources: hardware components that generate heat, such as CPUs, GPUs, memory, drives, and PSUs.
- Cooling media: substances that transfer heat, such as air or liquids (water or refrigerants).
- Cooling devices:
- Heat sinks: increase the surface area for heat dissipation.
- Fans: provide forced airflow.
- Heat pipes: transfer heat rapidly.
- Liquid cooling systems: circulate liquid to carry away heat.
- Temperature sensors: monitor the temperatures of critical components.
- Control units: adjust the operating status of cooling devices based on temperature data.
Cooling Principles
The cooling system transfers heat from heat sources to the external environment through conduction, convection, and radiation.
- Conduction: heat transfers through solid materials, such as metal heat sinks
- Convection: heat transfers through the movement of fluids (air or liquid)
- Radiation: heat dissipates directly in the form of electromagnetic waves
Server systems primarily rely on conduction and forced convection to achieve efficient cooling.
Fan Speed Control Technology in openUBMC
PWM Control
- Principle: The fan speed is controlled by changing the duty cycle of pulse width modulation (PWM) signals.
- Features: wide speed range (20% to 100%), high efficiency, and low noise
- Interface: 4-pin fan interface
- Operating voltage: Constant at 12 V, with speed controlled by PWM signals (usually 25 kHz)
Generally, the fan speed is in a linear relationship with the PWM duty cycle:
Fan speed = Maximum speed × PWM duty cycleExamples:
- At a 50% PWM duty cycle, the fan speed is approximately 50% of the maximum speed. In practice, most fans show some deviation between the duty cycle and the speed.
- At a 100% PWM duty cycle, the fan speed reaches the maximum value.
Cooling Control Policies
Threshold-Based Control Policy
This is the most common policy. It adjusts fan speed by comparing temperature sensor readings with preset thresholds:
- Single-threshold control: When the temperature exceeds the threshold, the fan speed increases gradually until it reaches full speed. Below the threshold, the fan runs at low speed (target cooling).
- Multi-threshold stepped control: Multiple temperature thresholds and corresponding fan speed levels are set, resulting in step-like speed changes. In the code, the values for
SpeedRangeLowandSpeedRangeHighin a segment are identical. This method is more complex than target cooling but improves speed precision significantly. - Multi-threshold linear control: Multiple temperature thresholds and corresponding fan speed levels are set, resulting in linear speed changes. In the code, the values for
SpeedRangeLowandSpeedRangeHighin a segment are different. This method is more complex than the previous two methods because many speed points depend on code calculation, but it produces smoother fan speed transitions and prevents sudden fluctuations.
Example:
| Temperature Range (°C) | Fan Speed (%) |
|---|---|
| <= 40 | 20 |
| 40-50 | 40 |
| 50-60 | 60 |
| 60-70 | 80 |
| > 70 | 100 |
PID Control Policy
All cooling policies in openUBMC are sent to a PID control library. This library calculates the effective PWM duty cycle based on various policies and outputs it to the fan controller to regulate fan speed.
Cooling Control Objects
Relationships Between Cooling Control Objects
The primary cooling objects include:
CoolingConfig: global configuration for thecoolingmodule, including fan speed ranges and the initial BMC startup speed.CoolingConfigmust be configured in the PSR and cannot be loaded repeatedly.CoolingArea: associatesCoolingRequirement,CoolingPolicy, andCoolingFanobjects. This configuration describes which fans participate in the cooling of a temperature point and which ambient cooling curves are associated with that point.CoolingAreamust be configured in the PSR and cannot be loaded repeatedly.CoolingRequirement: temperature point corresponds to aCoolingRequirementobject, which is used to associate the hardware temperature with target cooling policy configuration.CoolingPolicy: carries the global configurations of thecoolingmodule, including the policy name, expected condition, actual condition, temperature intervals, and speed intervals.CoolingPolicyis a linear cooling policy object. ACoolingPolicyobject represents an ambient temperature curve. Each temperature point may be associated with zero or moreCoolingPolicyobjects. The maximum calculated speed is issued. To deleteCoolingPolicy, remove the correspondingPolicyIdxfromPolicyIdxGroupof the associatedCoolingArea.CoolingPolicymust be configured in the PSR and cannot be loaded repeatedly.AbnormalFan: abnormal cooling fan object, which describes the fan speed under abnormal conditions, abnormal status, associatedCoolingFan, and IDs of the fans that participate in abnormal cooling after abnormal cooling is triggered.BasicCoolingConfig: configures tolerance intervals for speed differences between fan groups and calibrates PSU fan speeds.FanGroup: fan group object, which describes the fan slot number lists and fan group IDs.FanGroupPolicy: fan group policy object, which describes tolerance intervals of fan speed differences and abnormal cooling policies.
{
"CoolingConfig_Basic": { // CoolingConfig is typically not configured in the board configuration file and cannot be loaded repeatedly.
"SmartCoolingState": "Enabled", // Whether smart cooling is enabled. The value can be Enabled or Disabled.
"SmartCoolingMode": "EnergySaving", // Smart cooling mode. The value can be EnergySaving, HighPerformance, LowNoise, Custom, or LiquidCooling.
"LevelPercentRange": [20, 100], // Allowed range for manual speed level settings (percentage), which is 20 to 100 in the example
"InitLevelInStartup": 100, // Default speed level at startup. The value range is 0 to 100.
"DiskRowTemperatureAvailable": false, // Whether the drive temperature is available
"SysHDDsMaxTemperature": 80.0, // Max temperature threshold for HDDs
"SysSSDsMaxTemperature": 80.0, // Max temperature threshold for SSDs
"SensorLocationSupported": false, // Whether the temperature ocean interface is supported
"FanBoardNum": 1, // Number of fan boards with fan speed adjustment. (This property needs to be configured for a multi-fan board model. The default value is 1.)
"MinimalLevel": 20, // Minimum fan speed level (percentage). The value range is 0 to 100.
"MaximalLevel": 100 // Maximum fan speed level (percentage). The value range is 0 to 100.
},
"CoolingPolicy_EnergySaving": { // The linear cooling policy must be configured in the PSR and cannot be loaded repeatedly. If PCIeCardName, HDDBackPlaneName, and FanType are configured, the policy takes effect only when every condition is met. That is, one of the NICs in PCIeCardName (if configured) is inserted, one of the drive backplanes in HDDBackPlaneName (if configured) is loaded, and the fan types of the environment contains one of the types in FanType (if configured).
"PolicyIdx": 6, // ID for the linear cooling policy, which must be globally unique
"ExpCondVal": "EnergySaving", // Expected condition. CoolingPolicy takes effect only when the actual condition matches the expected condition. The value can be EnergySaving, HighPerformance, LowNoise, Custom, or LiquidCooling.
"ActualCondVal": "<=/CoolingConfig_1.SmartCoolingMode", // Actual condition. The value can be EnergySaving, HighPerformance, LowNoise, Custom, or LiquidCooling.
"TemperatureRangeLow": [-127, 20, 30, 40, 50], // Lower thresholds for temperature intervals in the linear cooling policy
"TemperatureRangeHigh": [20, 30, 40, 50, 127], // Upper thresholds for temperature intervals in the linear cooling policy. The temperature range of the linear cooling policy is closed on the left and open on the right.
"SpeedRangeLow": [20, 32, 70, 100], // Lower thresholds for speed intervals in the linear cooling policy
"SpeedRangeHigh": [20, 32, 70, 100], // Upper thresholds for speed intervals in the linear cooling policy
"FanType": ["02314BLG 8038+"], // List of fan types. The fan condition is met if any fan type in this list exists.
"HDDBackPlaneName": ["BC83NHBF"], // List of associated PCIe card names. The PCIe condition is met if any card in this list is inserted.
"PCIeCardName": ["SF200HT"] // List of drive backplane names. The backplane condition is met if any backplane is loaded.
},
"CoolingRequirement_1_7": {
"RequirementId": 7, // Target cooling policy ID. The ID must be globally unique. Currently, the ID supports 16 valid bits, where the first 8 bits are the base ID and the last 8 bits are the slot ID. If the server loads the same SR file multiple times, use a configuration like "${Slot} |> expr((58 << 8) | $1)". This field cannot be configured to synchronize with properties of other components.
"TemperatureType": 11, // Type of the target cooling temperature point. The value can be 1 for Cpu, 2 for Outlet, 3 for Disk, 4 for Memory, 5 for PCH, 6 for VRD, 7 for VDDQ, 8 for NPUHbm, 9 for NPUAiCore, 10 for NPUBoard, 11 for Inlet, 12 for SoCBoardOutlet, or 13 for SoCBoardInlet,.
"MonitoringStatus": "<=/Scanner_Lm75_Inlet.Status", // Temperature sensor status: 0 for normal and 1 for abnormal
"MonitoringValue": "<=/Scanner_Lm75_Inlet.Value;<=/Scanner_Lm75_Inlet.Value |> expr((($1 + 5) > ($2 - 10)) ? ($1 + 5) : ($2 - 10))", // Temperature value involved in cooling
"FailedValue": 80, // Fan speed when the temperature status is abnormal. If this field is not set, abnormal cooling is not triggered. If it is set, the set fan speed is issued during abnormal cooling when the temperature point fails to be read.
"TargetTemperatureCelsius": 50, // Current target value. PID calculates the speed based on this and the actual temperature. This property is persistent and cannot be configured to synchronize with or reference properties of other components.
"MaxAllowedTemperatureCelsius": 60, // Temperature that triggers full fan speed. This property is persistent and cannot be configured to synchronize with or reference properties of other components.
"TargetTemperatureRangeCelsius": [ // Allowed range for the custom target temperature, which is used for validity check of custom target values
40,
60
],
"SmartCoolingTargetTemperature": [ // Target temperature values for EnergySaving, HighPerformance, and LowNoise modes. This field is optional.
50,
47,
53
],
"CustomSupported": true, // Whether custom target values are supported. The value can be true or false.
"CustomTargetTemperatureCelsius": 50, // Custom temperature. The value 255 is invalid.
"SensorName": "#/ThresholdSensor_InletTemp.SensorName" // Sensor name
"ActiveInStandby": false, // Whether the requirement applies during standby
"Enabled": "<=/CoolingRequirement_1_6.MonitoringStatus > expr($1 == 0 ? true : false)", // Whether the requirement is active. This property can be configured to associate with other CoolingRequirement statuses and use expressions.
"CoolingMedium": "Air", // Cooling medium. The value can be Air or Liquid.
"LiquidFailedValue": 0, // Fan speed for liquid media when the temperature status is abnormal. If this field is not set, abnormal cooling is not triggered. If it is set, the set fan speed is issued during abnormal cooling when the temperature point fails to be read.
"IsBackupRequirement": false, // Whether this is a backup policy
"BackupRequirementIdx": 0, // Backup policy ID. This property is mandatory when IsBackupRequirement is set to true.
"ObtainTempFaildToValid": false // Applies the policy if the temperature point fails to be read.
},
"CoolingArea_1_25": { // CoolingArea is used to associate CoolingRequirement, CoolingPolicy, and CoolingFan objects. This configuration describes which fans participate in the cooling of a temperature point and which ambient cooling curves are associated with that point. If a new CoolingRequirement is added, a corresponding CoolingArea object must also be added. If CoolingArea does not participate in cooling,PolicyIdxGroup and LiquidCoolingDeviceGroup can be left empty by default. CoolingArea must be configured in the PSR and cannot be loaded repeatedly.
"AreaId": 25, // ID for the cooling area
"RequirementIdx": 25, // Target cooling policy ID
"PolicyIdxGroup": [1,2], // Group of linear cooling policy IDs
"FanIdxGroup": [ // IDs of the fans participating in cooling of the area. The IDs must be in ascending order.
1,
2,
3,
4
]
},
"CoolingFan_1": {
"FanId": 1, // Fan ID, which is usually the slot number. The ID must be unique across multiple fan boards.
"FrontPresence": "<=/Fan_1.FrontPresence", // Front rotor presence: 1 for present and 0 for absent
"FrontStatus": "<=/Fan_1.FrontStatus", // Front rotor status: 1 for abnormal and 0 for normal
"RearPresence": "<=/Fan_1.RearPresence", // Rear rotor presence: 1 for present and 0 for absent
"RearStatus": "<=/Fan_1.RearStatus", // Rear rotor status: 1 for abnormal and 0 for normal
"HardwarePWM": "#/Accessor_Fan1_PWM.Value", // Fan hardware duty cycle
"MaxSupportedPWM": 255, // Maximum supported speed
"Slot": 1 // Slot number
},
"BasicCoolingConfig": {
"FanGroupSpeedDiffThresholdPercent": 25, // Tolerance interval for speed differences between areas. That is, the speed difference cannot exceed 25%.
"PsuFanSpeedCalibration": 5 // PSU fan speed calibration, that is, the PSU fan speed is issued 5% higher. Omit this property if there is no PSU fan.
},
"FanGroup_1": {
"Id": 1, // Fan group ID
"FanSlots": [1, 2] // List of fan slot numbers in the group
},
"FanGroupPolicy_1": {
"Id": 1, // Fan group policy ID
"PolicyType": 2, // Policy type: 1 (speed difference between groups in FanGroupIds is no larger than SpeedPercentDifference) or 2 (speed ratio of groups in FanGroupIds is at least SpeedPercentDifference higher than RelativeGroupIds).
"FanGroupIds": [1], // List of fan group IDs
"RelativeGroupIds": [2], // List of associated fan group IDs
"SpeedPercentDifference": 20 // Tolerance interval for speed differences between groups. That is, the speed difference cannot exceed 20%.
},
"AbnormalFan_1": {
"Id": 1, // Abnormal cooling ID
"FanIdx": 1, // Index of the associated CoolingFan
"Status": "AbnormalRotation", // The value can be AbnormalRotation or NotInPosition. Create two objects if both are needed.
"FanGroup": [1, 2, 3, 4], // Fan groups where abnormal cooling applies
"SpeedPercentage": 80 // Speed percentage for abnormal cooling. 0 means that no speed adjustment occurs during an anomaly.
}
}Primary Cooling Methods
Target Cooling
Target cooling controls temperature by adjusting fan speed based on a target temperature set by the user. This method is common in scenarios like servers that require strict temperature control.
For example, to set the following requirements: outlet target cooling with a target temperature of 45°C, a full speed threshold of 60°C, and specific targets for EnergySaving (50°C), HighPerformance (47°C), and LowNoise (53°C) modes, and an 80% fan speed for all fans if the sensor fails, the configuration is as follows:
{
"CoolingRequirement_1_7": {
"RequirementId": 7, // The ID must be globally unique. Currently, the ID supports 16 valid bits, where the first 8 bits are the base ID and the last 8 bits are the slot ID. If the server loads the same SR file multiple times (for example, for NICs, PCIe cards, and drives), use a configuration like "${Slot} |> expr((58 << 8) | $1)". This field cannot be configured to synchronize with properties of other components.
"TemperatureType": 2, // The target cooling temperature type is the outlet.
"MonitoringStatus": "<=/Scanner_Lm75_Outlet.Status", // Synchronizes the status from Scanner_Lm75_Outlet.
"MonitoringValue": "<=/Scanner_Lm75_Outlet.Value", // Synchronizes the value from Scanner_Lm75_Outlet.
"FailedValue": 80, // The fan speed becomes 80% when the temperature status is abnormal.
"TargetTemperatureCelsius": 45, // The target temperature is 45°C.
"MaxAllowedTemperatureCelsius": 60, // Full speed is triggered when the temperature is greater than or equal to 60°C.
"SmartCoolingTargetTemperature": [50, 47, 53], // Target temperatures for EnergySaving, HighPerformance, and LowNoise modes are 50, 47, and 53 respectively.
"SensorName": "#/ThresholdSensor_OutletTemp.SensorName"
},
"CoolingArea_1_7": {
"AreaId": 7,
"RequirementIdx": 7,
"PolicyIdxGroup": [],
"FanIdxGroup": [1, 2, 3, 4]
}
}Linear Cooling
Linear cooling calculates the required fan speed using a linear formula based on the deviation between the actual and target temperatures. This method is used when smooth fan speed adjustments are needed. openUBMC currently supports stepped linear cooling and piecewise linear cooling.
- The temperature range of the linear cooling is closed on the left and open on the right.
- In the following example, in the [-127, 20) temperature range, the speed range is [30, 30], indicating stepped cooling.
- In the following cooling example, if the speed range in the [-127, 20) temperature range is changed to [20, 30], piecewise cooling is used.
- If a
CoolingPolicyobject is configured with multiple conditions such asExpCondVal,PCIeCardName,HDDBackPlaneName,HDDRearBackPlaneName, andFanType, the policy takes effect only when all conditions are met.
{
"CoolingRequirement_1_6": {
"RequirementId": 6,
"TemperatureType": 11, // The temperature type is the outlet.
"MonitoringStatus": "<=/Scanner_Lm75_Inlet.Status",
"MonitoringValue": "<=/Scanner_Lm75_Inlet.Value",
"FailedValue": 80,
"BackupRequirementIdx": 8, // The backup temperature ID is 8.
"SensorName": "#/ThresholdSensor_InletTemp.SensorName" // Name of the sensor associated with the temperature point
},
"CoolingRequirement_1_8": { // Backup temperature point
"RequirementId": 8,
"MonitoringStatus": "<=/Scanner_FanBrdTemp.Status",
"MonitoringValue": "<=/Scanner_FanBrdTemp.Value",
"IsBackupRequirement": true,
"SensorName": "#/ThresholdSensor_FanBoardTemp.SensorName"
},
"CoolingArea_1_6": {
"AreaId": 6,
"RequirementIdx": 6, // The ID of the temperature point (CoolingRequirement) associated with the cooling area is 6.
"PolicyIdxGroup": [6, 7], // The IDs of the cooling policies associated with the cooling area are 6 and 7.
"FanIdxGroup": [1, 2, 3, 4]
},
"CoolingPolicy_1_6": {
"PolicyIdx": 6,
"ExpCondVal": "EnergySaving", // The expected condition for the cooling policy to take effect is the energy saving mode.
"ActualCondVal": "<=/CoolingConfig_1.SmartCoolingMode", // Actual mode
"Hysteresis": 1, // Hysteresis. After full speed is triggered, the fans exit the full speed state only when the temperature falls below MaxAllowedTemperature minus Hysteresis.
"TemperatureRangeLow": [ // Left values of the temperature intervals for the linear cooling policy
-127, 20, 30, 40
],
"TemperatureRangeHigh": [ // Right values of the temperature intervals for the linear cooling policy
20, 30, 40, 127
],
"SpeedRangeLow": [ // Left values of the speed intervals for the linear cooling policy
30, 50, 80, 100
],
"SpeedRangeHigh": [ // Right values of the speed intervals for the linear cooling policy
30, 50, 80, 100
],
"FanType": [],
"HDDBackPlaneName": [],
"HDDRearBackPlaneName": [],
"PCIeCardName": []
}
}Abnormal Cooling
- When the temperature fails to be obtained, abnormal cooling is triggered. The speed is the value of
FailedValueconfigured for theCoolingRequirementobject. Abnormal cooling is not recommended for some cooling policies, for example, the temperature of an optical module. - If a fan enters the
AbnormalRotationstate, abnormal cooling triggers using theSpeedPercentagefrom theAbnormalFanobject. - If a fan enters the
NotInPositionstate, abnormal cooling triggers using theSpeedPercentagefrom theAbnormalFanobject.
{
"CoolingRequirement_1_6": {
"RequirementId": 6,
"TemperatureType": 11, // The temperature type is the outlet.
"MonitoringStatus": "<=/Scanner_Lm75_Inlet.Status",
"MonitoringValue": "<=/Scanner_Lm75_Inlet.Value",
"FailedValue": 80, // The fan speed becomes 80% when the temperature status is abnormal.
"BackupRequirementIdx": 8, // The backup temperature ID is 8.
"SensorName": "#/ThresholdSensor_InletTemp.SensorName" // Name of the sensor associated with the temperature point.
},
"AbnormalFan_1": {
"Id": 1,
"FanIdx": 1,
"Status": "AbnormalRotation", // The value can be AbnormalRotation or NotInPosition.
"FanGroup": [1, 2, 3, 4],
"SpeedPercentage": 80 // Speed percentage for abnormal cooling. 0 means that no speed adjustment occurs during an anomaly.
}
}Area-based Cooling
Fans are managed by area, allowing different speeds in different areas. For example, fans 1 and 2 might cool CPU 1, while fans 3 and 4 cool CPU 2.
Temperature points and policies associate with each fan area. Intervals and policies can vary between areas.
The speed difference between fans in different areas must not exceed the percentage defined by FanGroupSpeedDiffThresholdPercent.
{
"BasicCoolingConfig": {
"FanGroupSpeedDiffThresholdPercent": 20, // Tolerance interval for speed differences between areas. That is, the speed difference cannot exceed 20%.
"PsuFanSpeedCalibration": 5 // PSU fan speed calibration value
},
"FanGroup_1": {
"Id": 1, // Fan group ID
"FanSlots": [1, 2] // List of fan slots in the group. For example, four fans are divided into two groups, and eight fans are divided into two groups.
},
"FanGroup_2": {
"Id":2,
"FanSlots": [3, 4]
}
}Grouped Cooling
Grouped cooling is similar to area-based cooling but is typically used for multi-fan board scenarios, allowing different speeds for different groups.
{
"FanGroupPolicy_1": {
"Id": 1,
"PolicyType": 2, // Policy type: 1 (speed difference between groups in FanGroupIds is no larger than SpeedPercentDifference) or 2 (speed ratio of groups in FanGroupIds is at least SpeedPercentDifference higher than RelativeGroupIds).
"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 Cooling
Standby cooling can be enabled by setting the ActiveInStandby property of the CoolingRequirement object to true. This is common for components like DPUs that must operate after OS shutdown and cannot meet their cooling needs through heat sinks alone without auxiliary airflow. This scenario requires the server to keep certain cards, such as DPUs or high-power OCP cards, powered after shutdown.
{
"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,// Set true to support standby cooling.
"SensorName": "#/ThresholdSensor_XX.SensorName"
},
"CoolingArea_1_2": {
"AreaId": 2,
"RequirementIdx": 2,
"PolicyIdxGroup": [],
"FanIdxGroup": [
1,
2,
3,
4
]
}
}Policy Debugging
To verify the effectiveness of a newly added cooling policy, disable other policies in the environment and simulate various temperatures.
Debugging target cooling:
Query allCoolingRequirementobjects:txtmdbctl lsobj CoolingRequirementSet the target temperature of all
CoolingRequirementobjects to 0 to effectively disable the policies:txtmdbctl setprop set CoolingRequirement_xx bmc.kepler.Systems.CoolingRequirement TargetTemperatureCelsius 0Restore the original target temperatures after testing:
txtmdbctl setprop unset CoolingRequirement_xx bmc.kepler.Systems.CoolingRequirement TargetTemperatureCelsiusDebugging linear cooling:
Query allCoolingRequirementobjects:txtmdbctl lsobj CoolingPolicyMake all
CoolingPolicyobjects ineffective to disable the cooling policies:txtmdbctl setprop set CoolingPolicy_xx bmc.kepler.Systems.CoolingPolicy IsValid 0Restore the effective status after testing:
txtmdbctl setprop unset CoolingPolicy_xx bmc.kepler.Systems.CoolingPolicy IsValidNote: You can write scripts to disable and restore all policies at once for testing.
Common Issues
Unable to verify whether the policy applies
->Disable all policies except the one to be tested.
->Simulate different temperatures for the policy to be tested.
->Check the logs to confirm that the policy applies.Deviation between expected and actual fan speeds
Description: The BMC controls fan speed by setting a duty cycle, but actual fan speeds often differ from duty cycles because many fans show non-linear relationships between duty cycles and speeds. The BMC only determines the duty cycle. Verify actual speeds by consulting the fan specifications.Cooling policy not applied
- Check for duplicate
RequirementIdvalues inCoolingRequirementobjects. - Verify configurations in
CoolingRequirementobjects, such asTargetTemperatureCelsiusandMaxAllowedTemperatureCelsius. - Check for duplicate
PolicyIdxvalues inCoolingPolicyobjects. - Verify configurations in
CoolingPolicyobjects. Ensure thatActualCondValandExpCondValmatch. IfFanType,HDDBackPlaneName, orPCIeCardNameare configured, verify that they all match simultaneously. - Ensure that the number of properties for
TemperatureRangeLow,TemperatureRangeHigh,SpeedRangeLow, andSpeedRangeHighis consistent and the data is proper.
- Check for duplicate