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,
igpu

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. igpu

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... igpu 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

igpu Ahora solo nos quedaría habilitarlo en la aplicación: igpu 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. igpu

Bibliografía