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

Nginx: Многопоточность, но использует несколько процессов?

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

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

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

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

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

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

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

3.) То, что "точно" - это "архитектура, основанная на событиях", может ли кто-то действительно упростить ее, так как я понимаю, как я. Это относится только к неблокирующему или другому?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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