LINUX.ORG.RU

зависает fork()


0

0

Место действия: Fedora 5, kernel 2.6.18-1.2257, 2GHz, 256 rom

Есть программа, написаная на С. В ней есть место, где в цикле много раз подряд вызывается системная функция fork(). В этой программе активно используются unix-сокеты, каналы... но нет потоков. В ходе проверки, при большой нагрузке на процессор, fork() переодически зависает на несколько секунд, безсовестно тормозя весь цикл. Как можно выявить виновника данной каверзы? Пытался использовать system profiler, но он вывел скромные усредненные данные по парочке функий блокирования и разблокирования памяти. Что могло вызвать подобные симптомы? В нормальных условиях fork() плодится со скоростью ~500 процессов/с (0.002 секунд на процесс)

anonymous

А почему ты решил, что именно форк виноват? Может, просто ядро под нагрузкой подтормаживает? Оно ж в Линуксе не рвется...

Die-Hard ★★★★★
()

>В ней есть место, где в цикле много раз подряд вызывается системная функция fork()

А там не каких ограничений не стоит? (вроде максимального числа процессов на одного пользователя) Возможно fork ждет пока какой нибудь процесс закончится

ival ★★
()
Ответ на: комментарий от Die-Hard

Если бы оно просто подтормаживало, то форк замирал бы чуть больше чем обычно, но не в тысячи раз... ты прав, тормаза, скорее всего, в ядре. Но меня как раз и интересует, почему они стали настолько ощутимыми? Может что-то достигает какого-то ограничения и ждёт когда освободится место? Может какая-то внутренняя нефатальная ошибка, и он пробует снова и снова, пока не получится, не возращая ничего вызывающей программе? Как можно это проверить?

anonymous
()
Ответ на: комментарий от ival

Стоит конечно, максимальное количество 4096. Но моя программа не рожает больше 1050 детей, и то они со временем меняют свои uid и gid. Во время тестов ни один процесс не умирает. Кроме того fork тормазит переодически, после чего 5-6 раз форкает нормально, не похоже, что из-за ограничения. (Свэп тоже не задейстован)

anonymous
()

Причина была найдена. Любой активно-работающий процесс, затормаживает работу каждого 6-7 fork'а на 0.1 (В моей системе) Так как в нормальных условиях fork длится 0.002 секнуды, прихожу к выводу, что планироващик переключает процессы каждую 0.01 секунду, а когда он вернётся к форканию зависит от количество активно-работающих процессов.

Вывод: нужно попробовать поиграться с планировщиками

anonymous
()
Ответ на: комментарий от anonymous

имелся в виду не совмем любой активно-работающий процесс.. а вполне определенный, нагружающий систему на полную. Другие будут тормазить по-другому... главное, что причина ясна.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.