Выбор () + UDP приводит к слишком большому количеству открытых файлов - PullRequest
1 голос
/ 29 июня 2010

В настоящее время у меня есть оператор select (), настроенный для отслеживания двух UDP-сокеров.Я посылаю примерно 10-20 сообщений в секунду в один общий сокет данных, что интерпретируется так, как я ожидал.

Однако, когда я набрал около 1024 сообщений, я получил уведомление:

talker: socket: слишком много открытых файлов. Talker: не удалось связать сокет

Это логично для меня, так как ulimit -n показывает максимум 1024 открытых файла для этого пользователя.Но почему все эти открытые файлы?С UDP соединение не устанавливается, поэтому я не верю, что мне нужно каждый раз закрывать сокет (хотя, возможно, я ошибаюсь).

Есть идеи?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Если вы используете Linux, выполните strace(1) на клиенте, чтобы проверить системные вызовы socket(2) и open(2) против close(2) (попробуйте вариант -e trace=socket,open,close). На данный момент это самый простой способ сбалансировать количество дескрипторов файлов.

1 голос
/ 29 июня 2010

Я думаю, что в этом случае «слишком много открытых файлов» действительно означает, что вы достигли предела дескриптора файла;сетевые сокеты учитываются в этом пределе.Вы уверены, что больше ничего - скажем, в routehelper - это не создает дополнительные сокеты?

На какой платформе вы работаете?Если Linux, lsof или грохочет в /proc/<pid>/fd - пока он работает, пока не достигнет предела - может показать, куда идут все fds.

Совет: не полагайтесь начисленно больше socket_udp_inboundRC - лучше явно сравнить их значения хотя бы один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...