Здравствуйте,Fork() вываливается по 12 ошибке ENOMEM. В этот момент свободной ОЗУ 350М, не считая свапа. Родительский процесс около 15М, т.е. не такого размера чтобы сьесть всю свободную память. Процесс запущен под рутом. проверяю RLIMIT_AS - установлен на максимум 4Гб.
Куда смотреть? замучался совсем
>Куда смотреть? замучался совсемКакая хоть система? Что говорит vmstat -f ?
>>Куда смотреть? замучался совсем
>
>Какая хоть система? Что говорит vmstat -f ?
Сейчас запускается на Linux, 2.6.9-42, но этотже результат и на других машинах с другими ядрами.vmstat -f говорит что с момента запуска программы до вылета порождается около 20 тыс. процессов (которые со временем корректно отмирают).
Но, как я понял смысл наблюдения за vmstat -f это немного не то - я хочу отметить что вылетает по ENOMEM, а не EAGAIN с которым связано RLIMIT_NPROC, соотвественно которое я устанавливаю в 100,000.Я специально вначале не упомянул про установки NPROC и NOFILE, которые как мне кажется не сильно влияют на вылет именно по errno = 12.
>>>Куда смотреть? замучался совсем
>>
>>Какая хоть система? Что говорит vmstat -f ?
>
>
>Сейчас запускается на Linux, 2.6.9-42, но этотже результат и на других машинах
>с другими ядрами.
Ну еомем, в fork вообще не зависит от размера процесса, при нем не происходит копирования или выделения памяти в области пользователя, происходит только создание управляющих структур в ядре.Поэтому мне кажеться что это либо какое то ограничение на количество порождаемых процессов в ядре, либо в системе безопасности.
>не происходит копирования или выделения памяти в области пользователя, происходит только
>создание управляющих структур в ядре.! я тоже думаю что где-то в ядре идет перебор во время создания служебных структур, но не могу отловить. Все что можно уже выставлял с ulimit и rlimitset в разумных и не разумных пределах. Ничто не должно лимитить, да видно не в этом проблема. Процессы рождаются и умирают, память очищается.
> Ну еомем, в fork вообще не зависит от размера процесса, при нем не происходит
> копирования или выделения памяти в области пользователя, происходит только создание
> управляющих структур в ядре.Пускай не завист от размера родителя, но это ошибка интерпретируемая как "Out of memory" (см. /usr/include/asm/errno.h). Для лимитов как я понимаю служит EAGAIN и поэтому все мои эксперименты с лимитами ни чем не помогают.
>
>Поэтому мне кажеться что это либо какое то ограничение на количество порождаемых
>процессов в ядре, либо в системе безопасности.Хотел еще уточнить, вернее спросить - как посмотреть на то как кернел расходует память?
Где мониторятся структуры ядра порождаемых процессов?
>>
>>Поэтому мне кажеться что это либо какое то ограничение на количество порождаемых
>>процессов в ядре, либо в системе безопасности.
>
>Хотел еще уточнить, вернее спросить - как посмотреть на то как кернел
>расходует память?
>Где мониторятся структуры ядра порождаемых процессов?Я таким не занимался, но доступ к кернелу можно получить указав при сборке HACK_KERNEL
ну и там куча параметров.А посмотреть что может и что не может возвращать форк, можно просто заглянув в исходник fork.c
do_fork() вообщем нет памяти и все, хотя по идее все должно грохаться. Хотя этот вызов наверняка для пользователя должен охраняться каким нибудь секюрити модулем, к примеру запрещающим пользователю создавать бесконечное число процессов. смотри еще SELinux.
но вообще у меня 2.4, а у тебя 2.6, малоли что могло измениться ;-))