Ограничить использование Chrome без головного процессора и памяти
Я использую Селен для запуска 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 потребляет слишком много памяти и процессора, кто-нибудь знает, как мы можем ограничить использование CPU/Memory без Chrome Headless? Или если есть какое-то решение.
Заранее спасибо.
3 ответа
Вокруг 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
Сказав вышеупомянутые моменты, вот некоторые из наиболее распространенных рекомендаций по адаптации при работе безголовых браузеров в производственной среде:
Рис. Использование энергозависимых ресурсов в Headless Chrome
Не запускайте безголовый браузер:
По общему мнению, если это вообще возможно, просто не запускайте безголовый браузер. Безголовые браузеры непредсказуемы и голодны. Почти все, что вы можете сделать с помощью браузера (за исключением интерполяции и запуска JavaScript), можно сделать с помощью простых инструментов Linux. Существуют библиотеки, которые предлагают элегантные Node API для извлечения данных через HTTP-запросы и очистки, если это ваша конечная цель.
Не запускайте безголовый браузер, если вам не нужно:
Есть пользователи, которые пытаются держать браузер открытым, даже когда он не используется, чтобы он всегда был доступен для подключений. Хотя это может быть хорошей стратегией, чтобы помочь ускорить запуск сеанса, через несколько часов вы получите только страдания. Во многом это связано с тем, что браузерам нравится кэшировать содержимое и медленно использовать больше памяти. Каждый раз, когда вы не используете браузер, закройте его!
Распараллелить с браузерами, а не страницами:
Мы должны запускать только один, когда это абсолютно необходимо, следующая лучшая практика - запускать только один сеанс через каждый браузер. Хотя вы можете сэкономить некоторые накладные расходы путем распараллеливания работы между страницами, если одна страница падает, это может привести к выходу из строя всего браузера. Это, к тому же, не гарантирует, что каждая страница будет полностью чистой (файлы cookie и хранилище могут просочиться).
page.waitForNavigation
:Одной из наиболее часто встречающихся проблем являются действия, запускающие загрузку страниц, и внезапная потеря выполнения ваших скриптов. Это потому, что действия, которые вызывают
pageload
часто может стать причиной проглатывания последующей работы. Чтобы обойти эту проблему, вам, как правило, придется вызывать действие загрузки страницы и немедленно ждать следующей загрузки страницы.Используйте docker, чтобы содержать все это:
Для правильной работы Chrome требуется множество зависимостей. Даже после того, как все это завершено, есть такие вещи, как шрифты и фантомные процессы, о которых вам нужно беспокоиться, поэтому идеально использовать какой-то контейнер для его хранения. Docker почти специально создан для этой задачи, так как вы можете ограничить количество доступных ресурсов и поставить его в песочницу. Создайте свой собственный Dockerfile самостоятельно.
И чтобы избежать запуска процессов зомби (которые обычно происходят с Chrome), вы захотите использовать что-то вроде
dumb-init
чтобы правильно запустить.Два разных времени выполнения:
Может быть две среды выполнения JavaScript (Node и браузер). Это отлично подходит для совместного использования, но это происходит за счет путаницы, так как некоторые методы страницы потребуют от вас явной передачи ссылок (вместо того, чтобы делать это с замыканиями или подъемом).
В качестве примера при использовании
page.evaluate
глубоко в недрах протокола, это буквальноstringifies
функция и передает его в Chrome, поэтому такие вещи, как замыкания и подъемы, не будут работать вообще. Если вам нужно передать некоторые ссылки или значения в вызов оценки, просто добавьте их в качестве аргументов, которые обрабатываются правильно.
Подумайте об использовании Docker. Он имеет хорошо документированные функции для порогового использования системных ресурсов, таких как память и процессор. Хорошей новостью является то, что довольно просто создать изображение Docker с Chromes без головы (поверх X11) внутри.
Есть много готовых решений, проверьте это: https://hub.docker.com/r/justinribeiro/chrome-headless/
Я был в этой ситуации с Centos 7, selenium и google-chrome без головы. Остаточный процесс google-chrome был оставлен в памяти, и в течение нескольких часов было создано событие цепочки Out-Of-Memory. В конце концов, я решил эту проблему с помощью молоткового метода:
/ usr / bin / pkill хром
Каждый час. Через crontab. Восстановлена свободная память.