在Linux中自定义N卡的风扇转速曲线

我个人对硬件的温度比较重视,认为是越低越好,显卡这玩意超过70度我觉得就已经是高温了。由于我已经主力使用Linux系统很久了,一直都是在需要给显卡上强度的时候,直接拉满显卡风扇。但是后面发现不是每时每刻都需要跑满的,没有负载的时候风扇还在呼呼吹确实是有点浪费了,于是就想搓一个bash脚本,用于显卡风扇控制。

脚本本体

没错,又是面向LLM编程!

#!/bin/bash

# 初始化上一次的风扇转速
last_speed=-1

while true; do
    # 获取 GPU 温度(单位:摄氏度)
    temp=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits -i 0)

    # 判断温度范围并计算风扇转速
    if (( $(echo "$temp <= 40" | bc -l) )); then
        current_speed=40
    elif (( $(echo "$temp >= 70" | bc -l) )); then
        current_speed=100
    else
        # 线性插值:温度在 40~70°C 之间,速度从 40%~100%
        current_speed=$(echo "scale=0; 40 + 2 * ($temp - 40)" | bc)
    fi

    # 如果转速发生变化,才执行设置并输出调试信息
    if [ "$current_speed" -ne "$last_speed" ]; then
        echo "GPU Temp: $temp°C → Fan Speed: $current_speed%"
        nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=$current_speed" > /dev/null 2>&1
        last_speed=$current_speed
    fi

    # 每秒检测一次
    sleep 1
done

脚本说明

  • 脚本逻辑:40度以下,转速40%,40度到70度,线性递增,到70度及以上时为100%。至于为什么不是停转?因为我的是涡轮卡,没法停( ,需要的话请自行修改。
  • 使用方法:把代码保存为set_GPU_fan.sh,赋予执行权限后用root执行。建议配合tmux挂在后台。
  • 注意事项:这个脚本只针对单GPU,单风扇的情况,如果你是多GPU或者nvidia-settings厘米出现了多个风扇控制,就需要进行脚本的完善和修改。我这个脚本只在有桌面环境的情况下测试过没问题,对于无GUI的情况,我是没有测试过的,据说是要运行X Server才可以运行nvidia-settings

希望这个脚本可以更好的帮助你控制显卡温度。