Blog

Ejecutar Chrome con GPU en un servidor Linux (headless, Playwright, Puppeteer)

Las opciones correctas para que Chrome/Chromium use de verdad la GPU sin pantalla: ANGLE Vulkan o EGL, verificación, Playwright, Puppeteer, Selenium y Docker.

Ejecutar Chrome con GPU en un servidor Linux

Por defecto, Chrome en modo headless no usa la GPU, aunque el servidor tenga una. Renderiza WebGL con SwiftShader, una GPU emulada en la CPU: lento, y además ocupa los núcleos que necesitan tus pruebas. Bastan dos opciones para cambiarlo.

Probado el 29/10/2026 en un servidor Linux GPU (Intel UHD 770, Debian 13, 4 vCPU) con Chromium 156, y Playwright 1.64 en Docker.

1. Requisitos previos

apt install chromium        # o google-chrome-stable: mismas opciones
ls /dev/dri                 # debe mostrar renderD128

Si usas un usuario que no es root, añádelo al grupo render para que pueda abrir la GPU: usermod -aG render,video miusuario.

2. El comando

chromium --headless=new \
  --use-angle=vulkan \
  --ignore-gpu-blocklist \
  https://example.com
  • --use-angle=vulkan: Chrome renderiza mediante Vulkan en la GPU. Alternativa: --use-gl=angle --use-angle=gl-egl (OpenGL ES mediante EGL), igual de rápida;
  • --ignore-gpu-blocklist: sin pantalla, Chrome suele considerar la GPU «poco fiable» y recurre a la CPU. Esta opción lo impide;
  • como root (lo habitual en un servidor o en Docker), añade --no-sandbox.

Estas opciones también funcionan bajo Xvfb, si tu herramienta necesita un display X real (consulta nuestra guía de Xvfb).

3. Comprobar que se usa la GPU

chrome://gpu no es práctico sin pantalla. Este pequeño archivo muestra el motor de renderizado WebGL:

cat > /tmp/gl.html <<'EOF'
<script>
const g = document.createElement('canvas').getContext('webgl2');
const e = g && g.getExtension('WEBGL_debug_renderer_info');
document.write(g ? g.getParameter(e.UNMASKED_RENDERER_WEBGL) : 'SIN WEBGL');
</script>
EOF
chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist \
  --no-sandbox --dump-dom file:///tmp/gl.html

Resultado esperado: ANGLE (Intel, Vulkan … Intel(R) UHD Graphics 770 …). Si ves SwiftShader, la GPU no se está usando.

4. La ganancia, medida

Misma página WebGL (shader a pantalla completa en 1920×1080), imágenes por segundo:

ConfiguraciónRenderizadoImágenes/s
--headless=new (por defecto)SwiftShader, CPU13
--use-angle=vulkanUHD 770~260
--use-gl=angle --use-angle=gl-eglUHD 770~230

Medición hecha sin límite de frecuencia de imagen (--disable-gpu-vsync --disable-frame-rate-limit), 10 renderizados a pantalla completa por frame, lectura de un píxel en cada frame para garantizar que el renderizado se ha hecho de verdad. Durante esta prueba, SwiftShader ocupa 3,9 vCPU de 4; la GPU, 0,6 vCPU. El script es público: webgl-bench.html. En uso normal, Chrome se ajusta a 60 imágenes/s, que la GPU mantiene sin esfuerzo.

5. Playwright

// playwright.config.ts
export default defineConfig({
  use: {
    launchOptions: {
      args: ['--use-angle=vulkan', '--ignore-gpu-blocklist'],
    },
  },
});

6. Puppeteer

const browser = await puppeteer.launch({
  headless: true,
  args: ['--use-angle=vulkan', '--ignore-gpu-blocklist', '--no-sandbox'],
});

7. Selenium (Python)

from selenium import webdriver
o = webdriver.ChromeOptions()
for a in ['--headless=new', '--use-angle=vulkan',
          '--ignore-gpu-blocklist', '--no-sandbox']:
    o.add_argument(a)
driver = webdriver.Chrome(options=o)

8. En Docker

Trampa habitual: la imagen oficial de Playwright no incluye el driver Vulkan de Intel. Incluso con las opciones correctas y /dev/dri montado, Chrome vuelve a SwiftShader (comprobado con Playwright 1.64). Añade el driver:

FROM mcr.microsoft.com/playwright:v1.64.1-noble
RUN apt-get update && apt-get install -y mesa-vulkan-drivers \
 && rm -rf /var/lib/apt/lists/*

Después dale la GPU al contenedor:

docker run --device /dev/dri \
  --group-add "$(stat -c %g /dev/dri/renderD128)" \
  -e ANV_SPARSE=0 \
  mi-imagen-playwright npx playwright test

ANV_SPARSE=0 desactiva una función de Vulkan («sparse») que provoca bloqueos de la GPU con el driver Mesa de Intel dentro de una VM. Nuestras VM ya la desactivan; un contenedor tiene su propio entorno, así que hay que volver a pasarla.

Preguntas frecuentes

¿Y el --disable-gpu que veo por todas partes? Es justo lo contrario de lo que quieres: quítalo.

¿Hace falta --enable-features=Vulkan? No, --use-angle=vulkan basta con las versiones recientes de Chrome.

¿WebGPU? Queda fuera del alcance de esta guía: las opciones anteriores cubren WebGL, Canvas y la composición de la página.

Probar

Los servidores Linux GPU tienen una GPU Intel UHD 770 dentro de la VM, con Mesa y Vulkan ya instalados. Desde 14,99 €/mes sin IVA, acceso root, IPv6 dedicada, opción clúster k3s para paralelizar tus pruebas.