24.3.1. Настройка сохранения выделенных ресурсов видеопамяти
Драйвер NVIDIA для Linux поддерживает приостановку и гибернацию системы (включая ACPI S3, S4 и s2idle), подготавливая графические процессоры к возврату в рабочее состояние. Однако не всё содержимое видеопамяти может быть сохранено, что может привести к ошибкам рендеринга и сбоям приложений после выхода из сна. Для улучшения поддержки таких сценариев доступен экспериментальный интерфейс управления питанием, интегрируемый с systemd и настраиваемый вручную.
24.3.1.1. Способ 1. Сохранение в безымянных временных файлах
Такой способ позволяет использовать глубокий уровень сна (S4 и S5) и не требует поддержки режима S0ix.
На некоторых устройствах с PRIME возможны проблемы. Этот способ преимущественно предназначен для настольных ПК.
Настройка:
Активировать интерфейсы управления питанием NVIDIA:
# systemctl enable nvidia-suspend.service nvidia-resume.service nvidia-hibernate.service
Эти сервисы заменяют стандартные sleep, hibernate и resume, предоставляя возможность сохранить ресурсы видеопамяти перед отключением питания видеокарты.
В опциях драйвера NVIDIA изменить способ сохранения ресурсов видеопамяти:
# cat << _EOF_ > /etc/modprobe.d/nvidia_videomemory_allocation.conf
options nvidia NVreg_PreserveVideoMemoryAllocations=1
options nvidia NVreg_TemporaryFilePath=/var/tmp
_EOF_
# make-initrd
Для корректного сохранения ресурсов видеопамяти файловая система должна поддерживать безымянные временные файлы и иметь достаточный объём — объём, равный сумме всей видеопамяти плюс 5 %, обычно достаточен.
Узнать объём видеопамяти можно командой:
# nvidia-smi -q -d MEMORY | grep 'FB Memory Usage' -A1
Чтобы избежать нехватки места, не следует указывать каталоги размещённые в tmpfs (например, /tmp или /run) в опции NVreg_TemporaryFilePath.
NVIDIA не даёт чётких рекомендаций по выбору каталога. Можно использовать, например, /var/tmp.
24.3.1.2. Способ 2. Режим сохранения питания S0ix
Этот способ позволяет не выгружать содержимое видеопамяти. Режим S0ix ориентирован на переносные устройства.
Настройка:
Проверить, поддерживает ли система s2idle:
$ cat /sys/power/mem_sleep
[s2idle]
Если s2idle отсутствует в выводе, значит он не поддерживается. В этом случае следует использовать
Способ 1.
Проверить, поддерживает ли видеочип S0ix:
$ grep 'Video Memory Self Refresh' /proc/driver/nvidia/gpus/<Domain>:<Bus>:<Device>.0/power
Значения <Domain>, <Bus> и <Device> можно найти в каталоге /proc/driver/nvidia/gpus.
Если вывод:
Video Memory Self Refresh: is supported
— значит S0ix поддерживается, и можно продолжать настройку.
Если система и видеочип поддерживают указанные режимы, добавить параметр
NVreg_EnableS0ixPowerManagement=1:
# modprobe nvidia NVreg_EnableS0ixPowerManagement=1
Если при выводе
cat /sys/power/mem_sleep,
s2idle не заключён в квадратные скобки (т.е. не выбран), выполнить команду:
# echo "s2idle" > /sys/power/mem_sleep
Проверьте корректность работы перехода в спящий режим и восстановления. Если всё работает, сделать настройку постоянной:
# cat << _EOF_ > /etc/modprobe.d/enable_S0ix_power_management.conf
options nvidia NVreg_EnableS0ixPowerManagement=1
_EOF_
# make-initrd
Если
s2idle ранее приходилось указывать вручную, добавить в файл
/etc/sysconfig/grub2 параметр:
GRUB_CMDLINE_LINUX_DEFAULT="... mem_sleep_default=s2idle"
Затем обновить конфигурацию GRUB:
# grub-mkconfig -o /boot/grub/grub.cfg
При переходе видеокарты в спящий режим S0ix возможны два сценария:
если использование видеопамяти было меньше определённого порога, её содержимое будет скопировано в системную память, и видеокарта полностью отключится;
если использование видеопамяти было больше определённого порога, видеопамять перейдёт в режим самообновления, при этом остальная часть графического процессора будет отключена.
По умолчанию порог составляет 256 МБ. Его можно изменить с помощью параметра NVreg_S0ixPowerManagementVideoMemoryThreshold. Однако стоит учитывать, что чем выше порог, тем выше вероятность того, что часть видеопамяти не будет сохранена.