OpenBSD: Настроить firefox для просмотра видео

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Исходные данные:

$ uname -a
OpenBSD XXX.my.domain 8.0 GENERIC.MP#22 amd64

Интернет просмоторщик: Firefox_155.0.1
Оконный менеджер: IceWM_4.1.0

1. Проверяем, что пользователь состоит в логин-классе: staff

 $ id -c имя_пользователя

т.к. для этого класса меньше всего действует ограничений. Если нет, то добавляем:

 # usermod -L staff имя_пользователя

По умолчанию лимиты класса staff сильно ограничены. И чтобы таким тяжёловесным программам как Firefox хватало ресурсов необходимо эти лимиты увеличить.
2. Для этого меняем конфигурацию для класса staff в файле: /etc/login.conf

 staff:\
 :datasize-cur=8192M:\     # Лимит на ОЗУ, но не максимально доступная
 :datasize-max=infinity:\  # например: 8 GiB из 32 GiB
 :maxproc-max=1024:\       # Количество
 :maxproc-cur=512:\        # процессов
 :openfiles-cur=4096:\     # Количество одновременно
 :openfiles-max=8192:\     # открытых файлов
 :ignorenologin:\
 :requirehome@:\
 :tc=default:

OpenBSD считывает лимиты классов не из текстового файла /etc/login.conf, а из его бинарного хэш-образа /etc/login.conf.db. После любого редактирования этого файла обязательно нужно обновить базу данных специальной командой:

# cap_mkdb /etc/login.conf

Проверяем, что лимиты изменились:

 $ ulimit -a
 time(cpu-seconds)    unlimited
 file(blocks)         unlimited
 coredump(blocks)     unlimited
 data(kbytes)         8388608
 stack(kbytes)        8192
 lockedmem(kbytes)    87381
 memory(kbytes)       32352540
 nofiles(descriptors) 4096
 processes            512        

Важное замечание:
В OpenBSD значение maxproc-cur из login.conf не может превышать системный лимит ядра для одного пользователя. По умолчанию этот лимит часто равен именно 256. Современному Firefox этого может быть не достаточно.
Современные браузеры, а также графический движок WebRender, создают множество изолированных процессов для вкладок и декодирования. Им необходимо постоянно обмениваться огромными массивами графических данных на максимальной скорости. Для этого они используют общие участки оперативной памяти (Shared Memory segments). По умолчанию в OpenBSD лимиты разделяемой памяти очень консервативны (около 32 МБ), чего критически мало для отрисовки "тяжёлых" сайтов вроде YouTube или карт.

3. Увеличиваем лимиты через соответствующие строки в файле: /etc/sysctl.conf

kern.shminfo.shmall=524288      # Задаёт максимальный объём разделяемой памяти для всей системы, в страницах памяти
kern.shminfo.shmmax=2147483647  # Задаёт максимальный размер одного сегмента разделяемой памяти, в байтах
kern.maxproc=2048               # увеличивает общее максимальное число процессов во всей системе
kern.maxprocperuid=1024         # поднимает планку для одного конкретного пользователя до 1024. Это позволит вашему правилу maxproc-cur=512 из login.conf сработать.

4. Настраиваем видео карту. Для начала узнаём её модель:

$ glxinfo | grep "Device"
Device: AMD Radeon RX 550 / 550 Series (radeonsi, polaris12, ACO, DRM 3.64, 8.0)

Создаём файл: /etc/X11/xorg.conf.d/20-amdgpu.conf (/etc/X11/xorg.conf.d/20-intel.conf) с конфигурацией:

Section "Device"
Identifier	"AMD Radeon RX 550"           # "Intel Graphics"
Driver		"amdgpu"                      # "intel"
Option		"TearFree" "true"             # устранения разрывов изображения (тиринга)
Option		"VariableRefresh" "off"       # исключает микрофризы, моргание подсветки или чёрные экраны при переходе в полноэкранный режим
Option		"AsyncFlipSecondaries" "true" # снижает задержки и нагрузку при выводе графики на несколько экранов
EndSection

5. Проверяем какое аппаратное декодирование поддерживает наша видео карта. Устанавливаем пакет:

# pkg_add libva-utils
$ vainfo
Trying display: x11
libva info: VA-API version 1.23.0
libva info: Trying to open /usr/X11R6/lib/modules/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_23
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.23 (libva 2.23.0)
vainfo: Driver version: Mesa Gallium driver 25.0.7 for AMD Radeon RX 550 / 550 Series  (radeonsi, polaris12, ACO, DRM 3.64, 8.0)
vainfo: Supported profile and entrypoints
     VAProfileMPEG2Simple            :	VAEntrypointVLD
     VAProfileMPEG2Main              :	VAEntrypointVLD
     VAProfileVC1Simple              :	VAEntrypointVLD
     VAProfileVC1Main                :	VAEntrypointVLD
     VAProfileVC1Advanced            :	VAEntrypointVLD
     VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
     VAProfileH264ConstrainedBaseline:	VAEntrypointEncSlice
     VAProfileH264Main               :	VAEntrypointVLD
     VAProfileH264Main               :	VAEntrypointEncSlice
     VAProfileH264High               :	VAEntrypointVLD
     VAProfileH264High               :	VAEntrypointEncSlice
     VAProfileHEVCMain               :	VAEntrypointVLD
     VAProfileHEVCMain               :	VAEntrypointEncSlice
     VAProfileHEVCMain10             :	VAEntrypointVLD
     VAProfileJPEGBaseline           :	VAEntrypointVLD
     VAProfileNone                   :	VAEntrypointVideoProc

Как видим наша карта не поддерживает ни одного современного декодирования таких как VP8, VP9, AV1, используемых Youtube для трансляции видео. В связи с чем будем настраивать декодирование через H264. Устанавливаем кодеки:

# pkg_add ffmpeg

Для Firefox устанавливаем дополнение: enhanced-h264ify

Блокируем воспроизведение: VP8, VP9, AV1.

Принудительно переводим Firefox на графический бэкенд EGL. Через about:config изменяем в true:

gfx.x11-egl.force-enabled 

По умолчанию Firefox автоматически подбирает частоту обновления кадров т.е. синхронизируется с аппаратной вертикальной синхронизацией (Vsync) вашего монитора.
Что бы не было путаницы выставляем принудительно в 60 через:

layout.frame_rate

6. Настроим рендеринг и сглаживание шрифтов.
Если используются оконные менеджеры без встроенного композитора, типа IceWM, то необходимые настройки нужно сделать в ~/.Xresources, т.к обращение происходит к базе данных ресурсов xrdb напрямую.
Добавляем строки в файл ~/.Xresources

Xft.antialias: 1
Xft.autohint: 0
Xft.hinting: 1
Xft.hintstyle: hintslight
Xft.rgba: rgb
Xft.lcdfilter: lcddefault

7. Подготавливаем окружение перед запуском оконного менеджера.
Добавляем переменные Firefox в ~/.xsession:

xrdb -merge "$HOME/.Xresources"   # загружаем настройки из ~/.Xresources
export MOZ_DISABLE_RDD_SANDBOX=1  # отключает песочницу для включения аппаратного ускорения декодирования видео.
export MOZ_USE_XINPUT2=1          # XInput2 протокол ввода. Отвечает за плавность пролистывания в Firefox
...........................       # другие важные настройки

exec icewm-session                # обязательно последней строкой