Blog

Xvfb: Praxisanleitung und echtes GPU-Rendering

xvfb-run in einer Zeile für Playwright, Selenium und Puppeteer. Warum Xvfb auf der CPU rendert (llvmpipe) und wie Chrome die GPU nutzt, mit Messwerten.

Xvfb: Praxisanleitung und wie Sie echtes GPU-Rendering erhalten

Xvfb (X virtual framebuffer) ist ein X-Server, der in den Arbeitsspeicher statt auf einen Bildschirm zeichnet. Das ist der klassische Weg, einen Browser, eine grafische Anwendung oder eine E2E-Testsuite auf einem Linux-Server ohne Bildschirm zu starten. Diese Anleitung zeigt das Wesentliche und danach die Grenze, die die meisten Tutorials vergessen: Xvfb nutzt die GPU nicht.

Start in einer Zeile

sudo apt install xvfb          # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
  • -a wählt automatisch eine freie Display-Nummer (nützlich bei paralleler CI);
  • -screen 0 1920x1080x24 legt Auflösung und Farbtiefe fest: Die Screenshots sind von Lauf zu Lauf identisch.

Um ein Display dauerhaft im Hintergrund offen zu halten:

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

Die Falle: Xvfb rendert auf der CPU

Xvfb hat keinen Zugriff auf die GPU. Jede OpenGL-Anwendung, die darauf läuft, wird von der CPU gerendert, mit dem Software-Treiber llvmpipe von Mesa:

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

Bei Chrome und Chromium ist es noch deutlicher. Unter Xvfb ohne weitere Einstellungen ist WebGL schlicht deaktiviert; im Modus --headless ohne weitere Einstellungen verwendet Chrome SwiftShader, eine auf der CPU emulierte GPU. Bei einem WebGL-Test in 1080p ergibt das etwa 13 Bilder/s.

Chrome die GPU nutzen lassen, mit oder ohne Xvfb

Chrome kann über ANGLE direkt auf der GPU rendern, ohne den X-Server zu nutzen. Man muss es nur verlangen:

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

Gemessen am 29.10.2026 auf einem Linux-GPU-Server (Intel UHD 770, 4 vCPU, Chromium 156, gleicher WebGL-Shader in 1080p):

KonfigurationWebGL-RendererBilder/s
nur --headless=newSwiftShader (CPU)13
nur XvfbWebGL deaktiviert—
--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, wie oben

Etwa 20-mal schneller, und die CPU bleibt frei für Ihre Tests. Dieselben Optionen funktionieren unter Xvfb: nützlich, wenn Sie Xvfb für eine Erweiterung oder eine Anwendung behalten, die ein echtes X-Display verlangt.

Die Details (Playwright, Puppeteer, Selenium, Docker, Überprüfung) finden Sie in unserer Anleitung Chrome mit GPU auf einem Linux-Server starten.

Brauche ich Xvfb noch?

AnwendungsfallXvfb sinnvoll?
Aktuelles Playwright / Puppeteer / SeleniumNein: --headless=new reicht
Chrome-Erweiterungen, Tests im „headed“-ModusJa
X11-Anwendungen (Electron, Java Swing, ältere Tools)Ja
Beschleunigtes OpenGL für eine Nicht-Browser-AnwendungNein: Verwenden Sie EGL ohne Display oder VirtualGL

Häufige Fragen

Warum sind meine WebGL-Screenshots unter Xvfb schwarz oder sehr langsam? Weil Chrome WebGL deaktiviert (oder auf SwiftShader ausweicht), wenn es keine GPU findet. Fügen Sie --use-angle=vulkan --ignore-gpu-blocklist hinzu.

Bekommt man Hardware-OpenGL unter Xvfb? Nicht direkt: Xvfb kann die GPU nicht nutzen. Anwendungen, die über EGL rendern können (eglinfo -B -p surfaceless zeigt die Karte), oder VirtualGL umgehen das Problem.

Ist das in der CI reproduzierbar? Ja: Auflösung und Farbtiefe werden durch den Befehl festgelegt, und die GPU liefert bei jedem Lauf dasselbe Rendering.

Auf einem Linux-GPU-Server ausprobieren

Unsere Server haben eine Intel-UHD-770-GPU, die in der VM verfügbar ist, mit bereits installiertem Mesa, Vulkan und VAAPI: Installieren Sie Chromium (apt install chromium), und die obigen Befehle funktionieren sofort. Ab 14,99 € netto/Monat, Root-Zugriff, dedizierte IPv6, optionaler k3s-Cluster.