nginx: многопоточный, но использует несколько процессов? - PullRequest
20 голосов
/ 22 января 2011

Я пытаюсь понять, что делает Nginx настолько быстрым, и у меня есть несколько вопросов.

Насколько я понимаю, Apache либо порождает новый процесс для обслуживания каждого запроса, либо порождает новый поток для обслуживания.каждый запрос.Поскольку каждый новый поток разделяет виртуальное адресное пространство, использование памяти продолжает расти, если поступает несколько одновременных запросов.

Nginx решает эту проблему, имея только один прослушивающий процесс (Master) с одним потоком выполнения AND 2или 3 (число настраивается) рабочих процессов.Этот главный процесс / поток выполняет цикл обработки событий.Эффективно ждет любого входящего запроса.Когда приходит запрос, он передает этот запрос одному из рабочих процессов.

Пожалуйста, исправьте меня, если мое понимание выше неверно

Если вышеприведенное верно, то у меня есть несколько вопросов:

1.) Разве рабочий процесс не будет порождать несколько потоков и не столкнется с той же проблемой, что и apache?

2.) Или nginx быстр, потому что его архитектура, основанная на событиях, использует неблокирующий ввод-вывод под всем этим.Может быть, рабочий процесс порождает потоки, которые только не блокируют ввод-вывод, так?

3.) Что такое «архитектура, основанная на событиях», может ли кто-то действительно упростить ее для такого человека, как я, чтобы понять.Это относится только к non-blocking-io или к чему-то еще?

Я получил ссылку c10k , я пытаюсь пройти через это, но я не думаю, что это арка, основанная на событиях.кажется больше для неблокирующего IO.

Ответы [ 3 ]

52 голосов
/ 25 апреля 2012

Apache использует несколько потоков, чтобы обеспечить каждый запрос собственным потоком выполнения.Это необходимо, чтобы избежать блокировки при использовании синхронного ввода-вывода.

Nginx использует только асинхронный ввод-вывод, что делает блокировку не проблемой.Единственная причина, по которой nginx использует несколько процессов, - это полное использование многоядерных, многопроцессорных и гиперпоточных систем.Даже с поддержкой SMP ядро ​​не может запланировать один поток выполнения на нескольких процессорах.Для каждого логического процессора требуется по крайней мере один процесс или поток.

Таким образом, разница состоит в том, что nginx требует только достаточного количества рабочих процессов для полного использования SMP, тогда как архитектура Apache требует создание нового потока (каждый со своим стеком около ~ 8 МБ) для каждого запроса.Очевидно, что при высоком параллелизме Apache будет использовать гораздо больше памяти и будет страдать от больших издержек из-за поддержки большого количества потоков.

17 голосов
/ 22 января 2011

Это не очень сложно с концептуальной точки зрения.Я постараюсь быть ясным, но я должен сделать некоторое упрощение.

Серверы, основанные на событиях (например, nginx и lighttpd ), используют оболочку вокруг системы мониторинга событий.Например.lighttpd использует libevent для абстрагирования от более совершенной высокоскоростной системы мониторинга событий (см. также libev ).

Сервер отслеживает все неблокирующие соединения, которые он имеет(и запись, и чтение) с использованием простого конечного автомата для каждого соединения.Система мониторинга событий уведомляет серверный процесс о наличии новых данных или о возможности записи дополнительных данных.Это похоже на select() на стероидах, если вы знаете программирование сокетов.Затем серверный процесс просто отправляет запрошенный файл, используя, где это возможно, расширенную функцию, такую ​​как sendfile(), или превращает запрос в процесс CGI, используя сокет для связи (этот сокет будет контролироваться с помощью системы мониторинга событий, как и другие сетевые соединения).

Эта ссылка содержит много полезной информации о внутренностях nginx, на всякий случай.Надеюсь, это поможет.

6 голосов
/ 04 июля 2014

Apache не создает новый поток для каждого запроса.Он поддерживает кэш потоков или группу предварительно разветвленных процессов, к которым отправляет запросы.Количество одновременных запросов ограничено числом дочерних элементов / потоков. Да, но apache не создает новый поток / дочерний элемент для каждого запроса, который был бы смехотворно медленным (даже с потоками, создание и удаление для каждого запроса было бы слишком медленным)

Nginx использует модель мастер-работник.Главный процесс связан с загрузкой конфигурации и созданием / уничтожением / обслуживанием рабочих.Как и Apache, он начинается с нескольких предварительно разветвленных процессов, каждый из которых работает, каждый из которых является рабочим (и один из которых является «основным» процессом).КАЖДЫЙ рабочий процесс разделяет набор прослушивающих сокетов.Каждый рабочий процесс принимает соединения и обрабатывает их, но каждый работник может обрабатывать ТЫСЯЧИ соединений одновременно, в отличие от apache, который может обрабатывать только 1 соединение на одного работника.

Способ, которым nginx достигает этого, заключается в «мультиплексировании».Он не использует libevent, он использует собственный цикл обработки событий, который был разработан специально для nginx и вырос в процессе разработки программного обеспечения nginx.Мультиплексирование работает с использованием цикла для «приращения» через программный блок с помощью блока, работающего с одним фрагментом данных / новым соединением / независимо от соединения / объекта на итерацию цикла.Все это основано на бэкэндах, таких как Epoll (), kqueue () и select ().Который вы должны прочитать на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...