URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6079
[ Назад ]

Исходное сообщение
"Fork() возвращает ENOMEM"

Отправлено Rublev , 15-Янв-07 13:32 
Здравствуйте,

Fork() вываливается по 12 ошибке ENOMEM. В этот момент свободной ОЗУ 350М, не считая свапа. Родительский процесс около 15М, т.е. не такого размера чтобы сьесть всю свободную память. Процесс запущен под рутом. проверяю RLIMIT_AS - установлен на максимум 4Гб.

Куда смотреть? замучался совсем


Содержание

Сообщения в этом обсуждении
"Fork() возвращает ENOMEM"
Отправлено ACCA , 15-Янв-07 22:44 
>Куда смотреть? замучался совсем

Какая хоть система? Что говорит vmstat -f ?


"Fork() возвращает ENOMEM"
Отправлено Rublev , 16-Янв-07 12:19 
>>Куда смотреть? замучался совсем
>
>Какая хоть система? Что говорит vmstat -f ?


Сейчас запускается на Linux, 2.6.9-42, но этотже результат и на других машинах с другими ядрами.

vmstat -f говорит что с момента запуска программы до вылета порождается около 20 тыс. процессов (которые со временем корректно отмирают).
Но, как я понял смысл наблюдения за vmstat -f это немного не то - я хочу отметить что вылетает по ENOMEM, а не EAGAIN с которым связано RLIMIT_NPROC, соотвественно которое я устанавливаю в 100,000.

Я специально вначале не упомянул про установки NPROC и NOFILE, которые как мне кажется не сильно влияют на вылет именно по errno = 12.



"Fork() возвращает ENOMEM"
Отправлено NuINu , 16-Янв-07 12:35 
>>>Куда смотреть? замучался совсем
>>
>>Какая хоть система? Что говорит vmstat -f ?
>
>
>Сейчас запускается на Linux, 2.6.9-42, но этотже результат и на других машинах
>с другими ядрами.
Ну еомем, в fork вообще не зависит от размера процесса, при нем не происходит копирования или выделения памяти в области пользователя, происходит только создание управляющих структур в ядре.

Поэтому мне кажеться что это либо какое то ограничение на количество порождаемых процессов в ядре, либо в системе безопасности.



"Fork() возвращает ENOMEM"
Отправлено Rublev , 16-Янв-07 14:17 
>не происходит копирования или выделения памяти в области пользователя, происходит только
>создание управляющих структур в ядре.

! я тоже думаю что где-то в ядре идет перебор во время создания служебных структур, но не могу отловить. Все что можно уже выставлял с ulimit и rlimitset в разумных и не разумных пределах. Ничто не должно лимитить, да видно не в этом проблема. Процессы рождаются и умирают, память очищается.


> Ну еомем, в fork вообще не зависит от размера процесса, при нем не происходит
> копирования или выделения памяти в области пользователя, происходит только создание
> управляющих структур в ядре.

Пускай не завист от размера родителя, но это ошибка интерпретируемая как "Out of memory" (см. /usr/include/asm/errno.h). Для лимитов как я понимаю служит EAGAIN и поэтому все мои эксперименты с лимитами ни чем не помогают.



"Fork() возвращает ENOMEM"
Отправлено Rublev , 16-Янв-07 16:37 
>
>Поэтому мне кажеться что это либо какое то ограничение на количество порождаемых
>процессов в ядре, либо в системе безопасности.

Хотел еще уточнить, вернее спросить - как посмотреть на то как кернел расходует память?
Где мониторятся структуры ядра порождаемых процессов?



"Fork() возвращает ENOMEM"
Отправлено NuINu , 16-Янв-07 17:16 
>>
>>Поэтому мне кажеться что это либо какое то ограничение на количество порождаемых
>>процессов в ядре, либо в системе безопасности.
>
>Хотел еще уточнить, вернее спросить - как посмотреть на то как кернел
>расходует память?
>Где мониторятся структуры ядра порождаемых процессов?

Я таким не занимался, но доступ к кернелу можно получить указав при сборке HACK_KERNEL
ну и там куча параметров.

А посмотреть что может и что не может возвращать форк, можно просто заглянув в исходник fork.c

do_fork() вообщем нет памяти и все, хотя по идее все должно грохаться. Хотя этот вызов наверняка для пользователя должен охраняться каким нибудь секюрити модулем, к примеру запрещающим пользователю создавать бесконечное число процессов. смотри еще SELinux.
но вообще у меня 2.4, а у тебя 2.6, малоли что могло измениться ;-))