init никогда не пожинает зомби / несуществующие процессы

На моем веб-сервере Fedora Core 9 с ядром 2.6.18.8 процесс init не запускает процессы зомби. Это было бы терпимо, если бы не таблица процессов, в конечном итоге достигающая верхнего предела, где никакие новые процессы не могут быть распределены.

Пример вывода ps -el | grep 'Z':

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
5 Z     0  2648     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
1 Z    51  2656     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
1 Z     0  2670     1  0  75   0 -     0 exit   ?        00:00:02 crond <defunct>
4 Z     0  2874     1  0  82   0 -     0 exit   ?        00:00:00 mysqld_safe <defunct>
5 Z     0 28104     1  0  76   0 -     0 exit   ?        00:00:00 httpd <defunct>
5 Z     0 28716     1  0  76   0 -     0 exit   ?        00:00:06 lfd <defunct>
5 Z    74 10172     1  0  75   0 -     0 exit   ?        00:00:00 sshd <defunct>
5 Z     0 11199     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11202     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11205     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11208     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11211     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11240     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11246     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11249     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
5 Z     0 11252     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>
1 Z     0 14106     1  0  80   0 -     0 exit   ?        00:00:00 anacron <defunct>
5 Z     0 14631     1  0  75   0 -     0 exit   ?        00:00:00 sendmail <defunct>

Это ошибка ОС? расконфигурация? Я ищу вдохновение как источник этой проблемы. Спасибо

3 ответа

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

Однако, как только процесс вызывает "выход", он больше не работает, и ядро ​​получит из него максимально возможное количество ресурсов. Таким образом, о нем сообщат как о зомби, хотя ядро ​​еще не совсем готово к тому, чтобы его собрать.

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

Процесс станет зомби, если родитель умирает. Если это так, init станет новым родителем процесса-сироты.

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

Это может означать ошибку в системе, а может и нет. Я предлагаю список рассылки ядра или определенный список рассылки, посвященный ядру.

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

Другие вопросы по тегам