Лучший подход к написанию Linux-сервера на C (phtreads, select или fork? )

У меня очень специфический вопрос о программировании серверов в UNIX (Debian, ядро ​​2.6.32). Моя цель — научиться писать сервер, который может обслуживать огромное количество клиентов. Моя цель - более 30 000 одновременных клиентов (даже когда мой колледж упоминает, что 500 000 возможны, что кажется ОЧЕНЬ огромным количеством :-)), но я действительно не знаю (даже что возможно), и поэтому я спрашиваю здесь. Итак, мой первый вопрос. Сколько одновременных клиентов возможно? Клиенты могут подключаться в любое время, вступать в контакт с другими клиентами и формировать группу (1 группа содержит максимум 12 клиентов). Они могут общаться друг с другом, поэтому размер пакета TCP/IP зависит от отправляемого сообщения. Клиенты также могут отправлять математические формулы на сервер. Сервер решит их и передаст ответ группе. Это достаточно тяжелая операция.

Мой текущий подход заключается в запуске сервера. Чем использовать fork для создания процесса демона. Процесс-демон привязывает сокет fd_listen и начинает прослушивание. Это цикл while (1). Я использую accept() для получения входящих вызовов.

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

В начале программы я читаю файл /proc/sys/kernel/threads-max и в соответствии с ним создаю свои потоки. Количество возможных потоков в соответствии с этим файлом составляет около 5000. Это далеко от количества клиентов, которых я хочу обслуживать. Другой подход, который я рассматриваю, заключается в использовании select() и создании наборов. Но время доступа для поиска сокета в наборе составляет O (N). Это может быть довольно долго, если у меня подключено более пары тысяч клиентов. Пожалуйста, поправьте меня, если я ошибаюсь.

Думаю, мне нужны идеи :-)

Groetjes Маркус

П.С. я помечаю его как C++ и C, потому что он применим к обоим языкам.

8
задан markus_p 2 April 2012 в 14:58
поделиться