OpenBSD: Настроить firefox для просмотра видео
Исходные данные:
$ 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 # обязательно последней строкой