Сервер перестает отвечать на запросы периодически, OOM Killer неактивен? - PullRequest
0 голосов
/ 01 мая 2018

Я размещаю приложение Ruby в док-контейнере на AWS. К сожалению, известно, что это Ruby-приложение пропускает память, поэтому в конечном итоге оно использует всю доступную память.

Я, возможно, наивно ожидаю, что OOM killer будет вызван и уничтожит процесс Ruby, но ничего не происходит. В конечном итоге машина перестает отвечать на запросы (веб-сервер не отвечает, ssh отключен). Мы принудительно перезагружаем компьютер с консоли AWS и получаем в журнале следующее сообщение, поэтому оно действительно живо на момент перезапуска:

Apr 30 23:07:14 ip-10-0-10-24 init: serial (ttyS0) main process (2947) killed by TERM signal

Я не верю, что это исчерпание ресурсов (то есть истощение кредитов) в AWS. Если я периодически перезапускаю приложение, сервер никогда не выключается.

  • Я не отключаю OOM Killer и не изменяю конфигурацию памяти докера по умолчанию .
  • Я работаю на складе Amazon Linux AMI выпуск 2017.03 ядро.
  • Такое поведение наблюдается в нескольких виртуальных экземплярах в AWS

Я очень растерялся здесь; почему из-за нехватки памяти машины блокируются?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

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

Предложения 1

Я предполагаю, что вы используете официальный образ ruby ​​docker, и при запуске контейнера ruby ​​работает как PID 1 внутри контейнера.

Если ruby ​​работает как PID 1, то OOM killer не сможет его убить, вызывая все проблемы, которые вы видите.

Чтобы решить эту проблему, вам нужно убедиться, что правильный init процесс выполняется как PID 1.

Docker 1.25 и выше имеет опцию --init для команды docker run. Эта опция гарантирует, что правильный init справится с задачами PID 1, а также передаст все СИГНАЛЫ в ваше приложение ruby.

https://docs.docker.com/engine/reference/commandline/run/

- init API 1.25+ Запустить init внутри контейнера, который пересылает сигналы и перезапускает процессы

Вот что Docker использует как init https://github.com/krallin/tini

Предложение 2

Существует известная проблема с Amazon Linux AMI, подробности можно найти по следующей ссылке https://github.com/aws/amazon-ecs-agent/issues/794. На момент написания статьи я не уверен, была ли проблема с AMI исправлена ​​или нет.

Так что попробуйте другой AMI, как предложено в этой теме, скажем Ubuntu AMI.

0 голосов
/ 01 мая 2018

Я думаю, вы предполагаете, что OOM всегда будет нацеливаться на ваше Ruby-приложение, но я не думаю, что это так. Ваша строка журнала показывает, что она уничтожила ваше tty соединение. Я держу пари, что это убивает другие процессы до вашего процесса Ruby, и именно поэтому ваша машина не отвечает. Вы можете прочитать о том, как работает OOM, и это может помочь здесь. Я бы специально посмотрел на ваши oom_scores и увидел, что вы там найдете.

http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html

Удачи

...