Почему Nginx настолько быстр, что вообще не может остановиться?

Java


Фундаментальный

Модель процесса Nginx

Сервер Nginx при нормальной работе:

  1. мультипрогресс: один главный процесс, несколько рабочих процессов
  2. Основной процесс: Управление рабочими процессами
    1. Внешний интерфейс: получить外部的操作(Сигнал)
    2. Входящая переадресация: согласно外部的操作разница, через信号Управление работниками
    3. Мониторинг: отслеживайте текущее состояние рабочего процесса и автоматически перезапускайте рабочий процесс после аварийного завершения рабочего процесса.
  3. Рабочий процесс: все рабочие процессы равны
    1. Фактическая обработка: сетевые запросы, обрабатываемые рабочим процессом;
    2. Количество рабочих процессов: настраивается в nginx.conf, обычно установлено значение核心数, полностью использовать ресурсы ЦП и в то же время избегать слишком большого количества процессов, избегать конкуренции процессов за ресурсы ЦП и увеличивать потери при переключении контекста.

считать:

  1. Запрос подключен к Nginx, а процесс Master отвечает за обработку и пересылку?
  2. Как выбрать, какой рабочий процесс будет обрабатывать запрос? Проходит ли результат обработки запроса через главный процесс?

Установление HTTP-соединения и обработка запросов:

  1. При запуске Nginx процесс Master загружает файл конфигурации.
  2. Мастер-процесс, который инициализирует прослушивающий сокет
  3. Мастер-процесс, разветвление нескольких рабочих процессов
  4. Процесс Worker соревнуется за новые соединения, победившая сторона устанавливает соединение Socket через трехстороннее рукопожатие и обрабатывает запрос.

Высокая производительность Nginx, высокий параллелизм:

  1. Nginx использует:多进程 + 异步非阻塞Способ(IO 多路复用Эполл)
  2. Полный процесс запроса:
    1. установить соединение
    2. запрос на чтение: разбор запроса
    3. обработать запрос
    4. Отвечать на запросы
  3. Полный процесс запроса, соответствующий нижнему слою, таков: чтение и запись событий сокета.

Модель обработки событий Nginx

request: http-запрос в Nginx.

Базовый режим работы веб-сервера HTTP:

  1. получить запрос: читать построчно请求行а также请求头, посчитав, что у сегмента есть тело запроса, прочтите请求体
  2. обработать запрос
  3. вернуть ответ: По результату обработки сформировать соответствующий HTTP-запрос (响应行,响应头,响应体)

Nginx — это та же рутина, и общий процесс такой же.

Модульная архитектура

Модули nginx можно условно разделить на следующие типы в зависимости от их функций:

  • event module: Создайте структуру механизма обработки событий, независимую от операционной системы, и обеспечьте обработку определенных событий. Включая ngx_events_module, ngx_event_core_module и ngx_epoll_module и т. д. Какой модуль обработки событий использует nginx, зависит от конкретной операционной системы и параметров компиляции.
  • phase handler: Модули этого типа также напрямую называются модулями-обработчиками. Он в основном отвечает за обработку клиентских запросов и создание содержимого, на которое нужно ответить, например, модуль ngx_http_static_module, который отвечает за обработку запроса статической страницы клиента и подготовку соответствующего файла на диске для вывода содержимого ответа.
  • output filter: также известный как модуль фильтра, он в основном отвечает за обработку выходного содержимого и может изменять вывод. Например, может быть реализована такая работа, как добавление предопределенной нижней панели ко всем выходным HTML-страницам или замена URL-адреса выходного изображения.
  • upstream: восходящий модуль реализует функцию обратного прокси, перенаправляет реальный запрос на внутренний сервер, считывает ответ с внутреннего сервера и отправляет его обратно клиенту. Upstream-модуль — это специальный обработчик, но содержимое ответа на самом деле не генерируется само по себе, а считывается с внутреннего сервера.
  • load-balancer: модуль балансировки нагрузки реализует определенный алгоритм и выбирает сервер в качестве сервера пересылки для запроса среди множества внутренних серверов.

Анализ общих проблем

Nginx vs. Apache

nginx против апача:

Модель сетевого ввода-вывода:

  1. nginx: мультиплексирование ввода-вывода, epoll (kqueue на freebsd)
    1. высокая производительность
    2. Высокий параллелизм
    3. Занимают меньше системных ресурсов
  2. Apache: блокировка + многопроцессорность/многопоточность
    1. более стабильный и менее глючный
    2. больше модулей

Ссылаться на:Ууху. Call.com/question/19…

Сцены:

При обработке нескольких запросов вы можете использовать:IO 多路复用или阻塞 IO +多线程

  1. мультиплексирование ввода-вывода:一个 线程, который отслеживает несколько состояний сокетов,就绪, в зависимости от того, что читается или пишется;
  2. блокировка ввода-вывода + Многопоточность: для каждого запроса создайте новый сервисный поток.

считать:IO 多路复用а также多线程применимые сценарии?

  • IO 多路复用: Нет преимущества в скорости обработки запросов одного соединения, подходит дляИнтенсивный ввод-выводсцена, управляемая событиями
    • большой параллелизм: использовать только один поток, обрабатывать большое количество одновременных запросов, сокращатьконтекстПотери при переключении, нет необходимости учитывать проблемы параллелизма, можно обработать относительно больше запросов;
    • Потреблять меньше системных ресурсов (не требуется线程调度开销)
    • применять к长连接case (многопоточный режим长连接Легко вызывает线程过多,причина频繁调度)
  • 阻塞IO + 多线程: Прост в реализации, не может полагаться на системные вызовы, подходит дляинтенсивное использование процессораСцены
    • Каждая нить требует времени и места;
    • Когда количество потоков растет, накладные расходы на планирование потоков растут экспоненциально.

Nginx максимальное количество подключений

Основной фон:

  1. Nginx — это многопроцессная модель, и для обработки запросов используется рабочий процесс;
  2. Количество подключений (файловый дескриптор fd) для одного процесса с верхним пределом (nofile):ulimit -n
  3. Настройте максимальное количество соединений для одного рабочего процесса на Nginx:worker_connectionsограниченоnofile
  4. Настройте количество рабочих процессов на Nginx:worker_processes

Поэтому максимальное количество подключений для Nginx:

  1. Максимальное количество подключений к Nginx:Worker 进程数量 x 单个 Worker 进程的最大连接数
  2. Выше указано максимальное количество подключений при использовании Nginx в качестве основного сервера.
  3. Nginx как反向代理сервер, максимальное количество подключений, которые можно обслужить :(Worker 进程数量 x 单个 Worker 进程的最大连接数)/ 2.
  4. Когда обратный прокси-сервер Nginx установитClient 的连接а также后端 Web Server 的连接, занимает 2 соединения

считать:

  1. Каждый открытый сокет занимает один fd
  2. Почему,一个进程Есть ли ограничение на количество открываемых fd?

приложение

HTTP-запросы и ответы

  • HTTP-запрос:
    1. Строка запроса:method,uri,http version
    2. заголовок запроса
    3. тело запроса
  • HTTP-ответ:
    1. Строка ответа:http version,status code
    2. заголовок ответа
    3. тело ответа

Модель ввода-вывода

Сцены:

При обработке нескольких запросов вы можете использовать:IO 多路复用или阻塞 IO +多线程

  1. мультиплексирование ввода-вывода:一个 线程, который отслеживает несколько состояний сокетов,就绪, в зависимости от того, что читается или пишется;
  2. блокировка ввода-вывода + Многопоточность: для каждого запроса создайте новый сервисный поток.

считать:IO 多路复用а также多线程применимые сценарии?

  • IO 多路复用: нет преимущества в скорости обработки запросов от одного подключения
    • большой параллелизм: использовать только один поток, обрабатывать большое количество одновременных запросов, сокращатьконтекстПотери при переключении, нет необходимости учитывать проблемы параллелизма, можно обработать относительно больше запросов;
    • Потреблять меньше системных ресурсов (не требуется线程调度开销)
    • применять к长连接case (многопоточный режим长连接Легко вызывает线程过多,причина频繁调度)
  • 阻塞IO + 多线程: Реализация проста и не может полагаться на системные вызовы.
    • Каждая нить требует времени и места;
    • Когда количество потоков растет, накладные расходы на планирование потоков растут экспоненциально.

Сравнение select/poll и epoll

Для получения подробной информации см.:

выбрать/опросить системный вызов:

// select 系统调用int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); // poll 系统调用int poll(struct pollfd fds[], nfds_t nfds, int timeout);

select:

  • Запрос fd_set, есть ли就绪изfd, вы можете установить超时时间, когда fd (файловый дескриптор) готов или истекло время ожидания;
  • fd_set — это位集合, размер указан编译内核константа, размер по умолчанию 1024
  • Функции:
    • Лимит подключений, число fd, которое может быть представлено fd_set, слишком мало;
    • Линейное сканирование: Чтобы определить, готов ли fd, вам нужно пройти одну сторону fd_set;
    • репликация данных: пространство пользователя и пространство ядра, копироватьсостояние готовности соединенияИнформация

poll:

  • решеноЛимит подключений:
    • В опросе fd_set в select заменяется на pollfd数组
    • решатьfd 数量过小Проблема
  • репликация данных: пространство пользователя и пространство ядра, копироватьсостояние готовности соединенияИнформация

epoll: событие управляемое событием

  • механизм события:избегатьЛинейное сканирование
    • для каждого фд,注册Один监听事件
    • фд изменился на就绪, добавить fd в就绪链表
  • количество фд: Неограничено (ограничение на уровне ОС, сколько fds может быть открыто одним процессом)

выбрать, опрос, epoll:

  1. I/O多路复用Механизмы;
  2. I/O多路复用С помощью механизма можно отслеживать несколько дескрипторов, и как только дескриптор готов (обычно готов к чтению или записи), программа может быть уведомлена о выполнении соответствующих операций чтения и записи.
    1. монитор多个文件描述符
  3. А вот select, poll, epoll по сути все同步I/O:
    1. 用户进程ответственный读写(от内核空间скопировать в用户空间), в процессе чтения и записи пользовательский процесс блокируется;
    2. 异步 IO, без того, чтобы пользовательский процесс отвечал за чтение и запись, асинхронный ввод-вывод будет отвечать за内核空间скопировать в用户空间;

Возможности параллельной обработки Nginx

Что касается возможностей параллельной обработки Nginx:

  • Количество одновременных подключений после общей оптимизации может поддерживаться на уровне около 1~3 Вт. (Количество памяти и процессорных ядер разное, будет место для дальнейшей оптимизации)

адрес блога:www.liangsonghua.com

Обратите внимание на общедоступную учетную запись WeChat: отчет о консервированных яйцах Songhua Preserved Egg на доске, становитесь более захватывающим!

Введение в общедоступную учетную запись: делитесь техническими знаниями о работе на JD.com, а также технологиями JAVA и лучшими отраслевыми практиками, большинство из которых являются прагматичными, понятными и воспроизводимыми.