четверг, 25 сентября 2008 г.

Выжимаем из Nvidia GeForce максимум

Многие жалуются на недостаточную скорость работы сочетания Compiz+Nvidia drivers+Firefox и другие "тяжелые" программы. Решением этой проблемы является тонкая настройка Иксов и проприетарных драйверов. Имейте ввиду, что у меня видеокарта Nvidia GeForce 8600M GS и, возможно, для других семейств видеокарт все описанные ниже танцы с бубном будут не нужны или не актуальны. Используется версия драйверов 173.14.09 из Sid.

Для начала необязательный этап: сборка модуля nvidia вместе с ядром. Вместо сборки можно установить уже готовый модуль из пакета nvidia-kernel-..., но т.к. модуля под вашу версию ядра может и не оказаться, соберем модуль сами. Для этого ставим пакет nvidia-kernel-source. В папке /usr/src обнаруживается архив nvidia-kernel.tar.bz2, его нужно распаковать в ту же папку, т.е. структура каталогов будет: /usr/src/modules/nvidia-kernel Далее нужно настроить ядро. На странице вики говорят, что следующие опции вызывают проблемы с драйвером от Nvidia и их необходимо отключить:
  • Device drivers –> Graphics Support –> nVidia Riva support (FB_RIVA)
  • Device drivers –> Graphics support –> nVidia Framebuffer Support (FB_NVIDIA)
  • Device drivers –> Graphics support –> VESA VGA graphics support (FB_VESA)
  • Processor Type and Features –> Local APIC support on uniprocessors (X86_UP_APIC)
Если некоторые опции вы не можете найти, то можно считать, что они отключены. Сохраняем конфиг. После этого пересобираем ядро уже следующей командой (от рута):
make-kpkg --initrd linux_image modules_image
После сборки, кроме пакета с ядром, будет создан еще и пакет с модулем nvidia. Его необходимо установить также в дополнение к ядру. После установки новых ядра и модуля нужно перезагрузить систему.

Итак, для работы драйвера от Nvidia в системе должны быть установлены следующие пакеты:
  • nvidia-glx
  • nvidia-kernel-common
  • nvidia-settings (очень полезная вещь для настройки и мониторинга, но можно и не ставить)
  • nvidia-kernel-... (из репозитория или собранный на предыдущем шаге)

Приступаем к настройке. Для начала нужно настроить иксы на работу с установленным драйвером. Для этого в /etc/X11/xorg.conf нужно в секции "Device" указать
Driver "nvidia"
Перед внесением изменений сделайте бэкап этого файла, мало ли чего. Далее сохраняем файл и перезапускаем иксы (Ctrl+Alt+Backspace). Если иксы не запустились - проводите работу над ошибками. Если иксы запустились, выполняем в консоли glxinfo и смотрим, чтобы были такие строчки:
direct rendering: Yes
OpenGL vendor string: NVIDIA Corporation
Если всё так, то ура, драйвер работает. Если не работает - ищите ошибки, Гугл вам в помощь.

Теперь тюнинг. В /etc/X11/xorg.conf в секцию "Screen" нужно добавить следующее:
Option "AllowGLXWithComposite" "true"
Option "RenderAccel" "true"
Option "UseEvents" "false"
Option "TripleBuffer" "1"
Option "DamageEvents" "1"
Option "BackingStore" "1"
Option "RandRRotation" "true"
Option "NvAGP" "1"
Option "NoLogo"
Option "PixmapCacheSize" "2500000"
Option "AddARGBGLXVisuals" "true"
Option "OnDemandVBlankInterrupts" "true"
Эти опции выдернуты из различных описаний на форумах и обсуждений по оптимизации скорости на форуме Nvidia по Linux. Все описания этих опций есть в документации к драйверам. Для активации разгона можно также добавить:
Option "Coolbits" "1"
сами знаете, что за спаленный чип несете ответственность только вы.

Далее в пользовательский автозапуск необходимо добавить следующее:
nvidia-settings -a InitialPixmapPlacement=2 -a GlyphCache=1
в Гноме можно это добавить в "Сеансы".

Следующий шаг для владельцев ноутбуков. Чтобы отключить зловредный PowerMizer при питании от сети можно воспользоваться описанным мною ранее методом, а можно следующим, более корректным, но не всегда работающим. Итак, для отключения PowerMizer во время питания от сети необходимо в файл /etc/modprobe.d/nvidia-kernel-nkc в строчку, начинающуюся с
options nvidia
добавить через пробел следующую настройку:
NVreg_RegistryDwords="PerfLevelSrc=0x3322"
Т.е. строчка будет выглядеть примерно так:
options nvidia NVreg_DeviceFileUID=0 NVreg_DeviceFileGID=44 NVreg_DeviceFileMode=0660 NVreg_RegistryDwords="PerfLevelSrc=0x3322"
После этого можете перезагрузиться (перезапуск иксов не даст полного эффекта, по-моему) и наблюдать очень неплохую производительность в Compiz и Firefox. :)

Мониторить PowerMizer можно через nvidia-settings на соответствующей закладке. Учтите, что если драйвер уверен в отсутствии питания от сети, т.е. если
Power Source: Battery,
то на максимальное быстродействие не надейтесь. Замечены проблемы с определением источника питания после выхода из спящего режима.

Обновление
После обновления драйверов до 177.80 (пока есть только в experimental) производительность при работе от сети - просто отличная! Впечатления замечательные. И в этой версии должны быть исправлены проблемы с определением источника питания на новых ядрах.

Обновление от 7 ноября 2009
Наткнулся на статейку, описывающую еще некоторые дополнительные параметры, которые можно передать модулю ядра для более тонкой настройки PowerMizer. В частности, есть 2 новых параметра и нужно пояснить уже появлявшийся параметр:
  • PowerMizerDefault - режим по-умолчанию от батареи
  • PowerMizerDefaultAC - то же самое, но при работе от сети
  • PerfLevelSrc - политика переключения режимов, после 0x первые 2 цифры - политика в режиме работы от батареи, последние 2 - при работе от сети. 22 означает фиксированный режим, 33 - динамическое изменение в зависимости от нагрузки.
Список режимов для подстановки в первые 2 параметра можно посмотреть командой:
$ nvidia-settings -q GPUPerfModes -t
Она покажет режимы (perf) и соответствующие им частоты ядра и памяти. После этого можно выбрать подходящий и использовать его в настройке.

1 комментарий:

Unknown комментирует...

После двух дней экспериментов над своим ноутом получилась вот такая страничка с описанием того, как происходит управление частотой и сохранением питания в nvidia дровах для X.org - http://tutanhamon.com.ua/technovodstvo/NVIDIA-UNIX-driver/