调速策略配置分享与调试技巧

调速策略配置与调试技巧

一、调速对象关系

一、调速对象关系


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(调速使能状态)使用

4 个赞

你好请问关于第十一点的RequirementId冲突自适应是要怎么去解决他。

这是开源代码中已经支持的能力。就是在调速对象分发时候不会立马上树,这时对已发分的CoolingRequirement对象与当前对象进行主键判断,如果发现冲突会打印一个日志和分配新的Slot以解决冲突。5.5增量版本没有做

您好还有个疑惑想请教一下。

CoolingRequirement中的属性RequirementId作为主键必须全局唯一,当前id支持有效16位,前8位baseid,后8位槽位号,那请问如果多个CoolingRequirement对象(它们的前8位baseid相同,后8位槽位号不同的)他们对应的CoolingArea对象是唯一的吗,如果是唯一的,那根据槽位号对CoolingRequirement对象进行是否使能,使得有些Enabled属性 是true ,有些Enabled属性是false。是否会导致CoolingArea对象对应的CoolingPolicy对象生效又不生效(比如先加载的是Enabled 是true的CoolingRequirement对象,然后CoolingPolicy对象生效,后立马又加载了Enabled 是false的CoolingRequirement对象使得CoolingPolicy对象又不生效了)

会出现你说的现象,代码调速策略扫描路径是 CoolingRequirement->CoolingArea->CoolingPolicy
调速策略的要求是一个线性调速策略仅对应一个温度点,一个温度点可以有多个线性调速策略。你这个配置就不满足要求了