Blog

Chrome com GPU num servidor Linux (headless, Playwright)

As opções certas para o Chrome/Chromium usar mesmo a GPU sem ecrã: ANGLE Vulkan ou EGL, Playwright, Puppeteer, Selenium e Docker. 20× mais rápido que SwiftShader.

Lançar o Chrome com GPU num servidor Linux

Por omissão, o Chrome em modo headless não usa a GPU, mesmo quando o servidor tem uma. Renderiza o WebGL com o SwiftShader, uma GPU emulada na CPU: lento, e ocupa os núcleos de que os seus testes precisam. Bastam duas opções para mudar isso.

Testado a 29/10/2026 num servidor Linux GPU (Intel UHD 770, Debian 13, 4 vCPU) com Chromium 156, e Playwright 1.64 em Docker.

1. Pré-requisitos

apt install chromium        # ou google-chrome-stable: mesmas opções
ls /dev/dri                 # deve mostrar renderD128

Com um utilizador não-root, adicione-o ao grupo render para que possa abrir a GPU: usermod -aG render,video meuutilizador.

2. O comando

chromium --headless=new \
  --use-angle=vulkan \
  --ignore-gpu-blocklist \
  https://example.com
  • --use-angle=vulkan: o Chrome renderiza via Vulkan na GPU. Alternativa: --use-gl=angle --use-angle=gl-egl (OpenGL ES via EGL), igualmente rápida;
  • --ignore-gpu-blocklist: sem ecrã, o Chrome considera muitas vezes a GPU «pouco fiável» e recua para a CPU. Esta opção impede-o;
  • como root (caso comum num servidor ou em Docker), acrescente --no-sandbox.

Estas opções também funcionam sob Xvfb, se a sua ferramenta precisar de um display X real (veja o nosso guia Xvfb).

3. Verificar que a GPU está a ser usada

O chrome://gpu não é prático sem ecrã. Este pequeno ficheiro mostra o motor de renderização WebGL:

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

Resultado esperado: ANGLE (Intel, Vulkan … Intel(R) UHD Graphics 770 …). Se vir SwiftShader, a GPU não está a ser usada.

4. O ganho, medido

Mesma página WebGL (shader em ecrã inteiro a 1920×1080), imagens por segundo:

ConfiguraçãoRenderizaçãoImagens/s
--headless=new (por omissão)SwiftShader, CPU13
--use-angle=vulkanUHD 770~260
--use-gl=angle --use-angle=gl-eglUHD 770~230

Medição feita sem limite de taxa de imagens (--disable-gpu-vsync --disable-frame-rate-limit), 10 renderizações em ecrã inteiro por frame, leitura de um píxel a cada frame para garantir que a renderização aconteceu mesmo. Durante este teste, o SwiftShader ocupa 3,9 vCPU de 4; a GPU, 0,6 vCPU. O script é público: webgl-bench.html. Em uso normal, o Chrome fixa-se nas 60 imagens/s, que a GPU aguenta sem esforço.

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

Armadilha frequente: a imagem oficial do Playwright não contém o driver Vulkan da Intel. Mesmo com as opções certas e /dev/dri montado, o Chrome volta a cair no SwiftShader (verificado com Playwright 1.64). Acrescente o driver:

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

Depois dê a GPU ao contentor:

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

ANV_SPARSE=0 desativa uma funcionalidade Vulkan («sparse») que provoca bloqueios da GPU com o driver Mesa da Intel numa VM. As nossas VM já a desativam; um contentor tem o seu próprio ambiente, por isso é preciso voltar a passá-la.

Perguntas frequentes

E o --disable-gpu que vejo em todo o lado? É o contrário do que quer: retire-o.

É preciso --enable-features=Vulkan? Não, --use-angle=vulkan basta com as versões recentes do Chrome.

WebGPU? Fora do âmbito deste guia: as opções acima cobrem WebGL, Canvas e a composição da página.

Experimentar

Os servidores Linux GPU têm uma GPU Intel UHD 770 na VM, com Mesa e Vulkan já instalados. A partir de 14,99 € s/ IVA/mês, acesso root, IPv6 dedicado, opção cluster k3s para paralelizar os seus testes.