Como é possível controlar a velocidade do ventilador de várias GPUs NVIDIA de consumo, como Titan e 1080 Ti, em um nó sem cabeça executando Linux?
Responder1
A seguir está um método simples que não requer scripts, conexão de monitores falsos ou manipulação e pode ser executado por SSH para controlar vários ventiladores de GPUs NVIDIA. Foi testado no Arch Linux.
Crie xorg.conf
sudo nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=7
Isso criará um arquivo /etc/X11/xorg.conf
com uma entrada para cada GPU, semelhante ao método manual.
Observação:Algumas distribuições (Fedora, CentOS, Manjaro) possuem arquivos de configuração adicionais (por exemplo, in /etc/X11/xorg.conf.d/
ou /usr/share/X11/xorg.conf.d/
), que substituem xorg.conf
e definem AllowNVIDIAGPUScreens
. Esta opção não é compatível com este guia. Os arquivos de configuração extras devem ser modificados ou excluídos. O arquivo de log do X11 mostra quais arquivos de configuração foram carregados.
Alternativa: Crie xorg.conf manualmente
Identifique os IDs PCI das suas placas:
nvidia-xconfig --query-gpu-info
Encontre os PCI BusID
campos. Observe que eles não são iguais aos IDs de barramento relatados no kernel.
Alternativamente, faça sudo startx
, abra /var/log/Xorg.0.log
(ou qualquer local que startX liste em sua saída sob a linha "Arquivo de log:") e procure a linha NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>
.
Editar/etc/X11/xorg.conf
Aqui está um exemplo de xorg.conf
uma máquina com três GPU:
Section "ServerLayout"
Identifier "dual"
Screen 0 "Screen0"
Screen 1 "Screen1" RightOf "Screen0"
Screen 1 "Screen2" RightOf "Screen1"
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:5:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:6:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Device"
Identifier "Device2"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:9:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
EndSection
Section "Screen"
Identifier "Screen2"
Device "Device2"
EndSection
Devem BusID
corresponder aos IDs de barramento que identificamos na etapa anterior. A opção AllowEmptyInitialConfiguration
permite que o X seja iniciado mesmo se nenhum monitor estiver conectado. A opção Coolbits
permite que os ventiladores sejam controlados. Também pode permitir overclock.
Observação:Algumas distribuições (Fedora, CentOS, Manjaro) possuem arquivos de configuração adicionais (por exemplo, in /etc/X11/xorg.conf.d/
ou /usr/share/X11/xorg.conf.d/
), que substituem xorg.conf
e definem AllowNVIDIAGPUScreens
. Esta opção não é compatível com este guia. Os arquivos de configuração extras devem ser modificados ou excluídos. O arquivo de log do X11 mostra quais arquivos de configuração foram carregados.
Editar/root/.xinitrc
nvidia-settings -q fans
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:1]/GPUFanControlState=1 -a [fan:1]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:2]/GPUFanControlState=1 -a [fan:2]/GPUTargetFanSpeed=75
Eu uso .xinitrc para executar as configurações da nvidia por conveniência, embora provavelmente existam outras maneiras. A primeira linha imprimirá todos os ventiladores de GPU do sistema. Aqui, configurei os ventiladores para 75%.
Lançar X
sudo startx -- :0
Você pode executar este comando do SSH. A saída será:
Current version of pixman: 0.34.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sat May 27 02:22:08 2017
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
Attribute 'GPUFanControlState' (pushistik:0[gpu:0]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:0]) assigned value 75.
Attribute 'GPUFanControlState' (pushistik:0[gpu:1]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:1]) assigned value 75.
Attribute 'GPUFanControlState' (pushistik:0[gpu:2]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:2]) assigned value 75.
Monitore temperaturas e velocidades de clock
nvidia-smi
e nvtop
pode ser usado para observar temperaturas e consumo de energia. Temperaturas mais baixas permitirão que a placa tenha uma freqüência mais alta e aumente seu consumo de energia. Você pode usar sudo nvidia-smi -pl 150
para limitar o consumo de energia e manter as placas resfriadas ou para sudo nvidia-smi -pl 300
deixá-las fazer overclock. Meu 1080 Ti funciona a 1480 MHz se receber 150W e mais de 1800 MHz se receber 300W, mas isso depende da carga de trabalho. Você pode monitorar a velocidade do clock com nvidia-smi -q
ou mais especificamente,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'
Voltando ao gerenciamento automático de ventiladores.
Reinício. Não encontrei outra maneira de automatizar os ventiladores.
Responder2
Quando você executa o fans.py, ele configura um servidor X temporário para cada GPU com um display falso conectado. Em seguida, ele percorre as GPUs a cada poucos segundos e define a velocidade da ventoinha de acordo com a temperatura. Quando o script morre, ele devolve o controle dos ventiladores aos drivers e limpa os servidores X.
Responder3
Com base nas respostas a esta pergunta e em perguntas semelhantes do StackExchange, escrevi um script de shell que definirá a velocidade do ventilador para 100
(ou qualquer valor que você desejar) paratodosdos seus fãs emtodosde suas GPUs em uma máquina.
Este script pressupõe que sua máquina tenha o X11 instalado, mas que você não o esteja usando para fornecer uma GUI a um usuário.
/bin/set-gpu-fan-speed.sh:
#!/bin/bash
set -Eeuxo pipefail
# Kill any existing X servers.
killall Xorg || true
sleep 5
# Create a NVIDIA-friendly Xorg config.
nvidia-xconfig -a --cool-bits=28 --allow-empty-initial-configuration --enable-all-gpus
# Start a new X server for nvidia-settings to use.
export XDG_SESSION_TYPE=x11
export DISPLAY=:0
startx -- $DISPLAY &
sleep 5
# Determine the number of GPUs and fans on this machine.
NUM_GPUS=$(nvidia-settings -q gpus | grep -c 'gpu:')
NUM_FANS=$(nvidia-settings -q fans | grep -c 'fan:')
# For each GPU, enable fan control.
for ((i=0; i < NUM_GPUS; i++))
do
nvidia-settings --verbose=all -a "[gpu:$i]/GPUFanControlState=1"
done
# For each fan, set fan speed to 100%.
for ((i=0; i < NUM_FANS; i++))
do
nvidia-settings --verbose=all -a "[fan:$i]/GPUTargetFanSpeed=100"
done
# Kill the X server that we started.
killall Xorg || true
Essas alterações na velocidade do ventilador não persistem durante as reinicializações, então escrevi um arquivo de unidade systemd para executar o script acima em cada inicialização.
/etc/systemd/system/set-gpu-fan-speed.service:
[Unit]
Description="Sets the GPU fan speed"
[Service]
Type=oneshot
User=root
ExecStart=/bin/set-gpu-fan-speed.sh
[Install]
WantedBy=multi-user.target
Depois de criar o arquivo acima, execute os seguintes comandos como root para ativar o script em execução na reinicialização.
systemctl enable set-gpu-fan-speed.service
systemctl start set-gpu-fan-speed.service