Я запускаю приложение, используя 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"
Вот как выглядят мои логи при зависании:
И после того, как я убью процесс docker-compose и перезапущу его:
Я также тестировал разные изображения. Эти скриншоты на самом деле с изображением 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