0x01 前言

近期我将我原有的设备打包出售,将获得的资金购置了Dell T620。它和R720一样是Dell的第12代服务器,所以和R720一样有噪音问题。

其实T620送到之后我发现所有固件都很旧,都停留在13年中的版本,我将所有拓展卡插到服务器里并没有产生很大的噪音,此时服务器是根据温度传感器控制散热风扇的。

后来我升级所有固件的版本到最新,散热风扇的转速基本维持在80%以上,当系统负载为15%到25%时的转速为90%左右;当系统负载高于25%,则维持在100%的转速。

虽然我的T620里没有选购的散热风扇组,但导风板后部有两个大功率的散热风扇,当转速在50%以上时可以很明显地感受到噪音,当处于70%的转速则达到难以忍受的状态。

我已经以前的服务器机柜撤走,将T620放置在门口处的鞋柜上。经过测试,当散热风扇的转速在40%以下,在客厅内是听不到任何声音的。所以我决定通过IPMI手动调整散热风扇的转速,以达到静音的目的。

0x02 转速问题

大约从14年开始,未经Dell认证的硬件将会导致服务器的散热风扇转速过高,这是因为Dell无法正常识别这些硬件的功耗,为了确保系统得到有效的散热,它不得不提高散热风扇的转速。

而在我的T620里,安装了外置的H710阵列卡,经过查询后发现,这个型号的阵列卡也会导致T620的散热风扇高速运转:

我想另一个原因是标配的T620没有前散热风扇组,当插入拓展卡时因为无法散热,后部的两个风扇才会提高转速:

以下是前置风扇组的样子,这属于T620的选配件:

以下是我写这片文章时的温度,系统负载在7%左右:

以下是当时的散热风扇转速:

0x03 IPMI

在idrac的设置界面中是找不到散热风扇转速相关的设置的,但在新一代的idrac 8中可以手动设置散热风扇的转速,所以在这里只能通过IPMI这个渠道进行设置。

在这里要借助IPMI这个功能进行调整,首先,在默认情况下,散热风扇的转速是由系统进行控制的,为了能手动调整转速,需要切换为手动模式:

ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x01 0x00

在这里需要使用ipmitool这个工具,以下是各个参数的基本含义:

  • -I:使用的Interface
  • -H:IPMI服务器地址,idrac的IP地址
  • -U:用户名,idrac的用户名
  • -P:密码,idrac的密码

参数后面跟着IPMI命令,首先需要向idrac发送raw格式的数据,最后一个16进制的值为开启与关闭散热风扇自动控制功能的开关,0为关,1为开。

而后发送以下命令即可调整散热风扇的转速:

ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x02 0xff 0x1e

最后一个16进制的值为散热风扇的转速百分比,0x1e表示30%,请根据实际情况进行修改。

注意!在某些环境与情况下固定散热风扇在低转速会导致散热问题,这将导致系统系统自动关闭或损坏硬件!

0x04 脚本

为提高可靠性,防止系统负载异常使温度升高,我需要一个简单的脚本。经过将近一周的观察,当负载在50%以下,CPU温度基本保持在60摄氏度以下;当负载在25%以下,CPU温度基本保持在50设置度左右。

另外我发现CPU温度高于90设置度才会告警,高于95摄氏度则会导致停机。为此,在高于65摄氏度使启用散热风扇的自动调整模式,低于65摄氏度则启用手动模式,将散热风扇的转速限制在30%。

以下是一个简单的shell脚本:

#!/bin/sh
ipmi_host=""
ipmi_user=""
ipmi_passwd=""
temp_threshold="65"

get_value=`ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd sensor reading "Temp" | cut -d "|" -f 2 | cut -d " " -f 2`

if [[ $get_value > $temp_threshold ]]
  then
    ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x01 0x01
  else
    ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x01 0x00
    ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x02 0xff 0x1e
fi

首先需要获取最新的CPU温度值,通过向IPMI发送sensor reading命令:

[root@web ~]# ipmitool -I lanplus -H 0.0.0.0 -U username -P passwd sensor reading "Temp"
Temp             | 47

经过简单的字符串处理后留下温度值,然后与变量temp_threshold相比较,最后实现上面所讲的逻辑。

该脚本可以在我的私有gitlab中找到,如果有更新,将不会在本文中说明:

最后还需要将脚本放置在系统的cronjob中执行,建议每1分钟或2分钟执行一次,如果环境温度比较稳定,也可以设置为5分钟一次。

0x05 结语

经过调整后,在1米远的位置基本听不到声音,我将T620放置在鞋柜上,坐在大厅里完全察觉不到服务器的存在。

如果有在家放置服务器的需求,完全可以考虑Dell的塔式服务器。

0x06 更新

0x06.1 2018.10.07

经过几天的观察,并未发现使用上的问题。但在今天我对内部系统做定期的漏洞扫描时却发现散热风扇转速的控制无法达到我的设想,因为T620温度传感器的数值不稳定,同时IPMI无法分别检测两个CPU的温度,当单一CPU温度较高但未超过限值,散热风扇不会提高转速;如果单一CPU的温度超过限值,但IPMI返还的值在限值以下,散热风扇也不会提高转速;只有在IPMI返还的值超过限值时才会触发相应的动作。

IPMI检测的值的波动非常大,两次取值的差值可达到5摄氏度之多,这导致散热风扇在高转速与低转速之间切换,令人十分烦恼。

为此,我将取值方式调整为SNMP并分别取得两个CPU的温度值,计算均值:

get_cpu1_temp=`snmpwalk -v $snmp_ver -c $snmp_com $snmp_host SNMPv2-SMI::enterprises.674.10892.5.4.700.20.1.6.1.2 | cut -d " " -f 4`
get_cpu2_temp=`snmpwalk -v $snmp_ver -c $snmp_com $snmp_host SNMPv2-SMI::enterprises.674.10892.5.4.700.20.1.6.1.3 | cut -d " " -f 4`

calc_avg_temp=`expr \( $get_cpu1_temp + $get_cpu2_temp \) \/ 2`

后与限值比较,若超过则触发相应动作:

if [[ $calc_avg_temp > $temp_threshold ]]
then
  ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x01 0x01
else
  ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x01 0x00
  ipmitool -I lanplus -H $ipmi_host -U $ipmi_user -P $ipmi_passwd raw 0x30 0x30 0x02 0xff 0x1e
fi

在此之前需要定义IPMI与SNMP的相关信息:

ipmi_host=""
ipmi_user=""
ipmi_passwd=""

snmp_host=""
snmp_ver="2c"
snmp_com="public"

temp_threshold="60"

最新的脚本请留意我的私有gitlab: