четверг, 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) и соответствующие им частоты ядра и памяти. После этого можно выбрать подходящий и использовать его в настройке.

среда, 24 сентября 2008 г.

Жизнь в Debian Lenny

В итоге Debian оправдал возложенные надежды, но только после перехода на Lenny, в Etch жить ну уж совсем невозможно. А вот Lenny устраивает гораздо больше, чем Убунту. Здесь нет погони за регулярным частым релизом - релиз выпускается, когда баги залатаны, фичи достигнуты и получается достаточно качественный дистрибутив. Убунта после взгляда на Дебиан кажется слишком уж предустановленной и преднастроенной... веет от нее проприетарными настроениями, когда из установленной системы приходится выкорчевывать лишнее, а не наполнять нужным. А Дебиан в свою очередь даже отчасти выигрывает от этаких родственных связей с Убунтой: в наши дни Убунта становится популярной и многие создатели ПО делают под нее готовые пакеты и репозитории... которые очень часто подходят и к Дебиан. Однако тут следует быть очень осторожными, нет ничего хорошего в частом смешивании пакетов из разных дистрибутивов.

Сборка ядра в Дебиан

Сразу замечание: троеточие в названиях пакетов, файлов и т.д. заменяют версии, т.е. вместо троеточия предполагается версия с которой вы работаете.

Для сборки ядра нам понадобятся:
  • Собственно, исходники ядра: linux-source-...
  • Компилятор: gcc-...
  • Утилита make
  • Утилита сборки пакетов ядра: kernel-package
  • Всё, что утилита сборки еще попросит. :) В моем случае для сборки утилиты конфигурирования ядра понадобились libgtk2.0-dev, libglib2.0-dev и libpango1.0-dev
После установки всего этого в папке /usr/src появится архив linux-source-....tar.bz2 его нужно распаковать здесь же... Исходники ядра должны оказаться в папке /usr/src/linux-source-...

Далее открываем консоль в папке с исходниками ядра и для запуска программы конфигурации набираем в ней из-под рута:
  • для GTK-оболочки: make gconfig
  • для QT-оболочки: make xconfig
  • для консольной ncurces-оболочки: make menuconfig
Если программа сразу не собралась, то вниательно читаем сообщения и ставим пакеты, которые просят, не забывая при этом, что нужны нам пакеты с суффиксом -dev, т.к. программа конфигурации именно собирается, а не просто запускается.

После удачного запуска конфигуратора настраиваем систему. На этом этапе, если вы захотите что-то кардинально поменять, делайте это осторожно! Читайте комментарии к опциям, скорее всего, там есть внятное объяснение и если вы не знаете, что ответить, то в комментариях можно найти ответ по-умолчанию, подходящий в большинстве случаев. Не отключайте модули работы с типом файловой системы, в которую отформатирована корневая система... сами знаете к чему это приведет. Из общих настроек (General setup) можно выделить одну полезную опцию, которая при сборке пригодится: "Local version - append to kernel release" - она позволяет задать некоторый суффикс, добавляемый к версии ядра. Полезна будет эта опция, если вы захотите установить несколько ядер одинаковой версии, но собранных по-разному (например, официальное и собственноручно собранное). Лучше именно так и сделать, иначе можно с первого раза собрать ядро так, что система не загрузится вообще и чтобы попасть обратно в рабочую систему, придется изрядно попотеть. Поэтому впишите лучше сюда что-нибудь вроде tuned.

Далее настраиваем ядро по собственному вкусу и по потребностям. Тут углублюсь в решение насущных проблем и зафиксирую пару полезных (для меня) опций. Для работы встроенной в ноутбук камеры нужно включить:
Device Drivers
-Multimedia Devices
--Video Capture Adapters
---V4L USB Devices
----USB Video Class (UVC)
Для работы индикатора Wi-Fi (у меня карта Intel Corporation PRO/Wireless 3945ABG) нужно включить:
Device Drivers
-Network device support
--Wireless LAN
---Intel PRO/Wireless 3945ABG/BG Network Connection
----Enable LEDS features in iwl3945 driver
После настройки сохраняем конфиг и выходим из конфигуратора, попадаем снова в консоль.

Далее, опять-таки из-под рута, выполняем следующее:
make-kpkg --initrd linux_image
и наслаждаемся сборкой ядра. Приготовьтесь к довольно длительному ожиданию.

После сборки в каталоге выше (/usr/src) появится deb-пакет именуемый linux-image-....deb
Ставим его командой из-под рута:
dpkg -i linux-image-....deb
Перезагружаемся.

Если вы указали суффикс к версии ядра, то выбираем из списка соответствующее ядро и грузимся. Если же суффикс указан не был, то новое ядро просто заменит предыдущее.

Теперь можно пользоваться.
В следующих постах расскажу, как вместе с ядром собирать еще и драйвер видеокарт Nvidia, чтобы не переустанавливать его после каждой сборки ядра.