Quería mirar si podía mejorar el rendimiento del servidor a la hora de usar jellyfin haciendo que fuera la gpu del procesador la que lleva el “encoding” de las isos, pero no ha mejorado mucho o casi nada debido a que es un procesador bastante malillo, pero sí os interesa y queréis hacerlo yo antes entraría en la web de Jellyfin que tienen una lista de las GPU y el rendimiento que se puede esperar de ellas.
Setup
Antes que nada haré un pequeño resumen del setup, tengo Jellyfin en docker dentro de un container lxc(Alma linux) en Proxmox 8.
Es importante decir que he usado Proxmox 8, ya que aunque debería servir para Proxmox 7, no sirve para el 6 o anterior debido a que usa cgroup y no cgroup2, Dejare un link en la bibliografía con la explicación del cgroup en anteriores versiones, aunque el procedimiento es muy parecido.
Preparación de Proxmox
Lo primero que haremos sera instalar las tools de intel intel-gpu-tools
directamente en proxmox para que una vez hecha toda la configuración podamos comprobar que se esta usando la gpu,
apt install intel-gpu-tools
Si ahora hacemos:
intel_gpu-top
Veremos que nos abre el uso de la GPU,
Configuraciones en host Proxmox
Seguidamente, crearemos un fichero de configuración en/etc/udev/rules.d
llamado reglas-igpu.rules
y añadiremos las siguientes lineas que son para que proxmox tenga los permisos necesarios para pasarle la GPU un container lxc,
cat > /etc/udev/rules.d/reglas-igpu.rules << 'EOF'
KERNEL=="renderD128", MODE="0666"
KERNEL=="card0", MODE="0666"
EOF
Haciendo pruebas he visto que lo importante es que el fichero tenga la extensión .rules
da igual como se llama el fichero, lo comento por si queréis cambiarle el nombre.
Una vez creado el fichero podemos reiniciar proxmox o se pueden ejecutar las siguientes lineas para recargar la configuración de las rules
,
udevadm control --reload-rules && udevadm trigger
Configuraciones del lxc
Una vez configurados los permisos de proxmox configuraremos el container lxc para que pueda usar la gpu, para eso iremos a /etc/pve/lxc/
y buscaremos el fichero id.conf
donde id es el id del container en proxmox, en mi caso el fichero es el /etc/pve/lxc/101.conf
y añadiremos las siguientes lineas al final del fichero,
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file 0, 0
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
Si queréis profundizar un poco más, dejo este post donde se profundiza un poco más, y además su configuración es con una GPU AMD que la configuración es un poco diferente,
Una vez hecho vamos al container lxc y lo reiniciamos, una vez reiniciado si revisamos el directorio /dev/dri/
veremos que ahora esta el card0
y el renderD128
que es la gpu.
Configuraciones docker
Este paso es básicamente seguir las instrucciones oficiales de Jellyfin.
Primero miramos el grupo render
:
getent group render | cut -d: -f3
Yo tengo el 998, ahora lo añadiremos al fichero docker-compose.yml
de jellyfin, con las siguientes lineas al final del fichero
group_add:
- "122"
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
He visto que hay sitios que también añaden el /dev/dri/card0
en devices
, pero haciendo pruebas no veo diferencia entre tenerla o no, por lo que lo he dejado solo la linea /dev/dri/renderD128
tal y como indica la documentación de jellyfin, reiniciamos el container/aplicación de jellyfin y ya debería funcionar.
Para comprobar que funciona podemos ejecutar:
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
Y veremos que nos indica que encuentra libva info: VA-API version 1.21.0
y vainfo: Driver version: intel iHD driver...
Para revisar el runtime
del OpenCL
:
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va
Ahora solo nos quedaría habilitarlo en la aplicación:
Y finalmente podremos comprobar su funcionamiento reproduciendo una ISO, mientras se este reproduciendo podemos ejecutar en el host de proxmox intel_gpu_top
y veremos que, efectivamente esta usando la GPU.