Я имел обыкновение работать с системой HP-UX, и старый администратор сказал мне, что есть верхний предел на число процессов зомби, которые вы можете иметь в системе, я думаю, 1024.
- Это жесткий потолок факта? Я думаю, что вы можете иметь любое количество зомби, как если бы вы могли иметь любое количество процессов ...?
- Это разная ценность от дистрибутива к дистрибутиву?
- Что произойдет, если мы достигнем верхнего предела и попытаемся создать еще одного зомби?
ulimit -u
. Я был смущен некоторое время, посколькуman ulimit
получил меня рутина C без упоминания-u
. Упомянутый ulimit на самом деле является встроенным инструментом bash, и он описан на странице руководства bash.Ответы:
У меня нет HP-UX, и я никогда не был большим поклонником HP-UX.
Похоже, что в Linux существует ограничение на количество дочерних процессов для каждого процесса или, возможно, для каждого пользователя. Вы можете увидеть это с помощью
limit
встроенного Zsh (похоже,ulimit -u
в bash):Это на ноутбуке Arch Linux.
Я написал небольшую программу для проверки этого ограничения:
Было удивительно трудно «собрать» всех зомби, позвонив
wait(2)
достаточно раз. Кроме того, количество полученных сигналов SIGCHLD никогда не совпадает с числом разветвленных дочерних процессов: я полагаю, что ядро linux иногда отправляет 1 SIGCHLD для ряда завершенных дочерних процессов.В любом случае, на моем ноутбуке Arch Linux я получил 16088 дочерних процессов, и это должно быть количество зомби, так как программа не выполняет
wait(2)
системные вызовы в обработчике сигналов.На моем сервере Slackware 12 я получаю 6076 дочерних процессов, что близко соответствует значению
maxproc 6079
. У моего ID пользователя есть еще 2 запущенных процессаsshd
и Zsh. Наряду с первым, не зомби-экземпляром программы выше, это 6079.fork(2)
Системный вызов не с «Ресурс временно недоступна» ошибка. Я не вижу никаких других доказательств того, что ресурс недоступен. Я получаю несколько разные числа, если я запускаю свою программу одновременно в 2 разных xterms, но они складываются в одно и то же число, как если бы я запускал ее в одном xterm. Я предполагаю, что это записи таблицы процессов, или подкачка, или какой-то общесистемный ресурс, а не просто произвольный предел.У меня больше ничего нет, чтобы попробовать это прямо сейчас.
источник
Я не знаю, каковы пределы HP-UX. Однако я могу сказать вам, что логическая реализация состоит в том, чтобы иметь таблицу процессов с максимальным размером. Общее количество записей в таблице процессов теоретически ограничено диапазоном идентификаторов процессов, но большинство реализаций имеют ограничение на размер таблицы, которое дает гораздо меньший максимум. Большинство вариантов Unix также имеют ограничение на количество пользователей; Вы можете увидеть предел, запустив
ulimit -u
в bash.Я не ожидаю, что система Unix будет иметь отдельный лимит на зомби, а не на количество идентификаторов процессов (которое включает в себя как реальные процессы, так и зомби). Поэтому, когда процесс умирает и становится зомби, это не влияет на предел: ресурс (запись в таблице процессов) выделяется, когда процесс разветвляется, и освобождается, когда процесс пожинается.
источник
Я думаю, что вы можете иметь любое количество зомби, как если бы вы могли иметь любое количество процессов ...?
Процесс зомби - это, наконец, процесс - в особом состоянии - тогда процессы зомби ограничены доступностью и размером таблицы процессов, как для обычного процессов.
Это разная ценность от дистрибутива к дистрибутиву?
Конечно, как и многие другие параметры. Вы не должны ретранслировать на определенный размер, или если он достаточно большой, чтобы провести много зомби процесса. Если вы получаете слишком много зомби, решение не является большим столом, потому что оно будет в конечном итоге заполнено. Процесс зомби сам по себе неплох, но слишком большое количество накопленных процессов зомби является признаком «плохо себя ведущей» программы, которая допускает такие процессы зомби.
Что произойдет, если мы достигнем верхнего предела и попытаемся создать еще одного зомби?
Как только таблица процессов заполнена обычными и зомби-процессами, новый регулярный процесс не может быть создан, даже если в системе достаточно ресурсов памяти, процессора и т. Д. Единственный недостающий ресурс - это просто одна запись в таблице процессов. Уже запущенные программы - даже те, которые "хорошо себя ведут" - начнут давать сбой, когда им потребуется создать подпроцесс. Новые программы не могут быть запущены, и даже запуск отдельных команд завершится ошибкой.
источник
Even running single commands would fail.
-> Это большое влияние.