У меня есть модуль, который запускает службу весенней загрузки java, которая интенсивно использует диск и в конечном итоге получает OOMkilled из-за увеличения объема памяти ядра (предположим, что это inode и page cash) до достижения предела (3Gb). Это займет примерно 2 дня. Это отдельная проблема, которую мы исследуем
Но проблема в том, что после этого первого перезапуска он получает OOMKilled каждый раз быстрее и быстрее, пока не попадет в Crashloop. Сначала длится 1 час, потом все реже и реже. kubectl top pods
показывает, что память вернулась в нормальное состояние, но внезапно контейнер был уничтожен.
Итак, мои вопросы:
- K8s отправляет уничтожение основному процессу контейнера, поэтому модуль как таковой не заменяется, верно? Что происходит с ресурсами pod? Они очищены между перезапусками контейнера?
- Что происходит с капсулой при перезапуске контейнера? Может ли это быть утечка Java некоторого типа, файловые дескрипторы? Память Java довольно мала (менее 800 Мб). JVM уничтожается в процессе перезапуска, поэтому это должно произойти.
- Возможно ли, что узел, на котором размещен модуль, не освобождает или не очищает используемый модуль?
Удаление модуля с kubectl delete pod
выполняет свою работу, и оно продолжается 2 дня снова. Возможно, потому что узел освобождает модуль и перераспределяет его.
Мы в основном записываем значения памяти модуля, беря данные из папки /sys/fs/cgroup/memory
, и после первого перезапуска значения возвращаются в нормальное состояние, но он все еще уничтожается.
Мы используем:
- CentOS с ядром 3.10 в узлах
- Java 1.8 (
1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12
)
- Я настроил JVM с опциями осведомленности cgroup, но мы знаем, что java - это не OOMing.