对于服务器卡的散热一直是一个DIY用户群体津津乐道的话题,从目前来看,针对于Tesla P4上散热方案已经层初不穷了,有些方案很优雅,有些方案很别致,也有一些方案看起来很暴力,实际上很好使。
正好我不仅有一个tesla p4,而且我在公司中的调试机器有时候也会分配服务器级别的量产卡,这种被动散热卡都需要这类的散热解决方案的。
一、服务器中安装被动散热卡
服务器是自带暴力风扇的,但是这个暴力风扇的转速会比较高,同样噪音也会比较大,所以更优的方案是根据CPU和GPU还有其他组件的温度,编写一定策略通过ipmi
工具动态调整风扇转速。
一般来说我们这种平台都是虚拟化的,底层不是linux就是esxi这种虚拟化平台。
- 我们可以编写一个脚本,获取CPU、GPU、硬盘等温度,指定一个合适的风扇转速曲线。
- 我们可以做一个docker容器,也是封装一个脚本,参数化便于调速什么的,跑在内部的虚拟机上。
这里的操作方法后序单独开一个篇章再介绍。
二、普通PC安装被动散热卡
2.2 全速小风扇1
原装散热器拥有比较完美的外观,配合一个后置涡轮风扇就可以实现一个比较完美的平衡。这里可选一个两线直流小风扇进行调速,大概成本包邮8元左右,配合热稳定比较好的汽车级的涤纶胶带可以实现小白折腾门槛最低的方案。 风扇:
- 5V版本的5020风扇,配一个USB接头,可从USB借电。
- 12V版本的5020风扇,配主板小4PIN接头,可直接从主板上的风扇口借电。
优点:风量合适,不吵,价格便宜
缺点:无法调速
某宝关键词:5020风扇
2.3 全速小风扇2
淘宝上也有额外夹的MSI风扇提供:
这种风扇目前市面上看起来仅有两线版本,没有PWM调速和测转速的功能,如果要静音,需要搭配降速线使用。(某宝关键字Tesla P4 散热风扇
)
优点:散热效率比较高,价格适中。
缺点:无法调速。
2.4 主板温控小风扇
温控小风扇要求三线四线的风扇,最好是四线的,因为可以测速,实时输出转速。 目前主流的后背散热的方案大抵如此,这里列举几种典型案例:
弊端,如果是背一个风扇,长度可能会超标,比如挤压后方的SATA接口:
这时候可以参考M40/P40的散热折叠方案:
这种方案可是将风扇的接口直接插入到主板上,借用主板的板载控制芯片,可由用户编写脚本控制风扇转速。
优点:温控调速,可直接主板取电。
缺点:不同主板的控制PWM的芯片不同,可能需要自己debug芯片驱动。
如果一切都好,那可以达到自动控速的效果:
某鱼关键词:tesla P4 改散热
2.5 附加模块温控小风扇
通过附加温度采集与控制模块,从显卡本身取电,热敏电阻从核心部分的散热鳍片中采集温度,再控制风扇的转速。
优点:散热一体化的方案,可以做到温控调速,厉害一点的卖家可以把温控模块藏到显卡内部。 缺点:价格稍贵,背一个小模块没那么美观。
2.6 暴力钣金
独立定制散热套件,内部会集成上面的温控模组。
优点:最为一体性的方案,可以动态调速。
缺点:也是最费钱的方案
PC实操部分
首先皮蛋熊选择了使用3D打印连接部分,同时购买了一个7530的pwm风扇,总共花费不到20,可以将P4控制到一个很好的温度水平。
我的P4连接件使用下面的模型:
使用模型:Nvidia Tesla P4 Blower Adaptor (Fixed) by epical - Thingiverse
关联模型可作备用参考:NVIDIA Tesla T4/P4 blower fan adapter by aw_ - Thingiverse
最后成品成色如下,虽不是很美观,但胜在声音小,风量大,散热顶呱呱:
这里皮蛋熊针对群友的三个主板做了实验:
- 华擎 Z370M PRO4 -> NCT6683D
- MSI B460M MORTAR WIFI -> NCT6687
- 华硕B660M-PLUS D4 -> NCT6798D
这里不同主板的控制芯片不同,比如华擎的Z370M使用的是nct6683d
芯片,也有使用IT87
的,以下教程需要根据自己的不同,处理芯片驱动,同时确保内核开启了如下选项:
CONFIG_THERMAL=y
CONFIG_THERMAL_HWMON=y
这里以MSI B460M MORTAR WIFI
+ PVE
为例,进行说明。
我发现PVE的内核驱动目录中存在NCT的驱动:
/lib/modules/5.15.102-1-pve/kernel/drivers/hwmon/nct6683.ko
可以强制插入内核中:
insmod /lib/modules/5.15.102-1-pve/kernel/drivers/hwmon/nct6683.ko force=1
但会遇到pwm
通道不可写的问题:
$ echo 1 > /sys/class/hwmon/hwmon2/pwm1
hwmon2/pwm1: Permission denied
如果强制给写权限,也会出现IO错误导致无法写入。
注意: 这是因为nct6683
的驱动并不兼容nct6687
导致的。
我们需要重新编译一份nct6687
的驱动,可以参考这个大佬的仓库 NCT6687D
编译好了过后,我们会得到nct6687.ko
,此时将其插入到内核中,可正常驱动内核:
# 先 cd 到 nct6687.ko 所在目录
insmod nct6687.ko
此时在/sys/class/hwmon/hwmonX
中可以找到相关的控制文件
root@pve:/sys/class/hwmon/hwmon4# ls -al
total 0
drwxr-xr-x 3 root root 0 Nov 7 20:41 .
drwxr-xr-x 3 root root 0 Nov 7 20:41 ..
lrwxrwxrwx 1 root root 0 Nov 7 20:41 device -> ../../../nct6687.2592
-r--r--r-- 1 root root 4096 Nov 7 20:41 fan1_input
-r--r--r-- 1 root root 4096 Nov 7 20:41 fan1_label
-r--r--r-- 1 root root 4096 Nov 7 20:41 fan1_max
-r--r--r-- 1 root root 4096 Nov 7 20:41 fan1_min
***
-r--r--r-- 1 root root 4096 Nov 7 20:41 name
drwxr-xr-x 2 root root 0 Nov 11 20:23 power
-rw-r--r-- 1 root root 4096 Nov 11 20:23 pwm1
-rw-r--r-- 1 root root 4096 Nov 11 20:23 pwm2
-rw-r--r-- 1 root root 4096 Nov 11 20:23 pwm3
-rw-r--r-- 1 root root 4096 Nov 12 11:11 pwm4
***
如果你不知道你的hwmon
是哪一个,可以挨个目录切换进去 ,然后cat name
,看看是否是你的输出,比如我这里输出:
root@pve:/sys/class/hwmon# cat ./hwmon1/name
nvme
root@pve:/sys/class/hwmon# cat ./hwmon2/name
coretemp
root@pve:/sys/class/hwmon# cat ./hwmon3/name
iwlwifi_1
root@pve:/sys/class/hwmon# cat ./hwmon4/name
nct6687
可以看到这里是hwmon4
是我们的nct6687
的sys file
目录。
注意:这里的hwmon4
并不是固定的,是由hwmon
驱动的加载顺序决定的。
比如我这里是hwmon4
,如果设置了开机自动加载驱动,那有可能就变为hwmon2
了。
此时,我们可以准备一个主板的4pin风扇,开始准备寻找通道了。
root@pve:/sys/class/hwmon/hwmon4# cat fan1_label
CPU Fan
root@pve:/sys/class/hwmon/hwmon4# cat fan2_label
Pump Fan
root@pve:/sys/class/hwmon/hwmon4# cat fan3_label
System Fan #1
root@pve:/sys/class/hwmon/hwmon4# cat fan4_label
System Fan #2
root@pve:/sys/class/hwmon/hwmon4# cat fan5_label
System Fan #3
root@pve:/sys/class/hwmon/hwmon4# cat fan6_label
System Fan #4
可以看到fan1
是CPU风扇,fan2
是水冷风扇,fan3~fan8
是机箱风扇。
注意:并不是所有主板都把这些通道引出了,比如大部分的可能只引出了两个机箱风扇,不过这也够我们用了。
这时候我们可以去观察下主板的标注:
红框处从左往右分别标注了CHA_FAN1
,CHA_FAN2
,CHA_FAN3
,不同主板标注不一样,有的标注是sys_fan1
,sys_fan2
,sys_fan3
等。
这里我们准备一个4Pin风扇,这里我以我买的的7530 pwm风扇
为例:
将接线端插入主板的cha_fan
中方便的那个,这里以cha_fan2
为例,
根据上面我们查询的知识知道fan4_label
输出为System Fan #2
,即是对应的cha_fan2
。
如果你和我一样,是四线的风扇,正常的线序应该是GND,VCC,PWM,INPUT
,最后一个INPUT
是采集风扇转速的,你可以通过下面命令查看风扇转速:
# 具体的hwmon号,需要根据具体情况判断
cd /sys/class/hwmon/hwmon4
cat fan1_input
cat fan2_input # 这里可以取值根据你的驱动决定,这里我的是 fan1 ~ fan8
有了上面的输出,我们可以判断在哪些通道上采集到了转速信号,便于确定我们的风扇接到了哪个通道上。为了进一步确定我们的通道选择是否正确,此时我们可以操作下面命令:
# 具体的hwmon号,需要根据具体情况判断
cd /sys/class/hwmon/hwmon4
# 判断风扇是否停转
echo 0 > pwm4
# 判断风扇是否满速运转
echo 255 > pwm4
如果上面指令起到效果了(观察风扇转速),那证明我们的控制链路已经通了,我们已经明确知道pwm4
和fan4
对应到我们插入的主板cha_fan2
了。
注意:不同的主板接线方式不同,比如华擎Z370M PRO4
这个主板就接反了线,结果发现其fan4、PWM3
是一组的,如果你没找到输出,建议从pwm1 ~ pwm8
(不同控制芯片的通道数不同)挨个执行上面指令,判断是否起了效果。
现在假设你已经确定了你主板上的cha_fan2
可以被hwmon4
的fan4、pwm4
所控制了,那么我们就可以固化一下我们的设置了。
我们先将内核驱动设置为开机自启动:
cp nct6687.ko /lib/modules/$(uname -r)/
depmod -a
# vim /etc/modules 添加下面模块
nct6687
# 更新 initramfs
update-initramfs -u -k all
# 重启电脑
reboot
此时我们重启一下电脑,重新检查一下/sys/class/hwmon
目录下是哪个hwmonx
,这里重新启动后,驱动正常加载,hwmon号变为了2,也即是现在变为了/sys/class/hwmon/hwmon2
是控制风扇转了。
知道这些信息后,我们还可以进一步针对不同的风扇,测量其启动转速,这个根据风扇的不同略有不同。
自此,调速的前置条件我们都满足了,接下来就可以写一个简单的调速脚本来做这个事了,为了方便各位,皮蛋熊在这里已经写好了,开源并打包为了一个DEB包。
安装:
dpkg -i gpufan_ctrl-amd64.deb
修改配置文件:
# vim /etc/gpufan-ctrl/config.json
{
"interval" : "1", # 调控间隔
"hwmon" : "4", # hwmon号,根据上面的教程查询
"pwm_chan" : "4", # 控制风扇通道
"fan_chan" : "4", # 读取风扇转速通道,某些主板这里可能不是和pwm通道对应
"fan_min" : "25", # 开始风扇控制时候pwm占空比
"fan_max" : "70", # pwm占空比最高值
"tmp_start" : "45", # gpu温度超过这个值过后开始调控转速
"tmp_ratio" : "2", # 每升高1° pwm占比空升高比例
"tmp_high" : "82" # gpu温度超过这个值将全速运转
}
配置文件修改完成后,可以试试输入:
gpufan-ctrl
等待输出:
root@pve:~# gpufan-ctrl
| GPU Temp | Fan Speed | Fan RPM |
| 49° | 33% | 2758 |
| 49° | 33% | 2727 |
| 49° | 33% | 2603 |
| 49° | 33% | 2603 |
| 48° | 31% | 2614 |
| 48° | 31% | 2521 |
| 48° | 31% | 2448 |
| 47° | 29% | 2448 |
| 47° | 29% | 2343 |
| 47° | 29% | 2316 |
| 47° | 29% | 2298 |
| 46° | 27% | 2294 |
| 46° | 27% | 2307 |
| 46° | 27% | 2162 |
可以看到随着GPU温度降低,风扇转速逐步降低。此时我们调整好/etc/gpufan-ctrl/config.json
文件中的风扇参数后,输入以下指令,即可实现开机自动启动调速:
systemctl start gpufan-ctrl.service
折腾之路并不会一帆风顺,或许你会遇到这样那样的问题,也或许你有更好的方案分享,如果你想交流心得,欢迎来 新QQ群 或者 TG群 一起吹水~(老Q群因不明原因被封,所以只加Q群有概率迷路)
评论区