Как можно контролировать скорость вращения вентиляторов нескольких потребительских графических процессоров NVIDIA, таких как Titan и 1080 Ti, на автономном узле под управлением Linux?
решение1
Ниже приведен простой метод, который не требует написания скриптов, подключения поддельных мониторов или возни и может быть запущен через SSH для управления вентиляторами нескольких графических процессоров NVIDIA. Он был протестирован на Arch Linux.
Создать xorg.conf
sudo nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=7
Это создаст /etc/X11/xorg.conf
запись для каждого графического процессора, аналогично ручному методу.
Примечание:В некоторых дистрибутивах (Fedora, CentOS, Manjaro) есть дополнительные файлы конфигурации (например, в /etc/X11/xorg.conf.d/
или /usr/share/X11/xorg.conf.d/
), которые переопределяют xorg.conf
и устанавливают AllowNVIDIAGPUScreens
. Эта опция несовместима с данным руководством. Дополнительные файлы конфигурации следует изменить или удалить. Файл журнала X11 показывает, какие файлы конфигурации были загружены.
Альтернатива: создать xorg.conf вручную
Определите идентификаторы PCI ваших карт:
nvidia-xconfig --query-gpu-info
Найдите PCI BusID
поля. Обратите внимание, что они не совпадают с идентификаторами шин, указанными в ядре.
В качестве альтернативы выполните команду sudo startx
, open /var/log/Xorg.0.log
(или любое другое место, которое startX указывает в своих выходных данных под строкой «Log file:») и найдите строку NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>
.
Редактировать/etc/X11/xorg.conf
Вот пример xorg.conf
для машины с тремя 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
Должны BusID
соответствовать идентификаторам шин, которые мы определили на предыдущем шаге. Эта опция AllowEmptyInitialConfiguration
позволяет X запускаться, даже если не подключен монитор. Эта опция Coolbits
позволяет управлять вентиляторами. Она также может разрешить разгон.
Примечание:В некоторых дистрибутивах (Fedora, CentOS, Manjaro) есть дополнительные файлы конфигурации (например, в /etc/X11/xorg.conf.d/
или /usr/share/X11/xorg.conf.d/
), которые переопределяют xorg.conf
и устанавливают AllowNVIDIAGPUScreens
. Эта опция несовместима с данным руководством. Дополнительные файлы конфигурации следует изменить или удалить. Файл журнала X11 показывает, какие файлы конфигурации были загружены.
Редактировать/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
Я использую .xinitrc для выполнения nvidia-settings для удобства, хотя, вероятно, есть и другие способы. Первая строка выведет все вентиляторы GPU в системе. Здесь я установил вентиляторы на 75%.
Запуск X
sudo startx -- :0
Эту команду можно выполнить из SSH. Вывод будет следующим:
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.
Мониторинг температур и тактовых частот
nvidia-smi
и nvtop
может использоваться для наблюдения за температурой и энергопотреблением. Более низкие температуры позволят карте работать на более высоких частотах и увеличить энергопотребление. Вы можете использовать sudo nvidia-smi -pl 150
для ограничения энергопотребления и поддержания охлаждения карт или использовать sudo nvidia-smi -pl 300
для их разгона. Моя 1080 Ti работает на частоте 1480 МГц при 150 Вт и более 1800 МГц при 300 Вт, но это зависит от рабочей нагрузки. Вы можете контролировать их тактовую частоту с помощью nvidia-smi -q
или, более конкретно,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'
Возвращаемся к автоматическому управлению вентиляторами.
Перезагрузка. Другого способа сделать вентиляторы автоматическими я не нашел.
решение2
При запуске fans.py он устанавливает временный X-сервер для каждого GPU с подключенным фальшивым дисплеем. Затем он проходит по GPU каждые несколько секунд и устанавливает скорость вращения вентилятора в соответствии с их температурой. Когда скрипт умирает, он возвращает управление вентиляторами драйверам и очищает X-серверы.
решение3
Основываясь на ответах на этот вопрос и похожие вопросы StackExchange, я написал скрипт оболочки, который установит скорость вращения вентилятора 100
(или любое другое значение, которое вы захотите)всеваших поклонников навсеваших графических процессоров на машине.
Этот скрипт предполагает, что на вашем компьютере установлен X11, но вы не используете его для предоставления графического интерфейса пользователю.
/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
Эти изменения скорости вращения вентилятора не сохраняются при перезагрузках, поэтому я написал файл systemd для запуска вышеуказанного скрипта при каждой загрузке.
/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
После создания вышеуказанного файла выполните следующие команды от имени пользователя root, чтобы включить запуск скрипта при перезагрузке.
systemctl enable set-gpu-fan-speed.service
systemctl start set-gpu-fan-speed.service