Когда лучше использовать кластеризацию или worker_threads? - PullRequest
1 голос
/ 20 апреля 2020

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

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

NodeJS в одном потоке:

NodeJS запускает один поток, который мы называем событием l oop, несмотря на то, что в фоновом режиме ОС и Libuv обрабатывают рабочий пул по умолчанию для асинхронных задач ввода-вывода .

Мы должны использовать одно ядро ​​для события-l oop, несмотря на то, что рабочие могут использовать разные ядра. Я предполагаю, что в конце они сортируются планировщиком ОС.

NodeJS как многопоточные:

При использовании библиотеки "worker_threads" в одном и том же процессе Различные экземпляры v8 / Libuv работают для каждого потока. Таким образом, они совместно используют один и тот же контекст и взаимодействуют между потоками с «портом сообщений» и остальной частью API.

Каждый рабочий поток запускает свой поток Event l oop. Предполагается, что потоки должны быть разумно сбалансированы между ядрами процессора, что повышает производительность. Я предполагаю, что в конце они сортируются планировщиком ОС.

Вопрос 1: Когда рабочий использует рабочий пул ввода-вывода по умолчанию, все те же потоки, что и у других рабочих, совместно используются? или каждый работник имеет свой собственный рабочий пул по умолчанию?

NodeJS в мультиобработке:

При использовании библиотеки "cluster" мы разделяем работать среди разных процессов. Каждый процесс настроен на отдельное ядро, чтобы сбалансировать нагрузку ... ну, главное событие l oop - это то, что в итоге устанавливается в другое ядро, поэтому он не разделяет ядро ​​с другим тяжелым событием l oop. Звучит разумно, чтобы сделать это таким образом.

Здесь я хотел бы общаться с некоторыми IP C tacti c.

Вопрос 2: И рабочий пул по умолчанию для этого NodeJS обработать? где они? сбалансирован среди остальных ядер, как и ожидалось в первом случае? Тогда они могут быть на тех же ядрах, что и другие рабочие пулы кластера. Не лучше ли сказать, что мы балансируем основные потоки (циклы событий), а не «процесс»?

С учетом всего сказанного главный вопрос:

Вопрос 3: лучше ли использовать кластеризацию или worker_threads? Если обе используются в одном и том же коде, как обе библиотеки могут достичь наилучшей производительности? или они просто могут просто вступить в конфликт? или, в конце концов, ОС получает контроль?

1 Ответ

1 голос
/ 20 апреля 2020

Каждый рабочий поток имеет свой основной l oop (libuv et c). Как и каждый клонированный nodejs процесс, когда вы используете кластеризацию.

Кластеризация - это способ сбалансировать нагрузку входящих запросов к вашему nodejs серверу на несколько копий этого сервера.

Рабочие потоки - это способ для одного nodejs процесса разгрузить долго выполняющиеся функции в отдельный поток, чтобы избежать блокировки его собственного главного l oop.

, который лучше ? Это зависит от проблемы, которую вы решаете. Рабочие потоки предназначены для длительных функций. Кластеризация позволяет серверу обрабатывать больше запросов, обрабатывая их параллельно. Вы можете использовать оба, если вам нужно: чтобы каждый nodejs процесс кластера использовал рабочий поток для долго выполняющихся функций.

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

Процессы узла (будь то кластеризация или рабочие потоки) не привязаться к указанным c ядрам (или процессорам Intel) на хост-машине; планирование ОС хоста назначает ядра по мере необходимости. Планировщик ОС хоста минимизирует издержки переключения контекста при назначении ядер для запускаемых процессов. Если у вас слишком много активных Javascript экземпляров (cluster instances + worker threads), ОС хоста выдаст им временные интервалы в соответствии со своими алгоритмами планирования. Кроме того, что нужно избегать слишком большого числа Javascript экземпляров, нет смысла пытаться угадать планировщик ОС.

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

Nodejs В кластерной функциональности используется схема fork / exe c базовой ОС для создания нового процесса ОС для каждого экземпляр кластера. Итак, каждый экземпляр кластера имеет свой собственный пул libuv.

Если вы работаете в масштабе, скажем, с более чем десятью хост-машинами, на которых работает сервер nodejs, тогда вы можете потратить время на оптимизацию Javascript экземпляров.

Не забудьте nginx, если вы используете его в качестве обратного прокси-сервера для работы с https. Он также требует некоторого процессорного времени, но использует многопоточность с мелким зерном, поэтому вам не придется об этом беспокоиться, если у вас огромный трафик c.

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