2015-01-14 1 views
1

Я пытаюсь узнать, как использовать epoll для создания сервера, который принимает и выполняет команды от клиента (логин, файл загрузки и т. Д.). До сих пор я получил программу, чтобы просто отправить клиенту все данные, которые он получает, но я заметил, что когда я пытался реализовать перечисленные мной команды, сервер обрабатывал бы только один запрос за раз.Передача нескольких одновременных запросов с использованием epoll

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

ответ

1

Если ваша архитектура представляет собой epoll + single thread, тогда у нее будет какая-то проблема блокировки, если ваша команда будет большой нагрузкой. Вот почему производительность redis упадет, когда какая-то команда блокируется.

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

epoll + команда за поток: как вы сказали. Но создание и уничтожение потоков добавит стоимость, когда нагрузка будет расти. Часто переключатель контекста также является огромной проблемой.

epoll + thread pool: Образец идеи. Но без недостатков выше.

epoll основанный слушатель + N * (работник epoll): это интересно структура. Слушатель epoll получит запрос от пользователя, но вместо того, чтобы напрямую назначить задание потоку, он регистрирует дескриптор файла на epoll одного из следующих рабочих. Таким образом, поток слушателя освобождается и может быстрее принимать соединения.

+0

Я не уверен, что такое «redis», но это звучит интересно. Кроме того, мне очень нравится идея epoll + thread. Как вы думаете, что будет сравнивать производительность для команды на поток? –

+0

Еще один маленький вопрос, есть ли общее правило, сколько потоков я должен поместить в пул потоков, если бы я пошел на проект с потоком epoll + thread? –

+0

redis - это более или менее популярное хранилище данных в этой отрасли. вы имеете в виду epoll + threadpool? Это было бы лучше, чем epoll + (команда на поток), теоретически. Тестирование производительности - большая тема. Я сомневаюсь, что вы видите разницу, учитывая небольшой набор тестов. – qqibrow