Blog

Xvfb: guía práctica y cómo obtener renderizado GPU real

xvfb-run en una línea para Playwright, Selenium y Puppeteer. Por qué Xvfb renderiza en la CPU (llvmpipe) y cómo hacer que Chrome use la GPU, con mediciones.

Xvfb: guía práctica y cómo obtener renderizado GPU real

Xvfb (X virtual framebuffer) es un servidor X que dibuja en memoria en lugar de en una pantalla. Es la forma clásica de lanzar un navegador, una aplicación gráfica o una suite de pruebas E2E en un servidor Linux sin pantalla. Esta guía muestra lo esencial y después el límite que la mayoría de los tutoriales olvidan: Xvfb no usa la GPU.

Empezar en una línea

sudo apt install xvfb          # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
  • -a elige automáticamente un número de display libre (útil en CI en paralelo);
  • -screen 0 1920x1080x24 fija la resolución y la profundidad de color: las capturas de pantalla son idénticas de una ejecución a otra.

Para mantener un display abierto en segundo plano:

Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99

La trampa: Xvfb renderiza en la CPU

Xvfb no tiene acceso a la GPU. Cualquier aplicación OpenGL lanzada sobre él se renderiza en la CPU, con el driver por software llvmpipe de Mesa:

$ xvfb-run -a glxinfo -B | grep renderer
OpenGL renderer string: llvmpipe (LLVM 19.1.7, 256 bits)

Con Chrome y Chromium es todavía más claro. Bajo Xvfb sin ajustes, WebGL está directamente desactivado; en modo --headless sin ajustes, Chrome usa SwiftShader, una GPU emulada en la CPU. En una prueba WebGL a 1080p, eso da unas 13 imágenes/s.

Hacer que Chrome use la GPU, con o sin Xvfb

Chrome puede renderizar directamente en la GPU mediante ANGLE, sin pasar por el servidor X. Basta con pedírselo:

chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist ...

Medido el 29/10/2026 en un servidor Linux GPU (Intel UHD 770, 4 vCPU, Chromium 156, mismo shader WebGL a 1080p):

ConfiguraciónMotor de renderizado WebGLImágenes/s
--headless=new soloSwiftShader (CPU)13
Xvfb soloWebGL desactivado—
--headless=new --use-angle=vulkanUHD 770 (Vulkan)~260
--headless=new --use-angle=gl-eglUHD 770 (OpenGL ES 3.2)~230
Xvfb + --use-angle=vulkanUHD 770 (Vulkan)GPU, como arriba

Unas 20 veces más rápido, y la CPU queda libre para tus pruebas. Las mismas opciones funcionan bajo Xvfb: útil si mantienes Xvfb para una extensión o una aplicación que exige un display X real.

Los detalles (Playwright, Puppeteer, Selenium, Docker, verificación) están en nuestra guía Ejecutar Chrome con GPU en un servidor Linux.

¿Sigo necesitando Xvfb?

Caso¿Xvfb útil?
Playwright / Puppeteer / Selenium recientesNo: --headless=new basta
Extensiones de Chrome, pruebas en modo «headed»Sí
Aplicaciones X11 (Electron, Java Swing, herramientas antiguas)Sí
OpenGL acelerado para una aplicación que no es un navegadorNo: usa EGL sin display, o VirtualGL

Preguntas frecuentes

¿Por qué mis capturas WebGL salen negras o van muy lentas bajo Xvfb? Porque Chrome desactiva WebGL (o pasa a SwiftShader) cuando no encuentra GPU. Añade --use-angle=vulkan --ignore-gpu-blocklist.

¿Se puede tener OpenGL por hardware bajo Xvfb? No directamente: Xvfb no sabe usar la GPU. Las aplicaciones que pueden renderizar mediante EGL (eglinfo -B -p surfaceless muestra la tarjeta) o VirtualGL esquivan el problema.

¿Es reproducible en CI? Sí: la resolución y la profundidad las fija el comando, y la GPU da el mismo renderizado en cada ejecución.

Probar en un servidor Linux GPU

Nuestros servidores tienen una GPU Intel UHD 770 accesible dentro de la VM, con Mesa, Vulkan y VAAPI ya instalados: instala Chromium (apt install chromium) y los comandos anteriores funcionan de inmediato. Desde 14,99 €/mes sin IVA, acceso root, IPv6 dedicada, opción clúster k3s.