降低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 # 表示应切换到自动模式
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}')
required_speed = self.get_required_fan_speed(temperature)
@@ -59,18 +60,12 @@ class FanController:
self.is_auto_mode = False
# 获取当前风扇转速
current_speed = self.ipmi.get_fan_duty_cycle()
current_speed = self.ipmi.get_fan_duty_cycle(sensor_data)
# 只有在当前转速与所需转速不同时才调整
# 如果无法获取当前转速(返回-1),则检查是否已记录之前设置的速度
if current_speed == -1:
# 如果无法获取当前转速,但上次设置的速度与所需速度不同,则更新
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'无法获取当前风扇转速,且未改变设置,无需操作')
logger.warning('无法获取当前风扇转速,为避免IPMI会话不稳定时盲目写入,本轮跳过设置')
elif current_speed != required_speed:
logger.info(f'当前风扇转速: {current_speed}%, 需要转速: {required_speed}%')
self.set_fan_speed(required_speed)
+8 -6
View File
@@ -61,12 +61,14 @@ class IpmiTool:
"""
return self.run_cmd(cmd='sdr')
def temperature(self) -> list:
def temperature(self, data: str = None) -> list:
"""
get current temperature
获取当前温度传感器列表
:return:
"""
data = self.sensor()
if data is None:
data = self.sensor()
temperatures = []
import re
@@ -108,9 +110,9 @@ class IpmiTool:
continue
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
"""
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
try:
data = self.sensor()
data = sensor_data if sensor_data is not None else self.sensor()
fan_rpm_values = []
import re
+3 -1
View File
@@ -19,12 +19,14 @@ if __name__ == '__main__':
if not password:
raise RuntimeError('未设置 PASSWORD 环境变量')
client = FanController(host=host, username=username, password=password)
while True:
try:
client = FanController(host=host, username=username, password=password)
client.run()
time.sleep(60)
except Exception as err:
logger.error(
f'运行控制器失败 {err}. {traceback.format_exc()}'
)
time.sleep(60)