Nifi 1.6.0 утечка памяти - PullRequest
       10

Nifi 1.6.0 утечка памяти

0 голосов
/ 30 октября 2018

Мы запускаем в производство контейнеры Docker NiFi 1.6.0 и должны столкнуться с утечкой памяти.

После запуска приложение работает нормально, однако через 4-5 дней потребление памяти на хосте продолжает увеличиваться. При проверке в пользовательском интерфейсе кластера NiFi размер кучи JVM составляет едва ли около 30%, а объем памяти на уровне ОС достигает 80-90%.

Запустив команду запуска докера, мы обнаружили, что док-контейнер NiFi потребляет память.

После сбора метрик JMX мы обнаружили, что память RSS продолжает расти. Что может быть потенциальной причиной этого? На вкладке JVM диалогового окна кластера молодой GC также, кажется, происходит своевременно со старыми значениями GC, показанными как 0.

Как нам определить, что вызывает увеличение памяти RSS?

1 Ответ

0 голосов
/ 03 ноября 2018

Вам необходимо повторить это в среде без докера, потому что с докером память, как известно, повышает .
Как я объяснил в « Разница между размером резидентного набора (RSS) и общей выделенной памятью Java (NMT) для JVM, работающей в контейнере Docker », в Docker есть некоторые ошибки (например, , проблема 10824 и выпуск 15020 ), которые не позволяют получить точный отчет о памяти, используемой процессом Java в контейнере Docker.

Именно поэтому плагин, подобный signalfx/docker-collectd-plugin, упоминает (две недели назад) в своем PR - запрос на извлечение - 35 для "вычитания значения кэша из использования памяти процентная метрика ":

В настоящее время вычисление использования памяти контейнера / группы, возвращаемой в SignalFX, включает кэш страницы Linux.
Как правило, это считается неправильным и может привести к тому, что люди будут преследовать утечки фантомной памяти в своих приложениях.

Чтобы продемонстрировать, почему текущий расчет неверен, вы можете выполнить следующее, чтобы увидеть, как использование ввода-вывода влияет на общее использование памяти в cgroup:

docker run --rm -ti alpine
cat /sys/fs/cgroup/memory/memory.stat
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
dd if=/dev/zero of=/tmp/myfile bs=1M count=100
cat /sys/fs/cgroup/memory/memory.stat
cat /sys/fs/cgroup/memory/memory.usage_in_bytes

Вы должны увидеть, что значение usage_in_bytes увеличивается на 100 МБ только после создания файла размером 100 МБ. Этот файл не был загружен приложением в анонимную память, но, поскольку он теперь находится в кеше страниц, использование памяти контейнера оказывается выше.
Вычтение значения кэша в memory.stat из use_in_bytes показывает, что подлинное использование анонимной памяти не возросло.

Метрика signalFX теперь отличается от того, что вы видите, когда вы запускаете статистику Docker, которая использует вычисления, которые у меня есть здесь.
Кажется, что знание использования кэша страницы для контейнера может быть полезным (хотя я изо всех сил думаю о том, когда), но знание этого как части общего процентного использования cgroup бесполезно, так как тогда оно маскирует ваш реальный RSS использование памяти.
В приложении для сбора мусора с максимальным размером кучи, большим или превышающим предел памяти cgroup (например, параметр -Xmx для java или ядро ​​.NET в режиме сервера), тенденция к проценту будет приближаться к 100 %, а затем просто наведите курсор мыши, предполагая, что среда выполнения может правильно видеть ограничение памяти cgroup.
Если вы используете Smart Agent, я бы порекомендовал использовать монитор docker-container-stats (в который я внесу такую ​​же модификацию, чтобы исключить кеш-память).

...