mirror of
https://github.com/lkddi/dell-fans-controller-docker.git
synced 2026-05-18 13:47:27 +08:00
降低IPMI会话失败时的控制器压力
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user