Я использую команду Linux ps для отслеживания размера RSS процессов внутри контейнера Docker. Если общее количество RSS превышает пороговое значение, я проваливаю тесты и начинаю искать регрессии памяти.

Вот весь вывод ps из контейнера Docker.

 PID %CPU      RSS Threads COMMAND
   1  0.0     2616       1 sh /test/Build/unittest.sh
   7  3.3    44240       1   /usr/bin/Xvfb :1 -screen 0 ...
  17  1.5    10824       1   /usr/bin/fluxbox
 357  690  6292244     324   java -server -Xmx2g ...
 490  0.4     7852       1     /usr/bin/python /usr/bin/dstat ...
 491  0.7     7812       1     /usr/bin/python /usr/bin/dstat ...
1331  0.0     3040       1     /usr/bin/ps -AHww --format ...
1332  0.0      380       1     /usr/bin/ls --all ...
1333  0.0  6292248       1     [NDR-347]

Процесс Java (pid: 357) создает недолговечные дочерние процессы. В приведенном выше выводе вы можете видеть 2 процесса Python dstat, ps, ls и [NDR-347] ". Все они были созданы процессом Java.

Иногда я вижу дубликат дочернего процесса (то есть ту же команду), но другой идентификатор процесса (не показан). Почему я вижу дубликат дочернего процесса? Я полагаю, что это какой-то артефакт Linux или Docker. Что это за артефакт?

Я отслеживаю вывод ps уже больше года. Впервые я вижу дополнительный процесс "[NDR-347]" (pid: 1333) с почти таким же RSS. Процесс Java (pid: 357) называет потоки "NDR- #", поэтому я нахожу странным, что команда дочернего процесса будет именем потока из процесса Java. Дополнительный процесс удваивает RSS и вызывает проблему. Проблема не воспроизводима. Это говорит мне о том, что pid 1333 очень недолговечен и не перехватывается ps . Общий объем RSS составляет 12,07 ГБ, а без дополнительного процесса - 6,07 ГБ. Что это за дополнительный процесс? Почему у него такой огромный RSS?

Редактировать: точная команда ps ...

ps -Ahww --format pid,%cpu,rss:8,nlwp=Threads,command

1 ответ1

1

У вас есть Java-процесс, который запускает другие программы.

Как и любой другой процесс, который хочет запустить другую программу, первым шагом является fork . Этот разветвленный процесс наследует карту памяти родителя. Эта память используется совместно, поэтому она не использует дополнительную оперативную память.

Следующий шаг после того, как fork чтобы execve нового процесса. execve освобождает всю память и отображает память из новой программы.

Обычно execve следует очень скоро после fork , поэтому маловероятно, что вы поймаете процесс в этом состоянии, но иногда это произойдет.

В вашем конкретном случае, если вы знаете, что разветвленные процессы Java содержат имя NDR- , то вам следует просто игнорировать эти процессы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .