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

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

Процесс 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 сделает короткую работу с зомби. Вы можете перезапустить родительский процесс после его закрытия.

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

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

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