Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

NVIDIA на ноутбуке: питание и энергосбережение

Если ноутбук с гибридной графикой разряжается за два часа, а nvidia-smi в простое показывает 30–40 Вт, дело не в системе, а в том, что дискретная карта не засыпает. Разбираю, как усыпить NVIDIA через параметр NVreg_DynamicPowerManagement, как отключить её по ACPI, и почему режим «только встроенная графика» в BIOS — самый честный способ сэкономить.

Почему dGPU ест батарею в простое?

Дискретная карта на Optimus-ноутбуках живёт в двух состояниях: D0 — полностью включена, D3cold — обесточена. Пока она в D0, даже без единого процесса, потребление держится в районе 5–10 Вт, вентиляторы раскручиваются, корпус греется. Батареи хватает на 3–4 часа вместо 8–10.

Вторая причина — монитор. Если кабель подключён к порту, который физически заведен на NVIDIA, карта обязана оставаться в D0: она отдаёт изображение. Никакая экономия тут не поможет, пока внешний экран или зарядка не отключены.

Третья — включённый persistence mode. Он держит драйвер и карту инициализированными, чтобы пробуждение было мгновенным. Плата этого удобства — карта не уходит в D3cold вообще. Если экономия важнее скорости пробуждения, persistence mode выключают:

sudo nvidia-smi -pm 0

Четвёртая причина глубже всех: режим MUX. В ноутбуках с Optimus дискретная карта может быть подключена к встроенному экрану через собственный мультиплексор. В таком варианте питание карты физически не отключается, D3cold недостижим, и единственный способ сэкономить — переключить BIOS в режим «только встроенная графика» либо на ноутбуках с Advanced Optimus переключить MUX из операционной системы.

Как понять, какая графика работает сейчас?

Начни с PCIe-стета power state — это честный ответ, без догадок:

lspci -nnk | grep -A3 -E 'VGA|3D controller'
cat /sys/bus/pci/devices/0000:01:00.0/power_state

D0 — карта натянет энергию, D3cold — обесточена и потребление почти ноль, D3hot — промежуточное состояние, питание частично есть, экономии почти нет.

Состояние самой NVIDIA смотрится так:

nvidia-smi --query-gpu=name,pstate,power.draw,clocks.sm --format=csv

pstate P8 или P0 у карты, которая ничего не делает, — повод настраивать питание. Расход батареи виден на уровне системы:

cat /sys/class/power_supply/BAT0/power_now
upower --dump | grep -A4 'energy-rate'

Как переключать графику: nvidia-prime и опции ядра?

Классическая схема — офлоад в переменных окружения. prime-run перед игрой выставляет __GLX_VENDOR_LIBRARY_NAME, __NV_PRIME_RENDER_OFFLOAD и __GLFW_LIBRARY_PATH, и процесс уходит на NVIDIA. Про остальные тонкости — Prime, Run и Steam на гибридной графике.

Остаток мощности можно держать под рукой и без перезапуска: prime-select ondemand переводит систему в режим экономии, prime-select off полностью отключает dGPU в текущей сессии.

Два параметра ядра стоит зафиксировать сразу. Первый включает эмуляцию fbdev на карте NVIDIA — без неё консоль может не отрисоваться на нужном выходе, и это же лечит часть проблем с чёрным экраном и nomodeset. Второй убирает nouveau из уравнения, если он мешает:

# /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

# /etc/modprobe.d/nvidia-fbdev.conf
options nvidia_drm fbdev=1

После правок initramfs обязателен: sudo mkinitcpio -P, затем перезагрузка. Если в lsmod nouveau всё ещё есть, новый initramfs не подхватился.

Отдельно про nouveau: на ядрах 6.2+ у модуля есть runpm=1 — пробуждение по требованию клиентов. Стоит включить, если карта досталась в связке со свободным драйвером.

Как включить Dynamic Power Management?

Это главный рычаг, который реально усыпляет карту без внешнего монитора. Один файл — и карта уходит в D3cold, как только все клиенты отцепились:

# /etc/modprobe.d/nvidia-power.conf
options nvidia NVreg_DynamicPowerManagement=0x02

Значения читаются как битовая маска: 0x00 полностью выключает механику, 0x01 — грубый режим, 0x02 — более тонкий, его обычно и советуют для Optimus-ноутбуков, 0x03 встречается как комбинация флагов в новых драйверах. После initramfs и перезагрузки проверь результат:

nvidia-smi -q | grep -i -A2 'Dynamic Power'
cat /sys/bus/pci/devices/0000:01:00.0/power_state

Не сработало — смотри dmesg:

dmesg | grep -i -E 'nvidia|d3cold|acpi' | tail -40

Две частые причины провала: nouveau всё ещё загружен и живёт в одной связке с проприетарным драйвером, либо к карте подключён монитор через HDMI/DisplayPort. Ещё одна тонкость — встроенный дисплей на многих ноутбуках физически привязан к NVIDIA, и D3cold там просто не активируется.

Как полностью отключить dGPU: acpi_call вместо bbswitch?

Если NVIDIA не нужна вообще, надёжнее выключить её на уровне прошивки. bbswitch для этого давно не нужен — модуль не собирается под свежие ядра, а апстримная поддержка в ядре так и не появилась. Остаётся acpi_call, который умеет дёргать ACPI-метод:

sudo pacman -S acpi_call
sudo modprobe acpi_call
ls /sys/firmware/acpi/calls

В списке ищи путь вроде _SB.PCI0.PEG0.SWRT.DSTS. Значение 1 — карта обесточена, 0 — включена обратно:

echo 1 | sudo tee /sys/firmware/acpi/calls/_SB._SB.PCI0.PEG0.SWRT.DSTS

Имя метода отличается между ноутбуками, поэтому всегда смотри ls перед записью. Нужен именно тот путь, где в имени есть SWRT (switch) — это и есть переключатель питания карты. Если в списке ничего похожего нет, попробуй выгрузить таблицу методов и поискать в ней PEG:

sudo cat /sys/firmware/acpi/tables | strings | grep -i -E 'SWRT|PEG0'

Метод слетает при каждом suspend, поэтому включение удобнее оформить как systemd-скрипт сна:

# /usr/lib/systemd/system-sleep/acpi-nvidia
#!/bin/sh
case "$1" in
  post|resume) echo 1 > /sys/firmware/acpi/calls/_SB._SB.PCI0.PEG0.SWRT.DSTS ;;
esac

Тот же приём с аргументом 0 в секции pre|post возвращает карту к жизни.

Как управлять питанием и мониторить экономию?

Сам драйвер умеет ограничивать себя. Ниже — энергопотребление в простое, где карта сама просит мало, а вот в играх пригодится ограничение по ваттам:

sudo nvidia-smi -pl 60
nvidia-smi -pl 100

Ограничение мощности упирается в запрос карты и помогает сильнее, чем снижение частот. Про частоты, turbo и limits — отдельный разбор про перегрев, вентиляторы и Coolbits.

Для замера эффекта помогает powertop — он показывает, какие устройства просыпаются и сколько съедают:

sudo powertop --auto-tune

Осторожно: --auto-tune любит усыплять dGPU и конфликтует с ручным переключением через Prime. Сначала настрой модуль вручную, потом включай powertop, и следи, чтобы вернуть карту из сна. Для замера потребления удобнее periodic-строка в nvidia-smi.

Отдельная история с батареей — заряд до 100% каждый день ускоренно её изнашивает. На ThinkPad порог задаётся прямо в sysfs:

cat /sys/class/power_supply/BAT0/charge_control_end_threshold
echo 80 | sudo tee /sys/class/power_supply/BAT0/charge_control_end_threshold

Частые вопросы

Помогает ли выключение persistence mode?

Да, если карта всё равно уходит в D3cold — с выключенным persistence mode драйвер не держит карту инициализированной. Но просыпается она дольше, первая игра даст пару секунд задержки. Для работы в поезде экономия обычно важнее.

Почему nvidia-smi показывает карту, когда она выключена?

Потому что команда обращается к драйверу, а тот поднимает устройство. Это ожидаемое поведение: сам факт вызова разбудит GPU. Для контроля смотри power_state в sysfs, а не nvidia-smi.

Какой смысл в prime-select, если есть prime-run?

Разные задачи. prime-run разово отправляет один процесс на NVIDIA, prime-select меняет поведение системы в целом и требует ручного переключения обратно, иначе драйвер уедет в D0 надолго.

Экономия мешает играм?

Сама по себе нет. Сброс состояния D3cold добавляет задержку старта приложения — от долей секунды до пары секунд. В играх карта всё равно сразу уходит в P0, где потребление максимальное.

Что делать, если карта всё равно не засыпает?

Пройди по порядку: отключи внешний монитор и проверь power_state снова, сними nouveau через blacklist и пересобери initramfs, включи NVreg_DynamicPowerManagement=0x02, отключи persistence mode. Если после этого D0 остаётся, у ноутбука почти наверняка MUX без раздельного питания, и путь один — режим «только встроенная графика» в BIOS. А вот ограничение мощности (nvidia-smi -pl) экономии батареи почти не даёт: карта в простое и так просит мало, а лимит упирается в артефакты в играх. Держи его повыше.

Полезные ресурсы

  • ArchWiki: NVIDIA Optimus — официальная страница про гибридную графику, DPM и offload.
  • ArchWiki: NVIDIA — полный список параметров драйвера и энергосбережения.

Заключение

Начни с NVreg_DynamicPowerManagement=0x02 и nvidia_drm.fbdev=1 — это дешёвые правки, которые дают основную часть экономии. Если карта всё равно просыпается, добавь acpi_call с методом SWRT.DSTS или переключись в BIOS на «только встроенную графику». На ноутбуках с NVIDIA Optimus проблему удобнее решить аппаратно: MUX переключается из ОС, и dGPU действительно обесточивается.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max