web-dev-qa-db-fra.com

Limitez l'utilisation du processeur et de la mémoire en chrome

J'utilise Selenium pour exécuter du chrome sans tête avec la commande suivante:

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 &"

Cependant, il semble que le chrome sans tête consomme trop de mémoire et de processeur, est-ce que tout le monde sait comment nous pouvons limiter l'utilisation du processeur/mémoire au chrome? Ou s'il y a une solution de contournement. 

Merci d'avance.

7
Ahmad Hijazi

Il y avait eu beaucoup de discussions autour des sessions imprévisibles CPU et Consommation de mémoire par Chrome Headless

Selon la discussion Bâtir sans tête pour une utilisation minimale de l'unité centrale + mémoire l'utilisation de l'UC + de la mémoire peut être optimisée comme suit:

  • En utilisant un proxy personnalisé ou des gestionnaires de protocole C++, vous pouvez renvoyer des images de pixel de stub 1x1 ou même les bloquer complètement. 
  • Chromium Team travaille sur l’ajout d’un contrôle programmatique sur lorsque les images sont produites. À l'heure actuelle, le chrome sans tête tente toujours de générer un rendu à 60 fps, ce qui est plutôt inutile. De nombreuses pages nécessitent quelques images (peut-être 10-20 fps) pour être restituées correctement (en raison de l'utilisation de requestAnimationFrame et animation triggers), mais nous nous attendons à de nombreuses économies de temps CPU ici.
  • MemoryInfra devrait vous aider à déterminer quel composant est le plus gros consommateur de mémoire de votre configuration.
  • Un usage peut être:

    $ headless_Shell --remote-debugging-port=9222 --trace-startup=*,disabled-by-default-memory-infra http://www.chromium.org
    
  • Le chrome utilisera toujours les ressources disponibles. Si vous voulez limiter efficacement son utilisation, vous devriez envisager d'utiliser cgroups


Ceci dit, voici quelques-unes des meilleures pratiques courantes à adapter lors de l’exécution de navigateurs sans tête dans un environnement de production:

 resource-usage

Fig: Utilisation volatile des ressources de Headless Chrome

  • _ {Ne lancez pas de navigateur sans tête:

    Si possible, ne lancez pas de navigateur sans tête. Les navigateurs sans tête sont imprévisibles et affamés. Presque tout ce que vous pouvez faire avec un navigateur (sauf pour l’interpolation et l’exécution de JavaScript) peut être fait avec de simples outils Linux. Certaines bibliothèques offrent des API de nœud élégantes pour récupérer des données via requêtes HTTP et scraping si tel est votre objectif final.

  • Ne lancez pas de navigateur sans tête quand vous n'en avez pas besoin:

    Certains utilisateurs essaient de garder le navigateur ouvert, même lorsqu'il n'est pas utilisé, afin qu'il soit toujours disponible pour les connexions. Bien que cela puisse être une bonne stratégie pour accélérer le lancement de session, il ne finira dans la misère qu'après quelques heures. Cela est principalement dû au fait que les navigateurs aiment mettre en cache des éléments et mangent lentement plus de mémoire. Lorsque vous n'utilisez pas activement le navigateur, fermez-le!

  • Parallèle avec les navigateurs, pas les pages:

    Nous ne devrions en exécuter qu’une lorsque cela est absolument nécessaire. La meilleure pratique consiste à n’exécuter qu’une session par navigateur. Bien que vous puissiez réellement économiser du temps en parallélisant le travail d'une page à l'autre, si une page tombe en panne, le navigateur tout entier peut en découler. De plus, chaque page n'est pas totalement propre (les cookies et le stockage risquent de déborder).

  • page.waitForNavigation:

    L'un des problèmes les plus fréquemment observés concerne les actions qui déclenchent un chargement de page et la perte soudaine de l'exécution de vos scripts. Cela est dû au fait que les actions qui déclenchent une pageload peuvent souvent provoquer l’ingestion de travaux ultérieurs. Afin de résoudre ce problème, vous devrez généralement invoquer l'action de chargement de page et attendre immédiatement le prochain chargement de page.

  • _ {Utilisez docker pour tout contenir}:

    Chrome nécessite de nombreuses dépendances pour fonctionner correctement. Même une fois que tout est terminé, vous devez vous soucier des polices et des processus fantômes. Il est donc idéal d'utiliser un conteneur pour le contenir. Docker est presque personnalisé pour cette tâche, car vous pouvez limiter la quantité de ressources disponibles et la mettre en sandbox. Créez vous-même votre Dockerfile.

    Et pour éviter de vous lancer dans des processus zombies (ce qui se produit généralement avec Chrome), vous souhaiterez utiliser quelque chose comme dumb-init pour bien démarrer.

  • Deux exécutions différentes:

    Il peut y avoir deux exécutions JavaScript en cours (nœud et navigateur). Cela convient parfaitement aux fins de partage, mais cela crée un risque de confusion, car certaines méthodes de page vous obligeront à indiquer explicitement les références (par opposition aux fermetures ou au levage).

    Par exemple, lorsque vous utilisez page.evaluate profondément dans les entrailles du protocole, cette fonction est littéralement stringifies et transmise à Chrome. Des opérations telles que les fermetures et le levage ne fonctionneront donc pas du tout. Si vous devez transmettre des références ou des valeurs à un appel d'évaluation, ajoutez-les simplement en tant qu'arguments correctement traités.

Référence: Observations sur 2 millions de sessions sans tête

8
DebanjanB

Pensez à utiliser Docker. Il possède des fonctionnalités bien documentées pour limiter l'utilisation des ressources système telles que la mémoire et les processeurs. La bonne nouvelle est qu'il est assez facile de construire une image Docker avec des Chromes sans tête (au-dessus de X11).

Il existe de nombreuses solutions originales à ce sujet, consultez-la: https://hub.docker.com/r/justinribeiro/chrome-headless/

0
Beastmaster