У меня очень специфический вопрос о программировании сервера в UNIX (Debian, ядро 2.6.32).Моя цель - научиться писать сервер, который может обслуживать огромное количество клиентов.Моя цель - более 30 000 одновременных клиентов (даже когда мой колледж упоминает, что возможно 500 000, что кажется QUIIITEEE огромной суммой :-)), но я действительно не знаю (даже что возможно), и поэтому я спрашиваюВот.Итак, мой первый вопрос.Сколько одновременных клиентов возможно?Клиенты могут подключаться в любое время и связываться с другими клиентами и формировать группу (1 группа содержит до 12 клиентов).Они могут общаться друг с другом, поэтому размер пакета TCP / IP зависит от отправленного сообщения.Клиенты также могут отправлять математические формулы на сервер.Сервер их решит и передаст ответ обратно группе.Это довольно тяжелая операция.
Мой текущий подход - запустить сервер.Чем использовать fork для создания процесса демона.Процесс демона связывает сокет fd_listen и начинает слушать.Это цикл while (1).Я использую accept () для получения входящих звонков.
После подключения клиента я создаю pthread для этого клиента, который будет выполнять связь.Клиенты добавляются в группу и совместно используют часть памяти (необходимо для поддержания работы группы), но каждый клиент работает в отдельном потоке.Получение доступа к памяти было довольно трудным делом, но теперь работает нормально.
В начале программы я зачитал файл / proc / sys / kernel / threads-max и в соответствии с этим я создаю свои потоки.Количество возможных потоков в соответствии с этим файлом составляет около 5000. Далеко от количества клиентов, которые я хочу иметь возможность обслуживать.Другой подход, который я рассматриваю, заключается в использовании select () и создании наборов.Но время доступа для поиска сокета в наборе равно O (N).Это может быть довольно долго, если у меня подключено более пары тысяч клиентов.Пожалуйста, поправьте меня, если я ошибаюсь.
Ну, я думаю, мне нужны некоторые идеи: -)
Groetjes Markus
PS Я помечаю его для C ++ и C, потому что он применяетсяна оба языка.