Обработка более 1024 файловых дескрипторов в C на Linux - PullRequest
7 голосов
/ 11 мая 2009

Я работаю на многопоточном сетевом сервере, используя epoll (edge-triggered) и нити, и использую httperf для тестирования моего сервера.

Пока что он работает очень хорошо или почти точно с той скоростью, с которой отправляются запросы. До барьера 1024, где все замедляется до 30 запросов в секунду.

Запуск в 64-битной Ubuntu 9.04.

Я уже пробовал:

  • Успешно увеличено максимальное количество дескрипторов файлов. Это просто не повышает производительность выше 1024 одновременных подключений.

    andri @ filefridge: ~ / Dropbox / School / Group 452 / Код / сервер $ ulimit -n
    20000

Я почти уверен, что это замедление происходит в операционной системе так же, как и до отправки события в epoll (и да, я также увеличил лимит в epoll).

Мне нужно измерить, сколько одновременных подключений может обработать моя программа, пока она не начнет замедляться (без вмешательства операционной системы).

Как заставить мою программу работать с более чем 1024 дескрипторами файлов?

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

Обновление

Спасибо за все ваши ответы, но я думаю, что нашел виновника. После переопределения __FD_SETSIZE в моей программе все стало двигаться намного быстрее. Конечно, ulimit также необходимо повысить, но без __FD_SETSIZE моя программа никогда не воспользуется этим.

Ответы [ 3 ]

6 голосов
/ 12 мая 2009

Спасибо за все ваши ответы, но я думаю, что нашел виновника. После переопределения __FD_SETSIZE в моей программе все стало двигаться намного быстрее. Конечно, ulimit также нужно поднимать, но без __FD_SETSIZE моя программа никогда не воспользуется этим.

4 голосов
/ 11 мая 2009

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

Он также содержит информацию о том, как повысить производительность вашего ядра при одновременной обработке большого количества соединений.

0 голосов
/ 06 июля 2011

Только не надо.

Да, я имею в виду.

Если вам нужно увеличить дескрипторы файлов, в вашем коде есть скрытая ошибка. Выследите это вместо того, чтобы рассматривать его симптомы. Не забудьте закрыть файловые дескрипторы, когда закончите.

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