Blog

Xvfb : guide pratique, et comment obtenir un vrai rendu GPU

xvfb-run en une ligne pour Playwright, Selenium et Puppeteer. Pourquoi Xvfb rend sur le CPU (llvmpipe) et comment faire utiliser le GPU à Chrome, mesures à l'appui.

Xvfb : guide pratique, et comment obtenir un vrai rendu GPU

Xvfb (X virtual framebuffer) est un serveur X qui dessine dans la mémoire au lieu d’un écran. C’est la façon classique de lancer un navigateur, une application graphique ou une suite de tests E2E sur un serveur Linux sans écran. Ce guide montre l’essentiel, puis la limite que la plupart des tutoriels oublient : Xvfb ne passe pas par le GPU.

Démarrer en une ligne

sudo apt install xvfb          # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
  • -a choisit automatiquement un numéro d’affichage libre (utile en CI parallèle) ;
  • -screen 0 1920x1080x24 fixe la résolution et la profondeur : les captures d’écran sont identiques d’une exécution à l’autre.

Pour garder un affichage ouvert en tâche de fond :

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

Le piège : Xvfb rend sur le CPU

Xvfb n’a pas d’accès au GPU. Toute application OpenGL lancée dessus est rendue par le CPU, avec le pilote logiciel llvmpipe de Mesa :

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

Pour Chrome et Chromium, c’est encore plus net. Sous Xvfb sans réglage, WebGL est tout simplement désactivé ; en mode --headless sans réglage, Chrome utilise SwiftShader, un GPU émulé sur le CPU. Sur un test WebGL 1080p, cela donne environ 13 images/s.

Faire utiliser le GPU à Chrome, avec ou sans Xvfb

Chrome sait faire son rendu directement sur le GPU via ANGLE, sans passer par le serveur X. Il suffit de lui demander :

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

Mesuré le 29/10/2026 sur un serveur Linux GPU (Intel UHD 770, 4 vCPU, Chromium 156, même shader WebGL 1080p) :

ConfigurationMoteur de rendu WebGLImages/s
--headless=new seulSwiftShader (CPU)13
Xvfb seulWebGL désactivé—
--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, comme ci-dessus

Environ 20 fois plus rapide, et le CPU reste libre pour vos tests. Les mêmes options fonctionnent sous Xvfb : utile si vous gardez Xvfb pour une extension ou une application qui exige un vrai affichage X.

Le détail (Playwright, Puppeteer, Selenium, Docker, vérification) est dans notre guide Lancer Chrome avec le GPU sur un serveur Linux.

Ai-je encore besoin de Xvfb ?

CasXvfb utile ?
Playwright / Puppeteer / Selenium récentsNon : --headless=new suffit
Extensions Chrome, tests en mode « headed »Oui
Applications X11 (Electron, Java Swing, outils anciens)Oui
OpenGL accéléré pour une appli non-navigateurNon : utilisez EGL sans affichage, ou VirtualGL

Questions fréquentes

Pourquoi mes captures WebGL sont-elles noires ou très lentes sous Xvfb ? Parce que Chrome désactive WebGL (ou passe sur SwiftShader) quand il ne trouve pas de GPU. Ajoutez --use-angle=vulkan --ignore-gpu-blocklist.

Peut-on avoir de l’OpenGL matériel sous Xvfb ? Pas directement : Xvfb ne sait pas utiliser le GPU. Les applications qui savent rendre via EGL (eglinfo -B -p surfaceless montre la carte) ou VirtualGL contournent le problème.

Est-ce reproductible en CI ? Oui : résolution et profondeur sont fixées par la commande, et le GPU donne le même rendu à chaque exécution.

Essayer sur un serveur Linux GPU

Nos serveurs ont un GPU Intel UHD 770 accessible dans la VM, avec Mesa, Vulkan et VAAPI déjà installés : installez Chromium (apt install chromium) et les commandes ci-dessus marchent tout de suite. À partir de 14,99 € HT/mois, accès root, IPv6 dédiée, option cluster k3s.