Подтвердить что ты не робот

Является ли "epoll" важной причиной того, что Tornadoweb (или Nginx) так быстро?

Tornadoweb и Nginx популярны веб-серверов на данный момент, и многие бенчмаркинга показывают, что они имеют лучшую производительность, чем Apache при определенных обстоятельствах. Поэтому мой вопрос:

Является ли "epoll" самой важной причиной, которая делает их такими быстрыми? И что я могу узнать из этого, если я хочу написать хороший сервер сокетов?

4b9b3361

Ответ 1

Если вы хотите написать сервер сокетов, хорошей отправной точкой является статья Дэна Кегеля C10k из нескольких лет назад:

http://www.kegel.com/c10k.html

Я также нашел, что Beej Guide to Network Programming очень удобен:

http://beej.us/guide/bgnet/

Наконец, если вам нужна отличная рекомендация, там UNIX Network Programming by W. Richard Stevens et. Al:.

http://www.amazon.com/Unix-Network-Programming-Sockets-Networking/dp/0131411551/ref=dp_ob_title_bk

В любом случае, чтобы ответить на ваш вопрос, основное различие между Apache и Nginx заключается в том, что Apache использует один поток для каждого клиента с блокировкой ввода-вывода, тогда как Nginx является однопоточным с неблокирующими ввода-выводами. Пул работников Apache уменьшает накладные расходы при запуске и дестабилизирующих процессах, но по-прежнему делает CPU переключением между несколькими потоками при обслуживании нескольких клиентов. С другой стороны, Nginx обрабатывает все запросы в одном потоке. Когда один запрос должен выполнить сетевой запрос (скажем, на бэкэнд), Nginx присоединяет обратный вызов к серверному запросу и затем работает с другим активным запросом клиента. На практике это означает, что он возвращается в цикл событий (epoll, kqueue или select) и запрашивает файловые дескрипторы, которым есть что сообщить. Обратите внимание, что системный вызов в цикле основных событий на самом деле является блокировкой, потому что ничего не делать, пока один из дескрипторов файлов не будет готов для чтения или записи.

Таким образом, основная причина, по которой Nginx и Tornado эффективны при обслуживании множества одновременных клиентов: существует только один процесс (таким образом, сохраняя RAM) и только один поток (таким образом, сохраняя CPU из контекстных переключателей). Что касается epoll, это просто более эффективная версия select. Если есть N открытых файловых дескрипторов (сокетов), он позволяет выбрать те, которые готовы для чтения в O (1) вместо O (N). Фактически, Nginx может использовать select вместо epoll, если вы скомпилируете его с опцией --with-select_module, и я уверен, что он по-прежнему будет более эффективен, чем Apache. Я не так знаком с внутренними компонентами Apache, но быстрый grep показывает, что он использует select и epoll - возможно, когда сервер прослушивает несколько портов/интерфейсов или если он выполняет одновременные бэкэнд-запросы для одного клиента.

Кстати, я начал с этого материала, пытаясь написать базовый сервер сокетов, и хотел выяснить, насколько Nginx настолько эффективен. После просмотра исходного кода Nginx и чтения этих руководств/книг, с которыми я связан выше, я обнаружил, что было бы проще писать модули Nginx вместо моего собственного сервера. Так родилось теперь полу-легендарное руководство Emiller по разработке модулей Nginx:

http://www.evanmiller.org/nginx-modules-guide.html

(Предупреждение: руководство было написано против Nginx 0.5-0.6, и API, возможно, изменились.) Если вы делаете что-либо с HTTP, я бы сказал, что Nginx сделал снимок, потому что он разработал все волосатые детали работы с глупых клиентов. Например, небольшой сервер сокетов, который я написал для удовольствия, отлично работал со всеми клиентами - кроме Safari, и я никогда не выяснял, почему. Даже для других протоколов Nginx может быть правильным путем; Eventing довольно хорошо абстрагируется от протоколов, поэтому он может прокси-HTTP, а также IMAP. Кодовая база Nginx очень хорошо организована и очень хорошо написана, за одним исключением. Я не стал бы следовать за ним, когда речь заходит о переносе парсера протокола; вместо этого используйте генератор синтаксического анализатора. Я написал несколько статей об использовании генератора парсера (Ragel) с Nginx здесь:

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

Все это было, вероятно, больше информации, чем вы хотели, но, надеюсь, вы найдете ее полезной.

Ответ 2

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

Отъезд libevent (используется gevent, обычно быстрее и стабильнее, чем торнадо) или libev для реализаций.