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
-akiest automatisch een vrij displaynummer (handig bij parallelle CI);-screen 0 1920x1080x24legt 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):
| Configuratie | WebGL-renderer | Beelden/s |
|---|---|---|
alleen --headless=new | SwiftShader (CPU) | 13 |
| alleen Xvfb | WebGL uitgeschakeld | — |
--headless=new --use-angle=vulkan | UHD 770 (Vulkan) | ~260 |
--headless=new --use-angle=gl-egl | UHD 770 (OpenGL ES 3.2) | ~230 |
Xvfb + --use-angle=vulkan | UHD 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?
| Situatie | Xvfb nuttig? |
|---|---|
| Recente Playwright / Puppeteer / Selenium | Nee: --headless=new volstaat |
| Chrome-extensies, tests in “headed”-modus | Ja |
| X11-applicaties (Electron, Java Swing, oudere tools) | Ja |
| Versnelde OpenGL voor een niet-browserapp | Nee: 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.