Назад | Перейти на главную страницу

Производительность Nginx при запуске нескольких экземпляров на одном компьютере

Я пытаюсь понять влияние на производительность нескольких экземпляров (мастеров) nginx, работающих на одном компьютере, вместо того, чтобы загружать их все в один экземпляр с использованием разных серверных блоков. Как использование нескольких экземпляров nginx влияет на такие вещи, как оптимизация worker_process и worker_connections?

Я вижу множество советов, указывающих, что worker_process должен отражать количество ядер, и самое большее количество ядер должно быть в два раза больше. Я также должен понимать, что worker_connections должен соответствовать ulimit или быть немного ниже ulimit. Создание слишком большого количества доступных подключений или слишком большого количества рабочих на ядро ​​должно отрицательно сказаться на производительности.

У меня два ядра и ulimit 1024, но у меня есть 4 экземпляра nginx, каждый из которых имеет следующие настройки:

worker_processes 4;
worker_connections: 1024;

Разве это не так, как если бы я worker_processes 16; и worker_connections 4069;?

Примечание. Позвольте мне прояснить, когда я говорю «экземпляры nginx», я имею в виду, что существует 4 независимых главных процесса nginx, каждый из которых загружает другой файл конфигурации с аналогичными настройками, и каждый со своими рабочими.

Примечание 2: этот сценарий я унаследовал и уже реализовал. Я пытаюсь понять, следует ли мне изменить способ настройки nginx и иметь для этого обоснованную причину.

С точки зрения системы, нет никаких существенных различий в работе 4 мастеров с 4 секциями серверов или одного мастера с 16 секциями серверов. Он реализует ту же архитектуру: параллельные процессы на основе событий.

Соотношение рабочих / основных необходимо учитывать по отношению к общему количеству рабочих по всем вашим мастерам, если у вас их несколько. Это происходит из-за нескольких ограничений:

  • убедитесь, что процессоры не перегружены, поэтому количество рабочих должно быть <= количество ядер
  • убедитесь, что распараллеливание и планирование ОС используются максимально эффективно, поэтому количество рабочих должно быть как можно большим.
  • Рабочие HTTP-сервера мало загружают процессор и в основном ждут операций ввода-вывода, поэтому на самом деле безопасно выделить что-то между 2 или 4-кратным количеством ядер.

Это должно быть немного более эффективным с одним мастером, поскольку несколько ресурсов, таких как карты MIME и т. Д., Будут загружены только один раз. Но это мелочь.

Это должно быть более эффективным с одним мастером, потому что есть один большой пул рабочих, совместно используемых всеми серверами. Если одному серверу на мгновение требуется большинство рабочих (скажем, 16), он может их получить. В конфигурации с несколькими мастерами (скажем, 4 мастера с 4 рабочими) они могут использовать только то, что у них есть: 4 рабочих. С другой стороны, это может быть желаемый эффект: строго разделить на 4 экземпляра, чтобы каждый из них всегда привлекал хотя бы четверть внимания вашего хозяина. Но больше никогда.

С одним мастером должно быть проще настраивать и поддерживать (подумайте: обновления безопасности).

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

Если ваши 4 мастера не используют разные версии Nginx, вы не получите преимуществ от сверхоптимизации, такой как наличие точного набора модулей, скомпилированных для каждого мастера.