Модель потоков и масштабирования для TCP-сервера с epoll

Я читал документ C10K , а также многие другие документы по теме о масштабировании сервера сокетов. Все пути указывают на следующее:

  1. Избегайте классическая ошибка «количество ниток на соединение».

  2. Предпочитайте epoll, а не Выбрать.

  3. Точно так же устаревший механизм async io в unix может быть трудным в использовании.

Мой простой TCP-сервер просто слушает клиентские соединения на слушающем сокете на выделенном порту. При получении нового соединения анализирует запрос и отправляет ответ. Затем изящно закрывает сокет.

Думаю, я хорошо знаю, как масштабировать это в одном потоке с помощью epoll. Всего один цикл, который вызывает epoll_wait для прослушивающего сокета, а также для существующих клиентских подключений.По возвращении код будет обрабатывать новые, создавая новые клиентские соединения, а также управлять состоянием существующих соединений в зависимости от того, какой сокет только что получил сигнал. И, возможно, некоторая логика для управления тайм-аутом соединения, плавным закрытием сокетов и эффективным распределением ресурсов для каждого соединения. Кажется достаточно простым.

Но что, если я захочу масштабировать это, чтобы воспользоваться преимуществами нескольких потоков и нескольких ядер процессора? Основная идея, которая приходит в голову, такова:

Один выделенный поток для прослушивания входящих подключений на прослушивании TCP разъем. Затем набор из N потоков (или пул потоков) для обработки всех активных одновременных клиентских подключений. Затем придумайте какой-нибудь потокобезопасный способ, с помощью которого поток прослушивания будет «отправлять» новое соединение (сокет) одному из доступных рабочих потоков. (аля IOCP в винде). Рабочий поток будет использовать цикл epoll для всех соединений, которые он обрабатывает, чтобы делать то, что делал бы однопоточный подход.

Я на правильном пути? Или существует стандартный шаблон проектирования для выполнения TCP-сервера с epoll на нескольких потоках ?

Предложения о том, как поток прослушивания будет отправлять новое соединение с пулом потоков?

7
задан selbie 29 November 2011 в 08:11
поделиться