Blog

Xvfb: praktische gids, en hoe je echte GPU-rendering krijgt

xvfb-run in één regel voor Playwright, Selenium en Puppeteer. Waarom Xvfb op de CPU rendert (llvmpipe) en hoe je Chrome de GPU laat gebruiken, met metingen.

Xvfb: praktische gids, en hoe je echte GPU-rendering krijgt

Xvfb (X virtual framebuffer) is een X-server die in het geheugen tekent in plaats van op een scherm. Het is de klassieke manier om een browser, een grafische applicatie of een E2E-testsuite te draaien op een Linux-server zonder scherm. Deze gids laat de basis zien, en daarna de beperking die de meeste tutorials vergeten: Xvfb gebruikt de GPU niet.

Starten in één regel

sudo apt install xvfb          # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
  • -a kiest automatisch een vrij displaynummer (handig bij parallelle CI);
  • -screen 0 1920x1080x24 legt resolutie en kleurdiepte vast: je schermafbeeldingen zijn bij elke run identiek.

Om een display op de achtergrond open te houden:

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

De valkuil: Xvfb rendert op de CPU

Xvfb heeft geen toegang tot de GPU. Elke OpenGL-applicatie die je erop start, wordt door de CPU gerenderd, met de softwaredriver llvmpipe van Mesa:

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

Bij Chrome en Chromium is het nog duidelijker. Onder Xvfb zonder extra instellingen is WebGL gewoon uitgeschakeld; in --headless-modus zonder extra instellingen gebruikt Chrome SwiftShader, een op de CPU geëmuleerde GPU. Bij een WebGL-test in 1080p levert dat ongeveer 13 beelden/s op.

Chrome de GPU laten gebruiken, met of zonder Xvfb

Chrome kan via ANGLE rechtstreeks op de GPU renderen, zonder via de X-server te gaan. Je hoeft het alleen te vragen:

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

Gemeten op 29/10/2026 op een Linux GPU-server (Intel UHD 770, 4 vCPU, Chromium 156, dezelfde WebGL-shader in 1080p):

ConfiguratieWebGL-rendererBeelden/s
alleen --headless=newSwiftShader (CPU)13
alleen XvfbWebGL uitgeschakeld—
--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, zoals hierboven

Ongeveer 20 keer sneller, en de CPU blijft vrij voor je tests. Dezelfde opties werken ook onder Xvfb: handig als je Xvfb houdt voor een extensie of een applicatie die een echt X-display vereist.

De details (Playwright, Puppeteer, Selenium, Docker, controle) staan in onze gids Chrome met de GPU draaien op een Linux-server.

Heb ik Xvfb nog nodig?

SituatieXvfb nuttig?
Recente Playwright / Puppeteer / SeleniumNee: --headless=new volstaat
Chrome-extensies, tests in “headed”-modusJa
X11-applicaties (Electron, Java Swing, oudere tools)Ja
Versnelde OpenGL voor een niet-browserappNee: gebruik EGL zonder display, of VirtualGL

Veelgestelde vragen

Waarom zijn mijn WebGL-screenshots zwart of erg traag onder Xvfb? Omdat Chrome WebGL uitschakelt (of overschakelt op SwiftShader) als het geen GPU vindt. Voeg --use-angle=vulkan --ignore-gpu-blocklist toe.

Kan ik hardware-OpenGL krijgen onder Xvfb? Niet rechtstreeks: Xvfb kan de GPU niet gebruiken. Applicaties die via EGL kunnen renderen (eglinfo -B -p surfaceless toont de kaart) of VirtualGL omzeilen het probleem.

Is het reproduceerbaar in CI? Ja: resolutie en kleurdiepte worden door het commando vastgelegd, en de GPU levert bij elke run dezelfde rendering.

Probeer het op een Linux GPU-server

Onze servers hebben een Intel UHD 770-GPU die in de VM beschikbaar is, met Mesa, Vulkan en VAAPI al geïnstalleerd: installeer Chromium (apt install chromium) en bovenstaande commando’s werken meteen. Vanaf €14,99 excl. btw/mnd, root-toegang, eigen IPv6-adres, optioneel k3s-cluster.