Huawei服务器静音改造

天锦 发表于 女票的新建与保养 分类,标签: 服务器改静音

说在前面:改造服务器散热系统有一定的安全风险,本文仅作为想法分想和参考,风险请自负!

很喜欢华为的RH2288这款服务器,2U的机架高度12盘位,能插24根内存条还能查全尺寸的显卡,不管是做存储NAS还是做虚拟化云计算都能上。噪音也是各家之间控制的比较好的。But,用于家用放卧室放书房的话,还是有改造升级空间的。之前我的一台机器是放在办公室的,噪音不是很明显,这次带回家用之后,感觉噪音还是有点不舒服的,随即动手改造。

服务器噪音的最大来源便是那四个吹震天的暴力风扇(其实是八个,两个并一起做一个单元)拔了再改静音风扇,主板会因为检测不到风扇的转速而报错,改造电路由很麻烦并且带有一定的风险。这里讲一个不用任何硬件改动就能实现降低噪音的办法。使用一个软件(准确来说是脚本)就能实现降噪。

原理是这样的,华为的服务器板载了一个iBMC叫做iMana,这个管理模块提供了一个手动设置风扇转速的功能,你在iMana网页中的  实时监控》部件 中就能看到“控制模式”这个选项,默认是自动的,也就是主板根据温度自动设定风扇的转速,服务器是设计在机柜中使用的,设备密集温度集中,所以风扇的转速要比家用的高出一些才能满足机柜的环境。但是在家用的环境下,气流通畅空间开阔,是有利于设备散热的,我们将风扇的转速强制的给他降下去一些也是可以的。想法是这样的,但是网页上的iMana只能设置手动转速有效时间为300秒,也就是5分钟,过来一会儿它又变回了自动,你还要再点再设置,这怎么能行。

之前用过SNMP协议监控过华为的交换机,在翻iMana的时候也看到了iMana支持SNMP的,去华为支持网站上找到了iMana的SNMP MIB库,找到了CPU温度,风扇模式、风扇转速的这几个项目的OID,大喜,Nice!

不清楚SNMP协议的童鞋可以去找度娘补补课,我就不再将SNMP的东西了。

先看看这条路能不能走的通,找了一个SNMP的工具叫SugarNMSTool,加载了华为iMana的MIB库,按照MIB库中的说明,将fanMode设为“1,300”(1代表手动,300为持续时间)fanLevel设置为20(最低的20,不能再低了),服务立刻就安静了!吼吼吼~

snmp1.png

方向对路也通,来吧我们飙车吧哈哈哈

最简单的,用Python写个脚本看得不得行,Python有很多SNMP的拓展库,要么就是很麻烦要么就是很难,但有一个“snmp”很好,非常简洁,不需要像其他拓展那样需要net-snmp的依赖巴拉巴拉的,只支持SNMPv1的get、getnext和set,但这够咱用了,我只需要get和set,连getnext都用不到!

脚本的思路是定时去获取CPU的温度,如果温度低于一个安全温度,那么就认为服务器当前处于空闲或低负载的状态,那就把风扇设置为较低的转速,求安静,当超过这个安全稳度的时候,也就是系统负载上来了,就把风扇的模式设置为自动,让主板去决定用多快的转速去降温,此时不再求安静,要保证系统的整体健康和安全。这里循环的时间我设置是是10秒,安全温度为70度(SNMP获取到的参数是1/10度,所以要乘以10也就是700),静音转速为30。现在是夏天,农村平房,无空调,平常CPU稳定在60度上下,编译程序等大负载是风扇转速会涨上来以降低温度。

下面是程序(平台Windows、Linux都可,我有Linux的机器带有Python,所以就在Linux上跑了)

先是安装python的snmp扩展

[root@linux ~]# pip3 install snmp

下面是程序

from snmp import Manager
from snmp.exceptions import Timeout
import time
#SNMP Info Config
SNMP_PASSWORD_R=b'your imana snmp read password'
SNMP_PASSWORD_RW=b'your imana snmp write password'
SNMP_PORT=161
hosts = ["your imana ip"]
# OID Config
Inlet_Temperature="1.3.6.1.4.1.2011.2.235.1.1.26.50.1.3.1"
CPU1_Temperature='1.3.6.1.4.1.2011.2.235.1.1.26.50.1.3.2'
CPU2_Temperature="1.3.6.1.4.1.2011.2.235.1.1.26.50.1.3.3"
FanMode="1.3.6.1.4.1.2011.2.235.1.1.8.1.0"
FanSpeed="1.3.6.1.4.1.2011.2.235.1.1.8.2.0"
Overheated_Temperature=700  #the unit is 1/10 Celsius degree.
speed_limited=30    #Must Upper 20 Unit(%)
def print_with_time(strings):
    print ("["+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+"]"+strings)
def limit_speed(manager,host,speed):
    manager.set(host,FanMode,value="1,300", block=False, timeout=1)
    manager.set(host,FanSpeed,value=speed, block=False, timeout=1)
def auto_speed(manager,host):
    manager.set(host,FanMode,value="0", block=False, timeout=1)
def limit_prco():
    #Create SNMP Manager
    manager = Manager(community=SNMP_PASSWORD_RW, rwcommunity=SNMP_PASSWORD_RW, port=SNMP_PORT)
    try:
        temperatures = [Inlet_Temperature,CPU1_Temperature,CPU2_Temperature]
        # removing this loop will increase run time on average
        for host in hosts:
            manager.get(host, *temperatures, block=False, timeout=1)
        for host in hosts:
            vars = manager.get(host, *temperatures)
            superheat=False
            for var in vars:
                temperature=int(str(var.value.value))
                if(temperature > Overheated_Temperature):
                    superheat=True
                    overed_oid=str(var.name)
                    lenth=len(overed_oid)
                    overed_oid=overed_oid[1:lenth-1]
                    if overed_oid==Inlet_Temperature:
                        Location="Inlet_Temperature"
                    elif overed_oid==CPU1_Temperature:
                        Location="CPU1_Temperature"
                    elif overed_oid==CPU2_Temperature:
                        Location="CPU2_Temperature"
                    else:
                        Location="Unknow_Temperature"
                    print_with_time("Host:" + host +" is Overheated!  " + Location +" VALUE:" + str(var.value))
            if(superheat):
                auto_speed(manager,host)
            else:
                limit_speed(manager,host,speed_limited)
    except Timeout as e:
        print("Request for {} from host {} timed out".format(e, host))
    finally:
        manager.close()
def main():
    print ("################################################################")
    print ("     Huawei Servers Noise Terminator created by JinkunTian")
    print ("This is a script limit fan speed using by SNMP(iMana supported)")
    print ("Email:  me@tianjinkun.com")
    print ("Blog:   http://blog.tianjinkun.com")
    print ("GitHub: https://github.com/JinkunTian")
    print ("----------------------------------------------------------------")
    try:
        print_with_time("Started!")
        while(True):
            
            limit_prco()
            time.sleep(10)
    except KeyboardInterrupt:
        print_with_time("Exit!")
if __name__ == '__main__':
    main()

写好的脚本可以用Supervisor把脚本变成守护进程在后台跑着,并且是开机自启动的,Windows自己研究吧也不难。

最后,再重申一遍,改造服务器散热系统有一定的安全风险,本文仅作为想法分想和参考,风险请自负!

另外Emmm原创内容禁止转载!

0 篇评论

发表我的评论