2012-06-15 5 views
3

Я написал чат-сервер, используя C на Linux. Я тестировал то же самое, и он отлично работает в отношении производительности. Единственное, что отстает в том, что я использую системный вызов select для обработки дескрипторов сокетов. Так как выбор имеет предел 1024, поэтому при максимальном чате сервер может обрабатывать только 1024 пользователей одновременно.Что касается обработки более 1024 дескрипторов сокетов

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

Пожалуйста, предложите мне наиболее эффективный способ разрешения этой ситуации.

+2

Возможный дубликат [Обработка более 1024 дескрипторов файлов, в C на Linux] (http: // stackoverflow.com/questions/848717/handling-more-than-1024-file-descriptors-in-c-on-linux) –

+2

Определенно использовать epoll over select – jxh

+0

Ссылка, предоставленная выше, Christian.K определенно обеспечивает решение этой проблемы. – alk

ответ

2

Ваш вопрос известен как C10K problem (как иметь дело с более чем 10 тысячами одновременных подключений). Вы найдете много ресурсов в Интернете, например. this one.

И вы должны рассмотреть select как устаревший системный вызов. Даже только с десятками файловых дескрипторов, вы должны по крайней мере предпочитаете poll

Обратите внимание, что Qt и Gtk предоставить вам с техникой петлевых событий, часто с использованием poll (и QtCore или Glib может быть использован за пределами графических интерфейсов). Существует также libev и libevent. Я предлагаю использовать один из них.

1

Linux не имеет ограничения по 1024 на select(). Но:

  1. выберите() производительность очень бедных
  2. FreeBSD делает :)

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

Использование Epoll() предпочтительнее на Linux, однако я хотел бы предложить использовать libevent

Libevent быстро, чистый и портативный способ реализации высоконагруженных серверов и для Linux он имеет Epoll под капотом.

5

poll() может быть использован в качестве почти смесевых замен select(), и позволит более 1024 дескрипторов файлов (вы можете сделать массив, переданный poll(), как большой, как вы хотите).

Он будет иметь аналогичные характеристики для select(), так как требует применения ядра и пользовательского пространства для сканирования всего массива - но если select() работает хорошо для вас, того poll() должно тоже. (Фактически наблюдается небольшое улучшение производительности в poll() - поле .events, указывающее события, которые вас интересуют для каждого файлового дескриптора, не изменяется на poll(), поэтому вам не нужно перестраивать массив перед каждым вызовом, как вы делаете с набор дескрипторов файла передан в select()).

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

Смежные вопросы