Blog

Lancer Chrome avec le GPU sur un serveur Linux (headless, Playwright, Puppeteer)

Les bonnes options pour que Chrome/Chromium utilise vraiment le GPU sans écran : ANGLE Vulkan ou EGL, vérification, Playwright, Puppeteer, Selenium et Docker. Testé : 20× plus rapide que SwiftShader.

Lancer Chrome avec le GPU sur un serveur Linux

Par défaut, Chrome en mode headless n’utilise pas le GPU, même quand le serveur en a un. Il rend WebGL avec SwiftShader, un GPU émulé sur le CPU : lent, et il occupe les cœurs dont vos tests ont besoin. Deux options suffisent pour changer ça.

Testé le 29/10/2026 sur un serveur Linux GPU (Intel UHD 770, Debian 13, 4 vCPU) avec Chromium 156, et Playwright 1.64 dans Docker.

1. Prérequis

apt install chromium        # ou google-chrome-stable : mêmes options
ls /dev/dri                 # doit montrer renderD128

En utilisateur non-root, ajoutez-le au groupe render pour qu’il puisse ouvrir le GPU : usermod -aG render,video monutilisateur.

2. La commande

chromium --headless=new \
  --use-angle=vulkan \
  --ignore-gpu-blocklist \
  https://exemple.com
  • --use-angle=vulkan : Chrome rend via Vulkan sur le GPU. Alternative : --use-gl=angle --use-angle=gl-egl (OpenGL ES via EGL), aussi rapide ;
  • --ignore-gpu-blocklist : sans écran, Chrome considère souvent le GPU comme « non fiable » et se replie sur le CPU. Cette option l’en empêche ;
  • en root (cas courant sur un serveur ou dans Docker), ajoutez --no-sandbox.

Ces options fonctionnent aussi sous Xvfb, si votre outil a besoin d’un vrai affichage X (voir notre guide Xvfb).

3. Vérifier que le GPU est utilisé

chrome://gpu n’est pas pratique sans écran. Ce petit fichier affiche le moteur de rendu 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) : 'PAS DE WEBGL');
</script>
EOF
chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist \
  --no-sandbox --dump-dom file:///tmp/gl.html

Résultat attendu : ANGLE (Intel, Vulkan … Intel(R) UHD Graphics 770 …). Si vous voyez SwiftShader, le GPU n’est pas utilisé.

4. Le gain, mesuré

Même page WebGL (shader plein écran en 1920×1080), images par seconde :

ConfigurationRenduImages/s
--headless=new (défaut)SwiftShader, CPU13
--use-angle=vulkanUHD 770~260
--use-gl=angle --use-angle=gl-eglUHD 770~230

Mesure faite sans limite de fréquence d’images (--disable-gpu-vsync --disable-frame-rate-limit), 10 rendus plein écran par frame, lecture d’un pixel à chaque frame pour garantir que le rendu a vraiment eu lieu. Pendant ce test, SwiftShader occupe 3,9 vCPU sur 4 ; le GPU, 0,6 vCPU. Le script est public : webgl-bench.html. En usage normal, Chrome se cale sur 60 images/s, que le GPU tient sans effort.

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. Dans Docker

Piège fréquent : l’image officielle Playwright ne contient pas le pilote Vulkan Intel. Même avec les bonnes options et /dev/dri monté, Chrome y retombe sur SwiftShader (vérifié avec Playwright 1.64). Ajoutez le pilote :

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/*

Puis donnez le GPU au conteneur :

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

ANV_SPARSE=0 désactive une fonction Vulkan (« sparse ») qui provoque des blocages GPU avec le pilote Mesa Intel dans une VM. Nos VM la désactivent déjà ; un conteneur a son propre environnement, il faut donc la repasser.

Questions fréquentes

Et --disable-gpu que je vois partout ? C’est l’inverse de ce que vous voulez : à retirer.

Faut-il --enable-features=Vulkan ? Non, --use-angle=vulkan suffit avec les versions récentes de Chrome.

WebGPU ? Hors du périmètre de ce guide : les options ci-dessus couvrent WebGL, Canvas et la composition de page.

Essayer

Les serveurs Linux GPU ont un GPU Intel UHD 770 dans la VM, avec Mesa et Vulkan déjà installés. À partir de 14,99 € HT/mois, accès root, IPv6 dédiée, option cluster k3s pour paralléliser vos tests.