降低IPMI会话失败时的控制器压力

This commit is contained in:
2026-05-06 09:05:53 +08:00
parent 51a93a0f76
commit ee7d1bdb8e
3 changed files with 18 additions and 19 deletions
+4 -9
View File
@@ -36,7 +36,8 @@ class FanController:
return -1 # 表示应切换到自动模式 return -1 # 表示应切换到自动模式
def run(self): def run(self):
temperature: int = max(self.ipmi.temperature()) sensor_data = self.ipmi.sensor()
temperature: int = max(self.ipmi.temperature(sensor_data))
logger.info(f'当前最高温度: {temperature}') logger.info(f'当前最高温度: {temperature}')
required_speed = self.get_required_fan_speed(temperature) required_speed = self.get_required_fan_speed(temperature)
@@ -59,18 +60,12 @@ class FanController:
self.is_auto_mode = False self.is_auto_mode = False
# 获取当前风扇转速 # 获取当前风扇转速
current_speed = self.ipmi.get_fan_duty_cycle() current_speed = self.ipmi.get_fan_duty_cycle(sensor_data)
# 只有在当前转速与所需转速不同时才调整 # 只有在当前转速与所需转速不同时才调整
# 如果无法获取当前转速(返回-1),则检查是否已记录之前设置的速度 # 如果无法获取当前转速(返回-1),则检查是否已记录之前设置的速度
if current_speed == -1: if current_speed == -1:
# 如果无法获取当前转速,但上次设置的速度与所需速度不同,则更新 logger.warning('无法获取当前风扇转速,为避免IPMI会话不稳定时盲目写入,本轮跳过设置')
if self.last_set_speed != required_speed:
logger.info(f'无法获取当前风扇转速,但上次设置({self.last_set_speed}%)与需要({required_speed}%)不同,进行设置')
self.set_fan_speed(required_speed)
self.last_set_speed = required_speed
else:
logger.info(f'无法获取当前风扇转速,且未改变设置,无需操作')
elif current_speed != required_speed: elif current_speed != required_speed:
logger.info(f'当前风扇转速: {current_speed}%, 需要转速: {required_speed}%') logger.info(f'当前风扇转速: {current_speed}%, 需要转速: {required_speed}%')
self.set_fan_speed(required_speed) self.set_fan_speed(required_speed)
+7 -5
View File
@@ -61,12 +61,14 @@ class IpmiTool:
""" """
return self.run_cmd(cmd='sdr') return self.run_cmd(cmd='sdr')
def temperature(self) -> list: def temperature(self, data: str = None) -> list:
""" """
get current temperature 获取当前温度传感器列表
:return: :return:
""" """
if data is None:
data = self.sensor() data = self.sensor()
temperatures = [] temperatures = []
import re import re
@@ -108,9 +110,9 @@ class IpmiTool:
continue continue
return fan_speeds return fan_speeds
def get_fan_duty_cycle(self) -> int: def get_fan_duty_cycle(self, sensor_data: str = None) -> int:
""" """
get current fan duty cycle/percentage 获取当前风扇占空比/百分比
:return: current fan duty cycle in percentage :return: current fan duty cycle in percentage
""" """
try: try:
@@ -134,7 +136,7 @@ class IpmiTool:
# If raw command fails or returns 0, get fan speeds from sensor data and convert to approximate percentage # If raw command fails or returns 0, get fan speeds from sensor data and convert to approximate percentage
try: try:
data = self.sensor() data = sensor_data if sensor_data is not None else self.sensor()
fan_rpm_values = [] fan_rpm_values = []
import re import re
+3 -1
View File
@@ -19,12 +19,14 @@ if __name__ == '__main__':
if not password: if not password:
raise RuntimeError('未设置 PASSWORD 环境变量') raise RuntimeError('未设置 PASSWORD 环境变量')
client = FanController(host=host, username=username, password=password)
while True: while True:
try: try:
client = FanController(host=host, username=username, password=password)
client.run() client.run()
time.sleep(60) time.sleep(60)
except Exception as err: except Exception as err:
logger.error( logger.error(
f'运行控制器失败 {err}. {traceback.format_exc()}' f'运行控制器失败 {err}. {traceback.format_exc()}'
) )
time.sleep(60)