webentwicklung-frage-antwort-db.com.de

Beschränken Sie die Headless-CPU- und Speicherauslastung von Chrome

Ich verwende Selenium, um Chrome headless mit dem folgenden Befehl auszuführen:

system "LC_ALL=C google-chrome --headless --enable-logging --hide-scrollbars --remote-debugging-port=#{debug_port} --remote-debugging-address=0.0.0.0 --disable-gpu --no-sandbox --ignore-certificate-errors &"

Es scheint jedoch, dass Chrome Headless zu viel Arbeitsspeicher und CPU verbraucht. Weiß jemand, wie wir die CPU/Memory-Nutzung von Chrome Headless einschränken können? Oder wenn es eine Problemumgehung gibt. 

Danke im Voraus.

7
Ahmad Hijazi

Es gab eine Menge Diskussionen über die unvorhersehbaren CPU und Memory Consumption von Chrome Headless -Sitzungen. 

Gemäß der Diskussion Headless für minimale CPU-Auslastung + Speicherauslastung Die CPU + Speicherauslastung kann optimiert werden durch:

  • Mit einem benutzerdefinierten Proxy oder C++ ProtocolHandlers können Sie 1x1-Pixel-Stub-Bilder zurückgeben oder sogar vollständig blockieren. 
  • Chromium Team arbeitet an der Hinzufügung einer programmatischen Steuerung über, wenn Frames produziert werden. Derzeit versucht Headless Chrome immer noch, 60 fps zu rendern, was ziemlich verschwenderisch ist. Viele Seiten benötigen einige Frames (möglicherweise 10-20 fps), um ordnungsgemäß wiedergegeben zu werden (aufgrund der Verwendung von requestAnimationFrame und animation triggers), aber wir erwarten hier viel CPU-Einsparungen.
  • MemoryInfra sollte Ihnen helfen zu bestimmen, welche Komponente der größte Speicherplatz in Ihrem Setup ist.
  • Eine Verwendung kann sein:

    $ headless_Shell --remote-debugging-port=9222 --trace-startup=*,disabled-by-default-memory-infra http://www.chromium.org
    
  • Chrom wird immer so viele Ressourcen verwenden, wie ihm zur Verfügung stehen. Wenn Sie die Nutzung effektiv einschränken möchten, sollten Sie mit cgroups nachschauen.


Nachstehend sind einige der empfohlenen Vorgehensweisen für die Ausführung von Headless-Browsern in einer Produktionsumgebung aufgeführt:

 resource-usage

Abb: Volatile Ressourcennutzung von Headless Chrome

  • Kein Headless-Browser ausführen:

    Führen Sie unter allen Konten, wenn überhaupt möglich, keinen Browser ohne Heads aus. Headless-Browser sind unvorhersehbar und hungrig. Fast alles, was Sie mit einem Browser tun können (außer zum Interpolieren und Ausführen von JavaScript), können Sie mit einfachen Linux-Tools erledigen. Es gibt Bibliotheken, die elegante Node-APIs zum Abrufen von Daten über HTTP-Anforderungen und Scraping anbieten, wenn dies Ihr Endziel ist.

  • Führen Sie keinen headless-Browser aus, wenn Sie nicht brauchen:

    Es gibt Benutzer, die versuchen, den Browser offen zu halten, auch wenn sie nicht verwendet werden, sodass er immer für Verbindungen verfügbar ist. Diese Strategie ist zwar eine gute Strategie, um den Start der Sitzung zu beschleunigen, endet jedoch erst nach wenigen Stunden im Elend. Dies liegt vor allem daran, dass Browser Cache-Inhalte gern zwischenspeichern und langsam mehr Arbeitsspeicher benötigen. Wenn Sie den Browser nicht aktiv verwenden, schließen Sie ihn!

  • Parallelisieren mit Browsern, nicht mit Seiten:

    Wir sollten nur eine ausführen, wenn es absolut notwendig ist. Die nächste bewährte Methode besteht darin, nur eine Sitzung über jeden Browser auszuführen. Wenn Sie durch das Parallelisieren der Arbeit über die Seiten tatsächlich etwas Aufwand einsparen, kann dies bei einem Absturz einer Seite den gesamten Browser beeinträchtigen. Außerdem ist jede Seite nicht absolut sauber (Cookies und Speicher können durchschlagen).

  • page.waitForNavigation:

    Eines der am häufigsten beobachteten Probleme sind die Aktionen, die einen Seitenaufruf auslösen, und der plötzliche Verlust der Skriptausführung. Dies liegt daran, dass Aktionen, die pageload auslösen, häufig dazu führen, dass nachfolgende Arbeiten verschluckt werden. Um dieses Problem zu umgehen, müssen Sie im Allgemeinen die Page-Loading-Aktion aufrufen und sofort auf die nächste Seite warten.

  • Docker verwenden, um alles zu enthalten:

    Chrome benötigt viele Abhängigkeiten, um ordnungsgemäß ausgeführt zu werden. Auch nach allem, was abgeschlossen ist, gibt es Dinge wie Schriftarten und Phantom-Prozesse, um die Sie sich sorgen müssen. Daher ist es ideal, einen Container zu verwenden, der sie enthält. Docker ist für diese Aufgabe fast maßgeschneidert, da Sie die verfügbaren Ressourcen und die Sandbox beschränken können. Erstellen Sie selbst Ihre Dockerfile.

    Und um zu vermeiden, in Zombie-Prozesse zu geraten (was in Chrome üblich ist), sollten Sie etwas wie dumb-init verwenden, um das System ordnungsgemäß zu starten.

  • Zwei verschiedene Laufzeiten:

    Es können zwei JavaScript-Laufzeiten (Knoten und der Browser) aktiv sein. Dies ist für die Zwecke der gemeinsamen Nutzung von Vorteil, aber es geht um die Verwirrung, da für einige Seitenmethoden explizit Referenzen übergeben werden müssen (im Gegensatz zum Schließen oder Hochziehen).

    Bei der Verwendung von page.evaluate tief im Darm des Protokolls wird diese Funktion beispielsweise stringifies buchstäblich verwendet und an Chrome übergeben, sodass das Schließen und Heben überhaupt nicht möglich ist. Wenn Sie einige Referenzen oder Werte an einen Auswertungsaufruf übergeben müssen, hängen Sie sie einfach als Argumente an, die ordnungsgemäß verarbeitet werden.

Referenz: Beobachtungen bei 2 Millionen Sitzungen ohne Kopf

8
DebanjanB

Erwägen Sie, Docker zu verwenden. Es verfügt über gut dokumentierte Funktionen für die Verwendung von Systemressourcen wie Arbeitsspeicher und CPU. Die gute Nachricht ist, dass es ziemlich einfach ist, ein Docker-Image mit kopflosen Chromes (auf X11) zu erstellen.

Es gibt eine Vielzahl von Out-of-Box-Lösungen, schauen Sie sich das an: https://hub.docker.com/r/justinribeiro/chrome-headless/

0
Beastmaster