Мой опыт показывает, что моя задача с большим количеством процессов была успешной только с:
kern.maxproc=2500 # This is as big as I could set it.
kern.maxprocperuid=2048
ulimit -u 2048
Первые два могут войти в /etc/sysctl.conf
и значение ulimit в launchd.conf для надежной настройки.
Так как tcp / ip был частью того, что я делал, мне также нужно было увеличить
kern.ipc.somaxconn=8192
по умолчанию 128.
До того, как я увеличил лимиты процесса, у меня возникали «ложные» сбои, не хватало ресурсов. До того, как я увеличил kern.ipc.somaxconn, я получал ошибки "сломанной трубы".
Это было во время выполнения достаточного количества (500-4000) отдельных процессов на моем монстром Mac, ОС 10.5.7, затем 10.5.8, теперь 10.6.1. Под Linux на компьютере моего босса это просто работало.
Я думал, что число процессов будет ближе к 1000, но кажется, что каждый запущенный мной процесс включал свою собственную копию оболочки в дополнение к фактическому элементу, выполняющему реальную работу. Очень празднично
Я написал игрушку для показа, которая пошла примерно так:
#!/bin/sh
while[ 1 ]
do
n=netstat -an | wc -l
nw=netstat -an | grep WAIT | wc -l
p=ps -ef | wc -l
psh=ps -ef | fgrep sh | wc -l
echo "netstat: $n wait: $nw ps: $p sh: $psh"
sleep 0.5
done
и наблюдал максимальное количество процессов в ps -ef и зависание в netstat в ожидании TIME_WAIT
истечения срока действия ... С увеличенными пределами я увидел TIME_WAIT
на пике 3500+ элементов.
До того, как я поднял лимиты, я мог «подкрасться» к порогу отказа, который начинался ниже 1 КБ, но вырос до высокого значения 1190… каждый раз, когда он выдавался до отказа, в следующий раз это могло занять немного больше, вероятно из-за чего-то кэшируется, что расширяется до своего предела каждый раз, когда это не удалось.
Несмотря на то, что мой тестовый пример имел «ожидание» в качестве последнего утверждения, все еще было МНОЖЕСТВО отсоединенных процессов, зависших после его выхода.
Я получил большую часть информации, которую я использовал из сообщений в Интернете, но не все это было точно. Ваш пробег может варьироваться.