Dell服务器调整风扇转速降低噪音

起因

最近购入一台Dell r720服务器,放在家里做试验机,之前考虑了很久,调研了网上的一些说法,主要顾虑有两点,噪音和能耗,能耗这个没办法,干多少活用多少电,噪音这个就要好好考虑下吧,

方案

收到机器,安装好系统,开始研究如何降低机器噪音在家里正常使用,查看网上类似的需求,主要攻克的方向有两个。

硬件方案

查询资料后发现,服务器风扇为PWM风扇,本身支持一定的调节能力,但是服务器本身正常应该放在机房的恒温环境,所以本身设定就是忽略噪音,尽可能的提高风扇转速,降低问题。

网上提供的思路是购买独立的PWM控制器,然后将连接风扇的控制线,单独控制风扇,这样就可以按照自己思路去调节风扇转速了

软件方案

还有另外一种方案就是,软件控制风扇转速,虽然dell的idrac控制卡里面不支持调节风扇转速,但是通过ipmi可以调节风扇转速,需要的是一个叫做ipmitool的小工具,我也是半信半疑,决定测试一下软件方案,不行的话就上硬件改造方案

实施

查询ipmitool调节风扇的用法,主要参考这几个帖子

简单来说就是ipmi有能力将风扇速度切换为手动管理,任意调节风速,主要用法就是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看服务器温度
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> sensor |grep Temp
# 开启手动风扇控制
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> raw 0x30 0x30 0x01 0x00
# 管理手动风扇控制
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> raw 0x30 0x30 0x01 0x01
# 设置风扇转速0%
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> raw 0x30 0x30 0x02 0xff 0x00
# 设置风扇转速20%
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> raw 0x30 0x30 0x02 0xff 0x14
# 设置风扇转速30%
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> raw 0x30 0x30 0x02 0xff 0x1e
# 设置风扇转速100%
ipmitool -I lanplus -H <iDRAC-IP> -U <iDRAC-USER> -P <iDRAC-PASSWORD> raw 0x30 0x30 0x02 0xff 0x64

这里要说明的是 ,这个用法是通过远程调用来控制,所以需要提供idrac的地址,账号,密码,在我的场景里,我希望这个脚本运行在服务器本身,如果服务器本身已经加载了ipmi的内核模块,那么也就不需要加参数直接运行ipmitool raw ...就可以了

设置风扇转速的命令的最后一个参数就是你需要控制的风扇百分比的16进制值,具体每个服务器多少转速声音多大,最好自己执行命令自己听一听,体验一下,这里我的服务器20%声音就挺低的,并且这个时候服务器的温度基本稳定,没有剧烈上升,稳定在40度以下,当然这个值跟我测试的时候气温有关系,这个阈值需要反复测试确定

风扇控制本身是一个挺麻烦的事情,如果完全自己控制,那么需要不停地测试温度,根据温度去调节风扇转速,脚本逻辑太复杂了,我的思路是设置一个临界值温度,低于这个就手动控制风扇,高于这个,就恢复服务器自己控制风扇逻辑,这样脚本思路就简单了不少。另外也不用担心因为管理失误导致服务器过热

最后我的脚本如下,非常简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh

DATE=$(date "+%Y-%m-%d %H:%M:%S")
echo "$DATE"

T=$(/opt/ipmitool/ipmitool sensor |grep ^Temp | awk -F "|" '{sum+=$2} END {print sum/NR}')
echo "--> current: $T ${T%.*}"

if [ ${T%.*} -gt 40 ]
then
echo "--> enable dynamic fan control"
/opt/ipmitool/ipmitool raw 0x30 0x30 0x01 0x01
else
echo "--> disable dynamic fan control"
/opt/ipmitool/ipmitool raw 0x30 0x30 0x01 0x00
echo "--> set static fan speed 20%"
/opt/ipmitool/ipmitool raw 0x30 0x30 0x02 0xff 0x14
fi

问题

服务器系统为ESXI没有ipmitool

这个问题也是在我实践的时候发现的,我自己服务器宿主系统为esxi,主要为了做虚拟化,我可不想把这个脚本放在一个虚拟机里面,连接idrac去运行,查了下有没有esxi能用的ipmitool,答案是有的,可以直接下载ipmitool源码,交叉编译一个静态二进制,拷贝上去使用,还有国外的老哥直接一步到位做好了esxi的软件包,直接可以安装,这里我就是直接安装的vib格式的包

下载地址 ipmitool-esxi-vib-1.8.11-2.zip

可以用过webui安装也可以使用ssh登录到主机安装

1
2
3
esxcli software acceptance set --level=CommunitySupported
esxcli software vib install -v /tmp/ipmitool-1.8.11-2.x86_64.vib
/opt/ipmitool/ipmitool sensor

ESXI重启以后定时任务失效

esxi本身是一个精简的linux系统,虽然提供了简单的cron,但是我发现重启以后,定时任务恢复默认设置,这个就比较麻烦了,我不可能每次重启,然后重新去设置定时任务

调研后,发现esxi有类似rc.local一样的脚本,在每次开机的时候回去执行,我把写入定时任务的逻辑放在这个脚本中,完美解决重启后,风扇控制脚本失效问题,文件在/etc/rc.local.d/local.sh,在exit之前添加你的逻辑

1
2
3
kill $(cat /var/run/crond.pid)
echo "* * * * * /vmfs/volumes/datastore1/tools/fan_speed.sh >> /tmp/fan_speed.log" >> /var/spool/cron/crontabs/root
/bin/crond

然后重启,观察tmp下的日志,是否每分钟都有数据更新,完美解决

结局

最后我的服务器风扇完美控制,离开1米以外,基本没有什么噪音,通过软件方式完美解决,0成本,我把服务器放在其他房间的一个角落里,实测在家里各个角落都听不到声音。

白天在服务器所在房间,窗外的声音都比服务器声音大。

晚上夜深人静的时候,服务器房间里会有一点点的声音,离开房间以后完全没有。

服务器温度基本控制在35-40,风扇自动控制基本没有开过,剩下就是等夏天看看实际情况了,看看是否需要调整阈值

总的来说,我对这个结果非常满意,完全可以在家使用,完全不影响生活,唯一的缺点就是24小时开机确实有点费电,但是想想多学点东西,涨点工资把电费赚回来,最近在家搭建好了kubernetes,在环境搭建以及网络架构上有一些心得,有时间也好好写写。