Дубликат Linux и дополнительные процессы в выводе ps

507
Nathan

Я использую команду 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 
0

1 ответ на вопрос

1
RalfFriedl

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

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

Следующий шаг после fork- к execveновому процессу. В execveрелизах всех памяти и карта памяти с новой программы.

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

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

Спасибо! Я уже внес изменения в код, чтобы игнорировать этот процесс. На сильно загруженной машине время между `fork` и` execve` может быть увеличено, так что это может произойти, когда я с большей вероятностью увижу это. Nathan 5 лет назад 0