Вопрос или проблема
Я получил старый ПК от друга, который оснащен MSI Nvidia GTX 970. Вентиляторы видеокарты больше не работали должным образом и качались, что вызывало нестабильное поведение в охлаждении. Я удалил старые вентиляторы и заменил их на 2 Arctic P12 PWM PST аналогичным образом, используя пластиковые стяжки, как показано в этом видео. Теперь оба вентилятора работают нормально, но я не могу понять, как правильно регулировать их скорости.
Существуют 2 варианта (оба вентилятора подключены через PST):
- Подключить открытый разъем вентилятора к разъему SYS_FAN / CHA_FAN на материнской плате
- Подключить открытый разъем вентилятора к разъему на GPU
GTX использует 6-контактный разъем, в котором ПИН 1, 3, 4 подключают PWM, Ground, +V к вентиляторам, а ПИН 2, 6 являются тахометрическими сигналами вентиляторов. Таким образом, мне нужно подключить разъем PST вентилятора к контактам 1, 3, 4 и 2 или 6. Расположение кабеля не позволяет мне использовать контакт 2, поэтому мне приходится использовать контакт 6, который, похоже, неисправен, потому что nvidia-smi
сообщает о скорости вентилятора 0%, хотя вентиляторы вращаются. Хотя я бы предпочел этот вариант, так как GPU будет управлять всем PWM, я не могу определить проблему и исправить неправильные скорости вентилятора. Таким образом, мне придется придерживаться варианта 1,
Используя этот вариант, я наткнулся на fancontrol
, который кажется довольно многообещающим для моего случая, но на данный момент, настраивая датчик, который должен быть контролируемым, я не нахожу датчик температуры GPU.
Что я могу сделать, чтобы заставить вентиляторы вращаться в зависимости от температуры GPU? Это означает, что я либо получаю возможность контролировать температуры GPU через fancontrol
, либо исправляю неправильное измерение об/мин при использовании разъема GPU.
Материнская плата: Asus Z97-A
pwmconfig
вывод с панели управления nvidia (обратите внимание, что ни одна из температур не совпадает)
Вывод sensors
:
nct6791-isa-0290
Адаптер: ISA адаптер
Vcore: 848.00 мВ (мин = +0.00 В, макс = +1.74 В)
in1: 1.02 В (мин = +0.00 В, макс = +0.00 В) АЛАРМ
AVCC: 3.33 В (мин = +2.98 В, макс = +3.63 В)
+3.3V: 3.33 В (мин = +2.98 В, макс = +3.63 В)
in4: 1000.00 мВ (мин = +0.00 В, макс = +0.00 В) АЛАРМ
in5: 1.98 В (мин = +0.00 В, макс = +0.00 В) АЛАРМ
in6: 0.00 В (мин = +0.00 В, макс = +0.00 В)
3VSB: 3.39 В (мин = +2.98 В, макс = +3.63 В)
Vbat: 3.25 В (мин = +2.70 В, макс = +3.63 В)
in9: 1.02 В (мин = +0.00 В, макс = +0.00 В) АЛАРМ
in10: 0.00 В (мин = +0.00 В, макс = +0.00 В)
in11: 920.00 мВ (мин = +0.00 В, макс = +0.00 В) АЛАРМ
in12: 0.00 В (мин = +0.00 В, макс = +0.00 В)
in13: 88.00 мВ (мин = +0.00 В, макс = +0.00 В) АЛАРМ
in14: 0.00 В (мин = +0.00 В, макс = +0.00 В)
fan1: 0 об/мин (мин = 0 об/мин)
fan2: 418 об/мин (мин = 0 об/мин)
fan3: 0 об/мин (мин = 0 об/мин)
fan4: 0 об/мин (мин = 0 об/мин)
fan5: 0 об/мин (мин = 0 об/мин)
fan6: 0 об/мин (мин = 0 об/мин)
SYSTIN: +27.0°C (высокий = +0.0°C, гистерезис = +0.0°C) АЛАРМ датчик = термистор
CPUTIN: +28.5°C (высокий = +80.0°C, гистерезис = +75.0°C) датчик = термистор
AUXTIN0: +127.0°C датчик = термистор
AUXTIN1: -128.0°C датчик = термистор
AUXTIN2: +30.0°C датчик = термистор
AUXTIN3: +127.0°C датчик = термистор
PECI Agent 0: +27.5°C
PCH_CHIP_CPU_MAX_TEMP: +0.0°C
PCH_CHIP_TEMP: +0.0°C
PCH_CPU_TEMP: +0.0°C
вторжение0: АЛАРМ
вторжение1: АЛАРМ
включение зуммера: отключено
acpitz-acpi-0
Адаптер: ACPI интерфейс
temp1: +27.8°C (крит = +105.0°C)
temp2: +29.8°C (крит = +105.0°C)
coretemp-isa-0000
Адаптер: ISA адаптер
Package id 0: +35.0°C (высокий = +80.0°C, критический = +100.0°C)
Core 0: +32.0°C (высокий = +80.0°C, критический = +100.0°C)
Core 1: +32.0°C (высокий = +80.0°C, критический = +100.0°C)
Core 2: +30.0°C (высокий = +80.0°C, критический = +100.0°C)
Core 3: +33.0°C (высокий = +80.0°C, критический = +100.0°C)
Я решил эту проблему, написав небольшой скрипт на Python, который запускается при старте и grep -P \d{1,3}(?=C)
извлекает температуру из nvidia-smi
. Эта температура используется для расчета значения PWM (0, 255), которое затем записывается в файл /etc/fancontrol
, предоставленный изначально pwmconfig
:
...(не трогать INTERVAL, FCTEMPS, FCFANS, так как мы сделаем это программно)
MINTEMP=0
MAXTEMP=1
MINSTART=hwmon/pwm/={PWM}
MINSTOP=hwmon/pwm/={PWM}
MINPWM=hwmon/pwm/={PWM}
MAXPWM=hwmon/pwm/={PWM}+1
затем с sudo service fancontrol restart
.
Ответ или решение
Управление скоростью вентиляторов в зависимости от температуры GPU на Ubuntu 20.04
Ваша ситуация с управлением скоростью вентиляторов на видеокарте Nvidia GTX 970 в системе Ubuntu 20.04 требует детального внимания ко многим аспектам, включая подключение вентиляторов, использование программного обеспечения для контроля и программирование автоматических операций. Давайте разберём основные шаги для достижения устойчивого решения.
1. Подключение вентиляторов
Вы рассмотрели два варианта подключения вентиляторов, и правильный выбор здесь ключевой. Безусловно, предпочтительнее подключить вентиляторы к разъёму на видеокарте, чтобы обеспечить автоматическое управление скоростью на основе температуры GPU. Однако, если ваш текущий разъём на видеокарте не работает корректно, следует использовать разъёмы на материнской плате (SYS_FAN или CHA_FAN).
2. Установка и настройка fancontrol
Чтобы управлять скоростью вентиляторов в зависимости от температуры, вы можете использовать утилиту fancontrol
, которая является важным инструментом для автоматизации этого процесса:
-
Установка
fancontrol
:sudo apt install fancontrol
-
Настройка
pwmconfig
:
Запуститеpwmconfig
для настройки управления PWM:sudo pwmconfig
Убедитесь, что он обнаруживает все доступные вентиляторы. Если температурные датчики для GPU не отображаются, это может быть связано с несовместимостью драйверов или необходимостью ручного добавления датчиков.
-
Проблема с отсутствием температурных датчиков:
Если вы не видите термометры GPU, следует установить драйвера Nvidia. Используйте команду:sudo apt install nvidia-driver-<version>
3. Мониторинг температуры GPU
Если стандартные утилиты не способны получить данные о температуре, вы можете извлечь данные напрямую из nvidia-smi
. Это можно сделать с помощью небольшого скрипта на Python, который будет запускаться при загрузке системы.
4. Скрипт для вычисления PWM
Следующий пример Python-скрипта сможет извлекать температуру GPU и обновлять файл конфигурации fancontrol
:
import subprocess
import re
def get_gpu_temp():
output = subprocess.check_output("nvidia-smi", shell=True).decode()
temp_match = re.search(r'(\d+)\s*C', output)
return int(temp_match.group(1)) if temp_match else 0
def update_fancontrol(temp):
pwm = min(max(0, (temp - 30) * 255 // 70), 255) # Примерный алгоритм
with open('/etc/fancontrol', 'w') as f:
f.write(f"""# Настройки PWM
INTERVAL=10
FCTEMPS=hwmon/pwm1={temp}
FCFANS=hwmon/pwm1={pwm}\n""")
subprocess.call(['sudo', 'service', 'fancontrol', 'restart'])
if __name__ == '__main__':
gpu_temp = get_gpu_temp()
update_fancontrol(gpu_temp)
5. Автоматизация запуска скрипта
Чтобы гарантировать автоматический запуск этого скрипта при загрузке системы, добавьте его в crontab:
@reboot /usr/bin/python3 /path/to/your_script.py
Заключение
С помощью этого решения, вы можете эффективно управлять скоростью вентиляторов вашего GPU в зависимости от температуры, что обеспечит стабильную и безопасную работу вашей системы. Кроме того, регулярные обновления драйверов Nvidia и взаимодействие с сообществом пользователей на форумах могут помочь в быстром решении возникающих проблем.