Официальный форум СВД Встраиваемые Системы
04 Декабря, 2016, 09:03:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: EAGAIN при fork-е  (Прочитано 777 раз)
mgb14
Пользователь

Сообщений: 65


« : 07 Мая, 2014, 14:26:26 »

Добрый день.
Имеем классический форкающийся TCP-сервер, то есть постоянно висящий принимающий запросы сервер, который при запросе форкается и далее ожидает новых запросов. Клиент отрабатывает задание и завершается(и так множество раз). Во время fork() у сервера есть открытые файловые дескрипторы, память выделенная как mmap(), так и calloc()/malloc(). Через некоторое (довольно продолжительное -измеряющееся днями) время fork() начинает возвращать -1 и устанавливает errno в EAGAIN, при этом все ресурсы которые можно посмотреть sin-ом далеки до граничных значений (в общем-то практически такие же как и сразу после начала работы ).
В каком случае fork() не создает дочерний процесс и возвращает EAGAIN?
Какие ресурсы требуются при выполнении fork()?
Есть ли какие-нибудь ограничения на количество присоединений (fork-ом) к разделяемой памяти выделенной в сервере mmap, при условии что в дочерней задаче не выполняется ни  mmap ни munmap, а просто используется данная память в качестве разделяемой?
OC QNX4.25 (Proc32 4.25R 15.02.2012) RAM cвободно свыше 100Мб.
Записан
mgb14
Пользователь

Сообщений: 65


« Ответ #1 : 12 Мая, 2014, 15:38:05 »

Здравствуйте,
информация в дополнение к вышенаписанному:
после вызова fork() при просмотре sin-ом видно что дочерняя задача появляется секунд на 30-60 при этом она имеет приоритет 30f и send-блокирована от сервера Tcpip. Tcpip(с приоритетом 24f) находится в Reply-blocked от Proc. Ping в это время не проходит (то есть стек Tcpip полностью не работоспособен, FLEET при этом работает нормально). Затем дочерняя задача снимается и fork() возвращает -1 с EAGAIN, ping самостоятельно восстанавливается. Далее некоторое (довольно длительное) время продолжается штатная работа. Конфигурация системы довольно большая и на простых конфигурациях повторить ситуацию не удается.
Записан
Андрей Сеньков
Администратор
Опытный пользователь

Сообщений: 262



WWW
« Ответ #2 : 15 Мая, 2014, 18:30:09 »

Здравствуйте!

Proc возвращает EAGAIN  на запрос fork в случае невозможности выделить ресурсы новому процессу.  Приведите вывод traceinfo после возникновения ошибки.
Записан

mgb14
Пользователь

Сообщений: 65


« Ответ #3 : 19 Мая, 2014, 12:52:04 »

Здравствуйте.
Во вложении выводы traceinfo, sin и sin -PTcp. Идентификатор у файла увеличивается в процессе загрузки. Проблема проявляется в файлах начиная с 4, заканчивается 8. Одна из дочерних задач блокируется от Tcpip c 30 приоритетом, другая вообще "превращается в Tcpip" Smiley  Во время когда в системе 2 Tcpip - стек не работает (ping-и не проходят). Через какой-то тайм-аут второй Tcpip снимается и стек восстанавливает работоспособность.
Все это безобразие Smiley наблюдается в случае если к форкающимся родительским задачам идут интенсивные запросы на обслуживание от клиентов по TCP. Если снять запросы по TCP все форки проходят нормально.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 15 Ноября, 2016, 18:24:58