说在前面:改造服务器散热系统有一定的安全风险,本文仅作为想法分想和参考,风险请自负!
很喜欢华为的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,不能再低了),服务立刻就安静了!吼吼吼~
方向对路也通,来吧我们飙车吧哈哈哈
最简单的,用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原创内容禁止转载!
-
« 上一篇:
Linux 误删文件找回
-
Vivado的加速之路:Slurm Cluster!
:下一篇 »