Force headless chromium/chrome to use actual gpu instead of Google SwiftShader
Asked Answered
M

1

14

I'm trying to print html to pdf using headless chromium (using puppeteer) and everything works fine except if html contains large png images (over 10.000x10.000px) the whole process of rendering page takes extremely long (up to half an hour, but if using non-headless mode it takes only about 10 seconds). After days of investigating and tweaking I came to conclusion that this must be issue with page compositing process.

Below are dumps from chrome://gpu page in headless and non-headless modes. Only significant difference i've noticed is that, when runing chrome headlessly, puppeteer appends by itself --disable-gpu-compositing and --allow-pre-commit-input which i believe are responsible for dramatic performace dropdown.

Also, in non-headless mode chrome sees 2 gpu units:

GPU0 VENDOR= 0x10de, DEVICE=0x1d01 *ACTIVE*
GPU1 VENDOR= 0x8086, DEVICE=0x1912

and in headless mode only one:

GPU0 VENDOR= 0xffff [Google Inc.], DEVICE=0xffff [Google SwiftShader] *ACTIVE*

which is CPU-based implementation of the Vulkan and OpenGL ES graphics APIs.

So basicaly my question is:

Is there any way to run headless chrome/chromium with puppeteer using actual gpu (especialy for gpu-compositing), or is there any way to print page to pdf in non-headless mode?

Here is my non-headless chrome gpu config (where page rendering is fast):

Canvas: Hardware accelerated
Flash: Hardware accelerated
Flash Stage3D: Hardware accelerated
Flash Stage3D Baseline profile: Hardware accelerated
Compositing: Hardware accelerated
Multiple Raster Threads: Force enabled
Out-of-process Rasterization: Hardware accelerated
OpenGL: Enabled
Hardware Protected Video Decode: Unavailable
Rasterization: Hardware accelerated on all pages
Skia Renderer: Enabled
Video Decode: Unavailable
Vulkan: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated

Chrome version: Chrome/83.0.4103.0
Operating system: Linux 4.13.0-46-generic
2D graphics backend: Skia/83 8ce842d38d0b32149e874d6855c91e8c68ba65a7

Command line:
/home/wojtas/projects/project-generator/node_modules/puppeteer/.local-
chromium/linux-756035/chrome-linux/chrome 
--disable-background-networking 
--enable-features=NetworkService,NetworkServiceInProcess 
--disable-background-timer-throttling 
--disable-backgrounding-occluded-windows 
--disable-breakpad 
--disable-client-side-phishing-detection 
--disable-component-extensions-with-background-pages 
--disable-default-apps 
--disable-dev-shm-usage 
--disable-extensions 
--disable-features=TranslateUI 
--disable-hang-monitor 
--disable-ipc-flooding-protection 
--disable-popup-blocking 
--disable-prompt-on-repost 
--disable-renderer-backgrounding 
--disable-sync 
--force-color-profile=srgb 
--metrics-recording-only 
--no-first-run
--enable-automation 
--password-store=basic 
--use-mock-keychain 
--disable-web-security 
--user-data-dir=/var/www/project-generator/var/chrome-user-data 
--allow-file-access-from-files 
--no-sandbox
--no-sandbox-and-elevated 
--no-zygote 
--enable-webgl 
--use-gl=desktop 
--use-skia-renderer 
--enable-gpu-rasterization 
--enable-zero-copy 
--disable-gpu-sandbox 
--enable-native-gpu-memory-buffers 
--disable-background-timer-throttling 
--disable-backgrounding-occluded-windows 
--disable-renderer-backgrounding 
--ignore-certificate-errors 
--enable-hardware-overlays 
--num-raster-threads=4 
--default-tile-width=512 
--default-tile-height=512 
--enable-oop-rasterization 
--remote-debugging-port=0 
--flag-switches-begin 
--flag-switches-end 
--enable-audio-service-sandbox 

And here is headless chrome gpu config (which is extemely slow)

 Graphics Feature Status
Canvas: Hardware accelerated
Flash: Hardware accelerated
Flash Stage3D: Hardware accelerated
Flash Stage3D Baseline profile: Hardware accelerated
Compositing: Software only. Hardware acceleration disabled
Multiple Raster Threads: Force enabled
Out-of-process Rasterization: Hardware accelerated
OpenGL: Enabled
Hardware Protected Video Decode: Unavailable
Rasterization: Hardware accelerated on all pages
Skia Renderer: Enabled
Video Decode: Unavailable
Vulkan: Disabled
WebGL: Hardware accelerated but at reduced performance
WebGL2: Hardware accelerated but at reduced performance

Chrome version: HeadlessChrome/83.0.4103.0
Operating system: Linux 4.13.0-46-generic
2D graphics backend: Skia/83 8ce842d38d0b32149e874d6855c91e8c68ba65a7

Command Line:
/home/wojtas/projects/project-generator/node_modules/puppeteer/.local-chromium/linux-756035/chrome-linux/chrome 
--disable-background-networking 
--enable-features=NetworkService,NetworkServiceInProcess 
--disable-background-timer-throttling 
--disable-backgrounding-occluded-windows 
--disable-breakpad 
--disable-client-side-phishing-detection 
--disable-component-extensions-with-background-pages 
--disable-default-apps 
--disable-dev-shm-usage 
--disable-extensions 
--disable-features=TranslateUI 
--disable-hang-monitor
--disable-ipc-flooding-protection 
--disable-popup-blocking 
--disable-prompt-on-repost 
--disable-renderer-backgrounding 
--disable-sync 
--force-color-profile=srgb
--metrics-recording-only 
--no-first-run 
--enable-automation 
--password-store=basic 
--use-mock-keychain 
--headless 
--hide-scrollbars 
--mute-audio 
--disable-web-security 
--user-data-dir=/var/www/project-generator/var/chrome-user-data 
--allow-file-access-from-files 
--no-sandbox 
--no-sandbox-and-elevated 
--no-zygote 
--enable-webgl 
--use-gl=desktop 
--use-skia-renderer 
--enable-gpu-rasterization 
--enable-zero-copy 
--disable-gpu-sandbox 
--enable-native-gpu-memory-buffers 
--disable-background-timer-throttling 
--disable-backgrounding-occluded-windows 
--disable-renderer-backgrounding 
--ignore-certificate-errors 
--enable-hardware-overlays 
--num-raster-threads=4 
--default-tile-width=512 
--default-tile-height=512
--enable-oop-rasterization 
--remote-debugging-port=0 
--disable-gpu-compositing 
--allow-pre-commit-input 

Even if i added --disable-webgl and --disable-webgl2 still VENDOR= 0xffff [Google Inc.], DEVICE=0xffff [Google SwiftShader] *ACTIVE* is being used.

Additionally:

Gpu compositing has been disabled, either via blacklist, about:flags or the command line. The browser will fall back to software compositing and hardware acceleration will be unavailable. Disabled Features: gpu_compositing WebGL has been disabled via blacklist or the command line. Disabled Features: webgl WebGL2 has been disabled via blacklist or the command line. Disabled Features: webgl2

notice appears on chrome://gpu page

Graphics Feature Status:

Canvas: Hardware accelerated
Flash: Hardware accelerated
Flash Stage3D: Hardware accelerated
Flash Stage3D Baseline profile: Hardware accelerated
Compositing: Software only. Hardware acceleration disabled
Multiple Raster Threads: Enabled
Out-of-process Rasterization: Disabled
OpenGL: Enabled
Hardware Protected Video Decode: Unavailable
Rasterization: Hardware accelerated on all pages
Skia Renderer: Enabled
Video Decode: Unavailable
Vulkan: Disabled
WebGL: Disabled
WebGL2: Disabled
Maltreat answered 25/6, 2020 at 12:15 Comment(4)
Did you find a proper solution for this issue?Elude
did you find out which config works best for you?Labrum
Please do share if you found a solution to this. Running into the same issue and have tried A LOT of permutations of flagsLes
Looking for a fix in 2023 as well.Porphyritic
P
4

Do you really need WebGL in headless mode?

If you remove this parameter...

--enable-webgl

...it should stop loading SwiftShader and stick to the GPU.

Papua answered 9/7, 2020 at 19:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.