Процесс 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 сделает короткую работу с зомби. Вы можете перезапустить родительский процесс после его закрытия.
В основном, зомби не являются большой проблемой. Это «мертвый» процесс, который не требует времени процессора, и любая выделенная память должна была быть освобождена процессом перед смертью. Единственный ресурс, который они фактически используют - это запись в вашем списке процессов. В зависимости от вашей системы, вы можете иметь максимально допустимое количество потоков, а наличие зомби может заставить вас достичь этого предела быстрее без всякой причины.
Однако: зомби обычно появляются из-за плохого / ошибочного кода, когда программист забыл проверить состояния своих дочерних процессов. Это может быть преднамеренным, но часто это не так. Bad / глючный код будет часто также обрабатывать памяти в
плохомособым образом, и не освобождает некоторые выделенные ресурсы. В этом случае эти ресурсы останутся выделенными для зомби, пока он не будет полностью уничтожен.Редактировать : Если процесс является Java-программой, не освобождаемая память не должна быть проблемой, поскольку сборщик мусора Java заботится обо всем.
источник