The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Fork() возвращает ENOMEM"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Fork() возвращает ENOMEM"  
Сообщение от Rublev on 15-Янв-07, 13:32 
Здравствуйте,

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Fork() возвращает ENOMEM"  
Сообщение от Rublev on 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.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру