Ограничить использование Chrome без головного процессора и памяти - PullRequest
0 голосов
/ 05 июня 2018

Я использую Селен для запуска Chrome без головы с помощью следующей команды:

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

Однако кажется, что Chrome Headless потребляет слишком много памяти и процессора, любой знает, как мы можем ограничить использование ЦП / памятихром без головы?Или если есть какое-то решение.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Было много дискуссий о непредсказуемых CPU и потреблении памяти при Chrome Headless .

Согласно обсуждению Построение без заголовка для минимального использования процессора + mem Использование ЦП + памяти может быть оптимизировано с помощью:

  • Использование либо собственного прокси, либо C ++ProtocolHandlers вы можете вернуть заглушки 1x1 пикселей изображения или даже полностью заблокировать их.
  • Chromium Team работает над добавлением программного управления над созданием кадров.В настоящее время безголовый хром все еще пытается рендерить на 60 кадров в секунду , что довольно расточительно.Многие страницы нуждаются в нескольких кадрах (возможно, 10-20 кадров в секунду ) для правильного рендеринга (из-за использования requestAnimationFrame и animation triggers), но мы ожидаем, что здесь будет много сбережений ЦП.
  • MemoryInfra должно помочь вам определить, какой компонент является наибольшим потребителем памяти в вашей настройке.
  • Использование может быть:

    $ headless_shell --remote-debugging-port=9222 --trace-startup=*,disabled-by-default-memory-infra http://www.chromium.org
    
  • Хром всегда будет использовать столько ресурсов, сколько ему доступно.Если вы хотите эффективно ограничить его использование, вы должны изучить использование cgroups


Сказав вышеупомянутые пункты, вот некоторые из наиболее распространенных лучших практикадаптировать при работе безголовых браузеров в производственной среде:

resource-usage

Рис.: Использование волатильных ресурсов Headless Chrome

  • Не запускать браузер без монитора :

    По всем учетным записям, если это вообще возможно, просто не запускать браузер без монитора.Безголовые браузеры непредсказуемы и голодны.Почти все, что вы можете сделать с помощью браузера (за исключением интерполяции и запуска JavaScript), можно сделать с помощью простых инструментов Linux.Существуют библиотеки, которые предлагают элегантные Node API для извлечения данных с помощью HTTP-запросов и очистки , если это ваша конечная цель.

  • Не запускайте безголовый браузер, если вам не нужно :

    Есть пользователи, которые пытаются держать браузер открытым, даже когда он не используется, чтобы он всегда был доступен для подключений.Хотя это может быть хорошей стратегией, помогающей ускорить запуск сеанса, через несколько часов это может закончиться страданиями.Во многом это связано с тем, что браузерам нравится кэшировать содержимое и медленно использовать больше памяти.В любое время, когда вы не используете браузер активно, закройте его!

  • Распараллеливайте с браузерами, а не со страницами :

    Мы должны запустить только одинкогда это абсолютно необходимо, следующая рекомендация - запускать только один сеанс через каждый браузер.Хотя вы действительно можете сэкономить некоторые накладные расходы путем распараллеливания работы через страницы, если одна страница падает, это может привести к выходу из строя всего браузера.Кроме того, не гарантируется, что каждая страница будет полностью чистой (файлы cookie и хранилище могут просочиться).

  • page.waitForNavigation:

    Одной из наиболее распространенных проблем являются действия, которые запускают загрузку страниц, и внезапная потеря исполнения ваших скриптов.Это связано с тем, что действия, запускающие pageload, часто могут привести к проглатыванию последующей работы.Чтобы обойти эту проблему, вам, как правило, придется вызывать действие загрузки страницы и немедленно ждать следующей загрузки страницы.

  • Используйте docker, чтобы вместить все это :

    Для правильной работы Chrome требуется много зависимостей.Даже после того, как все это завершено, есть такие вещи, как шрифты и фантомные процессы, о которых вам нужно беспокоиться, поэтому идеально использовать какой-то контейнер для его хранения.Docker почти специально создан для этой задачи, так как вы можете ограничить количество доступных ресурсов и поставить его в песочницу.Создайте свой собственный Dockerfile .

    И чтобы избежать запуска процессов зомби (которые обычно происходят в Chrome), вам нужно использовать что-то вроде dumb-initдля правильного запуска.

  • Два разных времени выполнения :

    Может быть два времени выполнения JavaScript (узел и браузер).Это отлично подходит для совместного использования, но это происходит за счет путаницы, так как некоторые методы страницы потребуют от вас явной передачи ссылок (вместо того, чтобы делать это с замыканиями или подъемом).

    Например, в то время какиспользуя page.evaluate глубоко в недрах протокола, это буквально stringifies функция и передает ее в Chrome, так что такие вещи, как замыкания и подъемы, вообще не будут работать.Если вам нужно передать некоторые ссылки или значения в вызов оценки, просто добавьте их в качестве аргументов, которые обрабатываются правильно.

Ссылка: Наблюдения, запускающие 2 миллиона сеансов без заголовка

0 голосов
/ 02 октября 2018

Рассмотрите возможность использования Docker.Он имеет хорошо документированные функции для порогового использования системных ресурсов, таких как память и процессор.Хорошей новостью является то, что довольно просто создать образ Docker с Chrome без головы (поверх X11) внутри него.

Существует множество готовых решений, посмотрите его: https://hub.docker.com/r/justinribeiro/chrome-headless/

...