Blog

Chrome met de GPU op een Linux-server (headless, Playwright)

De juiste opties om Chrome/Chromium zonder scherm echt de GPU te laten gebruiken: ANGLE Vulkan of EGL, controle, Playwright, Puppeteer, Selenium en Docker.

Chrome met de GPU draaien op een Linux-server

Standaard gebruikt Chrome in headless-modus de GPU niet, ook niet als de server er een heeft. Het rendert WebGL met SwiftShader, een op de CPU geëmuleerde GPU: traag, en het bezet de cores die je tests nodig hebben. Twee opties zijn genoeg om dat te veranderen.

Getest op 29/10/2026 op een Linux GPU-server (Intel UHD 770, Debian 13, 4 vCPU) met Chromium 156, en Playwright 1.64 in Docker.

1. Vereisten

apt install chromium        # of google-chrome-stable: dezelfde opties
ls /dev/dri                 # moet renderD128 tonen

Als niet-root-gebruiker voeg je die toe aan de groep render, zodat hij de GPU kan openen: usermod -aG render,video mijngebruiker.

2. Het commando

chromium --headless=new \
  --use-angle=vulkan \
  --ignore-gpu-blocklist \
  https://example.com
  • --use-angle=vulkan: Chrome rendert via Vulkan op de GPU. Alternatief: --use-gl=angle --use-angle=gl-egl (OpenGL ES via EGL), even snel;
  • --ignore-gpu-blocklist: zonder scherm beschouwt Chrome de GPU vaak als “onbetrouwbaar” en valt het terug op de CPU. Deze optie voorkomt dat;
  • als root (gebruikelijk op een server of in Docker) voeg je --no-sandbox toe.

Deze opties werken ook onder Xvfb, als je tool een echt X-display nodig heeft (zie onze Xvfb-gids).

3. Controleren of de GPU gebruikt wordt

chrome://gpu is niet handig zonder scherm. Dit kleine bestand toont de WebGL-renderer:

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) : 'GEEN WEBGL');
</script>
EOF
chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist \
  --no-sandbox --dump-dom file:///tmp/gl.html

Verwacht resultaat: ANGLE (Intel, Vulkan … Intel(R) UHD Graphics 770 …). Zie je SwiftShader, dan wordt de GPU niet gebruikt.

4. De winst, gemeten

Dezelfde WebGL-pagina (fullscreen-shader in 1920×1080), beelden per seconde:

ConfiguratieRenderingBeelden/s
--headless=new (standaard)SwiftShader, CPU13
--use-angle=vulkanUHD 770~260
--use-gl=angle --use-angle=gl-eglUHD 770~230

Gemeten zonder framerate-limiet (--disable-gpu-vsync --disable-frame-rate-limit), 10 fullscreen-renders per frame, met het uitlezen van één pixel per frame om te garanderen dat het renderen echt heeft plaatsgevonden. Tijdens deze test bezet SwiftShader 3,9 van de 4 vCPU’s; de GPU 0,6 vCPU. Het script is openbaar: webgl-bench.html. Bij normaal gebruik houdt Chrome 60 beelden/s aan, wat de GPU moeiteloos haalt.

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

Veelvoorkomende valkuil: de officiële Playwright-image bevat de Intel Vulkan-driver niet. Zelfs met de juiste opties en /dev/dri gemount valt Chrome daar terug op SwiftShader (gecontroleerd met Playwright 1.64). Voeg de driver toe:

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

Geef daarna de GPU aan de container:

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

ANV_SPARSE=0 schakelt een Vulkan-functie (“sparse”) uit die met de Intel Mesa-driver in een VM GPU-blokkades veroorzaakt. Onze VM’s schakelen die al uit; een container heeft zijn eigen omgeving, dus je moet de variabele daar opnieuw meegeven.

Veelgestelde vragen

En die --disable-gpu die ik overal zie? Dat is het tegenovergestelde van wat je wilt: weghalen.

Heb ik --enable-features=Vulkan nodig? Nee, --use-angle=vulkan volstaat met recente versies van Chrome.

WebGPU? Valt buiten deze gids: de opties hierboven dekken WebGL, Canvas en de paginacompositie.

Probeer het

Linux GPU-servers hebben een Intel UHD 770-GPU in de VM, met Mesa en Vulkan al geïnstalleerd. Vanaf €14,99 excl. btw/mnd, root-toegang, eigen IPv6-adres, optioneel k3s-cluster om je tests te parallelliseren.