Селен автономно в докере сочиняет - убит ОС? - PullRequest
2 голосов
/ 22 июня 2019

Я запускаю приложение, используя docker-compose. Один из контейнеров - это изображение selenium/standalone-chrome. Я даю это shm_size 2g.

Приложение отлично работает, когда нет высокой нагрузки. Тем не менее, я заметил, что всякий раз, когда есть параллельные запросы к контейнеру селена (9 одновременных запросов на 8-ядерном компьютере), Selenium молча завершается неудачей. Он просто умирает и остается мертвым. Последующий запрос не обрабатывается. В логах ничего нет. Последнее сообщение:

17:41:00.083 INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session 5da2cd57f4e8e4f80b907564d7352051 (org.openqa.selenium.chrome.ChromeDriverService)

Я наблюдаю за использованием ОЗУ и ЦП, используя docker stats и top. Рам хорошо .. около 50% используется. Использование free -m показывает общую память на 500м. 8 ядер принимают нагрузку, оставаясь на уровне 80% большую часть времени. Однако всякий раз, когда поступает последний запрос - процессы просто вымирают. Использование процессора падает. Общая память, похоже, не освобождается.

Чтобы он снова заработал, мне нужно перезапустить приложение. В противном случае ни один из последующих запросов не будет получен или зарегистрирован.

Я подозреваю, что может быть какое-то ограничение со стороны ОС на контейнерах, и как только они начнут потреблять ресурсы, ОС убивает их, но, честно говоря, я понятия не имею, что происходит.

Любая помощь будет принята с благодарностью.

Спасибо!

Обновление:

Вот мой справочник по созданию докеров

  selenium-chrome:
    image: selenium/standalone-chrome
    privileged: true
    shm_size: 2g
    expose:
      - "4444"

Вот как выглядят мои логи при зависании: enter image description here

И после того, как я убью процесс docker-compose и перезапущу его: enter image description here

Я также тестировал разные изображения. Эти скриншоты на самом деле с изображением selenium/standalone-chrome:3.141.59-gold.

Еще одна вещь, которая озадачивает меня еще больше - я использую селен для снимков экрана, и я добавил вызов webhook в коде java, если процесс завершился неудачей. Я бы ожидал, что он сработает, если процесс селеном умрет, однако, похоже, что Java не считает соединение селеном мертвым и продолжает ждать до I docker-compose down. Затем все сообщения из webhook запускаются.

Update2: Вот что я пробовал и знаю до сих пор:

1. chrome driver version makes no difference
2. shm_size increase does not make any difference
3. jvm memory limit makes no difference - command: ["java", "-Xmx2048m", "-jar", "/opt/selenium/selenium-server-standalone.jar"]
4. always hangs on the same spot .. 8 concurrent processes on a 8 core machine
5. once dead, stays dead 
6. lots of chrome processes hang there - ps -aux | grep chrome 
6.1 if those processes are killed - sudo kill -9 $(ps aux | grep 'chrome' | awk '{print $2}'), the process does not start again and stays dead.
7. --no-sandbox option does not help
8. the java process is alive on the host - telnet ip 4444 -> connects succesfully 

1 Ответ

1 голос
/ 23 июня 2019

Я подозреваю, что ваш selenium/standalone-chrome реализован с использованием технологии Java.

И у JVM контейнера есть ограниченная максимальная память с аргументом JVM -Xmx2048m или аналогичным значением.

Research selenium Файлы настройки / конфигурации JVM.

Может произойти одно или несколько действий:

  1. Приложение контейнера потерпело неудачу из-за нехватки памяти, поскольку его память была ограниченадостиг.Решение: уменьшение Максимальная память JVM, связанная с максимальной памятью контейнера (возможно, 2048m> 2g).

  2. Приложение JVM аварийно завершило работу с нехваткой памяти.Решение: увеличение Максимальная память JVM, привязанная к максимальной границе памяти контейнера (возможно, 2048м недостаточно для задачи).

  3. Контейнер достиг пика своего предела использования ЦП на мгновениеи разбился.Я предполагаю, что selenium реализует массивный параллелизм (проверьте его конфигурацию).Решение: предоставить больше вычислительной мощности для контейнера или уменьшить selenium функциональность параллелизма.

Обратите внимание, что инструменты периодического мониторинга ресурсов не в состояниивыявить пиковый ресурсный стресс.Если пик мгновенный и резкий.Таким образом, если ресурсная нагрузка постепенно нарастает, вы можете определить переломный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...