Любая проблема, если состояние зомби не очищается?


18

У меня есть производственная единица, в которой процесс Java стал Zombie и оставался там в течение некоторого времени. Если устройство будет перезапущено, оно будет очищено. Однако модуль не перезапускается, и другой процесс Java запущен и работает. Есть ли какая-либо проблема, если это состояние зомби останется без изменений? Повлияет ли это как-то (производительность или медлительность)?

Ответы:


22

Процесс Zombie не повлияет на производительность или медлительность, поскольку процессы Zombie не используют системные ресурсы.

Примечание: - Практически, он все еще использует PID (который является ограниченным ресурсом), и структуры данных ядра для процесса все еще распределены. Обычно это не имеет большого значения, но использование памяти ядра может быть значительным в системах с очень ограниченным объемом памяти.

Проблема, вызванная процессом зомби

Каждый процесс зомби сохраняет свой идентификатор процесса. Системы Linux имеют конечное число идентификаторов процессов - 32767 по умолчанию в 32-разрядных системах. Если зомби накапливаются с очень высокой скоростью, весь пул доступных идентификаторов PID в конечном итоге будет назначен процессам зомби, предотвращая запуск других процессов.

Примечание . В 64-разрядных системах вы можете увеличить максимальный PID, см. Https://unix.stackexchange.com/a/16884/170373.

Тем не менее, некоторые процессы, связанные с зомби, не являются проблемой - хотя они указывают на ошибку с родительским процессом в вашей системе.

Объяснение:

Когда процесс умирает в Linux, он не сразу удаляется из памяти - его дескриптор процесса остается в памяти.

Состояние процесса становится EXIT_ZOMBIEравным, и родительский процесс уведомляется о том, что его дочерний процесс умер вместе с SIGCHLDсигналом.

Затем предполагается, что родительский процесс выполняет системный вызов wait (), чтобы прочитать состояние завершения мертвого процесса и другую информацию. Это позволяет родительскому процессу получать информацию из мертвого процесса. После вызова wait () процесс зомби полностью удаляется из памяти.

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

Разрешение:

Вы не можете убить процессы зомби, как вы можете убить обычные процессы с помощью сигнала SIGKILL - процессы зомби уже мертвы.

Один из способов убить зомби - отправить сигнал SIGCHLD родительскому процессу. Этот сигнал говорит родительскому процессу выполнить системный вызов wait () и очистить его дочерних элементов-зомби. Отправьте сигнал командой kill, заменив pid в приведенной ниже команде на PID родительского процесса:

kill -s SIGCHLD pid

Когда процесс, который создал зомби, заканчивается, init наследует процессы зомби и становится их новым родителем. (init - первый процесс, запускаемый в Linux при загрузке, и ему назначается PID 1.)

Примечание: - Начиная с Linux 3.4 процессы могут выполнять системный вызов prctl () с параметром PR_SET_CHILD_SUBREAPER, и в результате они, а не процесс # 1, станут родителями своих потерянных дочерних процессов. См. Https://unix.stackexchange.com/a/177361/5132.  

Затем INIT выполняет системный вызов wait (), чтобы очистить своих детей-зомби, поэтому init сделает короткую работу с зомби. Вы можете перезапустить родительский процесс после его закрытия.


Есть ли шанс, что wait () сама по себе не удалась?
Рави

3
В 64-битных системах вы можете увеличить максимальный PID, см. Unix.stackexchange.com/a/16884/170373
ilkkachu

1
Часть о воспитании детей тоже неверна. unix.stackexchange.com/a/177361/5132 По иронии судьбы создание подпрограмм, которые не ожидают, является простым способом вызвать долгосрочные процессы зомби.
JdeBP

2
Родитель уже получит SIGCHLD, когда процесс, который теперь является зомби, умер.
Анхель

2
Строго говоря, неправильно говорить, что он не использует ресурсы. Это все еще использует PID (который является ограниченными ресурсами), и структуры данных ядра для процесса все еще распределены. Обычно это не имеет большого значения, но использование памяти ядра может быть значительным в системах с очень ограниченным объемом памяти.
Остин Хеммельгарн

6

В основном, зомби не являются большой проблемой. Это «мертвый» процесс, который не требует времени процессора, и любая выделенная память должна была быть освобождена процессом перед смертью. Единственный ресурс, который они фактически используют - это запись в вашем списке процессов. В зависимости от вашей системы, вы можете иметь максимально допустимое количество потоков, а наличие зомби может заставить вас достичь этого предела быстрее без всякой причины.

Однако: зомби обычно появляются из-за плохого / ошибочного кода, когда программист забыл проверить состояния своих дочерних процессов. Это может быть преднамеренным, но часто это не так. Bad / глючный код будет часто также обрабатывать памяти в плохом особым образом, и не освобождает некоторые выделенные ресурсы. В этом случае эти ресурсы останутся выделенными для зомби, пока он не будет полностью уничтожен.

Редактировать : Если процесс является Java-программой, не освобождаемая память не должна быть проблемой, поскольку сборщик мусора Java заботится обо всем.


3
На самом деле, не подача памяти не является проблемой большинства ОС на всех языках. Система освободит всю память, кроме небольшого количества для родительского процесса.
говорит Вэл Восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.