«Epoll» является основной причиной, что Tornadoweb (или nginx) так быстро?

StackOverflow https://stackoverflow.com/questions/2583350

  •  24-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Если вы хотите написать сервер сокета, хорошая отправная точка - это статья C10K Dan Kegel от нескольких лет назад:

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

Я также нашел руководство Beej к сетевой программированию, чтобы быть довольно удобным:

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

Наконец, если вам нужна отличная ссылка, есть сетевое программирование Unix 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 уменьшает накладные расходы процессов запуска и дебита, но он по-прежнему делает переключатель ЦП между несколькими потоками при обслуживании нескольких клиентов. Nginx, с другой стороны, обрабатывает все запросы в одном потоке. Когда один запрос должен сделать сетевой запрос (скажем, на бэкэнде), NGINX прикладывает обратный вызов к запросу на бэкэнду, а затем работает на другом активный клиентский запрос. На практике это означает, что он возвращается к контуре события (epoll, kqueue, или select) и просит дескрипторы файлов, которые имеют что-то сообщить. Обратите внимание, что системный вызов в основном цикле событий на самом деле является операцией блокировки, потому что нечего делать, пока один из дескрипторов файлов не будет готов к чтению или записи.

Таким образом, это главная причина, по которой Nginx и Tornado эффективны при обслуживании многих одновременных клиентов: есть только один процесс (таким образом, чтобы сохранить RAM) и только один нить (таким образом, чтобы сохранить CPU из контекстных коммутаторов). Что касается EPOLL, это просто более эффективная версия выбора. Если есть n открытых дескрипторов файлов (розетки), он позволяет выбрать те, которые готовы к чтению в O (1) вместо O (n) времени. На самом деле, Nginx может использовать выбор вместо EPOLL, если вы компилируете его с --with-select_module Опция, и я замер, это все равно будет более эффективным, чем Apache. Я не такой знакомый с внутренними Apache, но быстрый GREEP показывает, что он использует Select и Epoll -, вероятно, когда сервер прослушивает несколько портов / интерфейсов, или если он выполняет одновременные запросы на один клиент.

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

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

(ПРЕДУПРЕЖДЕНИЕ. Руководство было написано от Nginx 0,5-0,6 и API, возможно, изменилось.) Если вы делаете что-нибудь с HTTP, я бы сказал, дайте Nginx выстрел, потому что он разрабатывает все волосатые детали, касающиеся глупых клиентов. Например, маленький сервер сокета, который я написал для удовольствия, отлично работал со всеми клиентами - кроме сафари, и я никогда не выяснил, почему. Даже для других протоколов Nginx может быть правильным способом идти; Сохранение довольно хорошо рассуждено от протоколов, поэтому он может прокси HTTP, а также IMAP. База кода Nginx чрезвычайно хорошо организована и очень хорошо написана, с одним исключением, которые упоминают. Я бы не следил за его ведущим, когда дело доходит до ручного протокола анализатора; Вместо этого используйте генератор парсера. Я написал некоторые вещи о использовании генератора парсера (Ragel) с Nginx здесь:

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

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

Другие советы

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

Проверить либел (использован завещание, как правило, быстрее и более устойчивые, чем торнадо) или либев для реализации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top