Зомби-процессы, страшно, да ... Или нет? Вот краткое изложение того, что я узнал за последнюю неделю, пытаясь разместить сервер Linux в рамках моего проекта Валидатор страхового налога.
Что такое зомби-процесс? 🧟♂️
Зомби-процесс возникает, когда родитель не пожинает своего ребенка.
В Unix и Unix-подобных компьютерных операционных системах процесс-зомби или несуществующий процесс - это процесс, который завершил выполнение (через exit
системный вызов ), но по-прежнему имеет запись в таблице процессов : это процесс в состоянии завершения . Это происходит для дочерних процессов, где запись все еще необходима, чтобы родительский процесс мог прочитать статус выхода своего дочернего процесса: как только статус выхода считывается с помощью системного вызова wait
, запись зомби становится удаляется из таблицы процессов, и говорят, что он пожинает.
Термин зомби-процесс происходит от общепринятого определения зомби - нежить. В метафоре этого термина дочерний процесс умер, но еще не пожат. Кроме того, в отличие от обычных процессов, команда kill
не влияет на зомби-процесс.
Зомби-процессы не следует путать с сиротскими процессами: сиротский процесс - это процесс, который все еще выполняется, но родитель которого умер. Когда родитель умирает, осиротевший дочерний процесс принимается init
(идентификатор процесса). Когда процессы-сироты умирают, они не остаются как процессы-зомби; вместо этого они wait
включены init
. В результате процесс, который одновременно является зомби и сиротой, будет завершен автоматически.
Зомби-поток - это присоединяемый поток, который завершился, но не присоединился.
Как правило, нить нужно либо соединить, либо отсоединить. В противном случае ОС сохраняет свое состояние для некоторого возможного будущего соединения, которое требует ресурсов.
Опасности зомби-процессов ⚠️
Зомби-процессы не потребляют никаких системных ресурсов. (На самом деле каждый из них использует очень крошечный объем системной памяти для хранения своего дескриптора процесса.) Однако каждый зомби-процесс сохраняет свой идентификатор процесса (PID). Системы Linux имеют ограниченное количество идентификаторов процессов - 32767 по умолчанию в 32-битных системах. Если зомби накапливаются с большой скоростью - например, если неправильно запрограммированное серверное программное обеспечение создает зомби-процессы под нагрузкой, - весь пул доступных PID в конечном итоге будет назначен процессам-зомби, предотвращая запуск других процессов. Однако наличие нескольких зомби-процессов не является проблемой - хотя они указывают на ошибку в родительском процессе в вашей системе.
Как убить зомби-процессы? ⚔
Обычно мы убиваем процессы с помощью команды SIGKILL, но зомби-процессы уже мертвы. Вы не можете убить что-то уже мертвое.
Представьте себе это так:
«Вы находите труп посреди дороги, звоните семье трупа, и они уносят его с дороги».
Но многие программы недостаточно хорошо запрограммированы для удаления этих зомби-детей, потому что, если бы они были такими, у вас бы вообще не было этих зомби. Таким образом, единственное, что гарантированно удалит Child Zombies, - это убийство родителя. Теперь, чтобы убить зомби-процесс, мы должны сначала убить его родительский процесс (довольно забавно, прямо как настоящие зомби!), Но вопрос был в том, как его найти.
Как найти процесс Зомби? 🤷♀️
a@SERVER:~$ ps aux | grep 'Z'
Вы получите зомби и все остальное с буквой Z, так что вы также получите команду grep:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
usera 13572 0.0 0.0 7628 992 pts/2 S+ 19:40 0:00
usera 93572 0.0 0.0 0 0 ?? Z 19:40 0:00
Как найти родителя Зомби? 🤷♂️
a@SERVER:~$ pstree -p -s 93572
Даст тебе:
init(1)---cnid_metad(1311)---cnid_dbd(5145)
В этом случае вы не хотите убивать этот родительский процесс, и вы должны быть вполне довольны одним зомби, но убийство непосредственного родительского процесса 5145 должно избавить от него.
Стоит ли бояться? 😧
Ну и да, и нет.
Дочерний процесс всегда сначала становится зомби, а затем удаляется из таблицы ресурсов. В большинстве случаев при нормальной работе системы зомби немедленно ждут своего родителя, а затем пожинает система, которая остается зомби в течение длительного времени, как правило, является ошибкой и вызывает утечку ресурсов.
Утечка ресурсов - это особый тип потребления ресурсов компьютерной программой, когда программа не освобождает ресурсы, которые она приобрела.
Так что, если вы выполняете какую-либо простую и важную повседневную задачу, у вас все будет в порядке. Но если у вас запущены высокопроизводительные приложения и серверы, остерегайтесь зомби-процессов.
Все еще беспокоитесь о зомби-процессе? Oracle здесь, чтобы помочь. Благодаря непревзойденным ценам на облачные услуги у вас есть возможность опробовать их виртуальные машины Linux, для которых гарантировано автоматическое выполнение зомби-процессов.
Следуйте, чтобы получить бесплатную 30-дневную пробную версию с услугами Oracle Cloud.
Спасибо, что нашли время прочитать мою статью. Если вы ищете больше подобных сообщений, вы можете найти меня в Linkedin, Twitter или Medium.
* Все представления принадлежат мне, а не Oracle **