Зачем запускать один процесс Node.js на ядро? - PullRequest
0 голосов
/ 24 февраля 2019

В соответствии с https://nodejs.org/api/cluster.html#cluster_cluster, необходимо запускать столько же процессов Node.js параллельно, сколько и ядер на машине.Предполагаемая причина этого заключается в том, что Node.js является однопоточным.

Однако действительно ли это так?Конечно, код JavaScript и цикл обработки событий выполняются в одном потоке, но Node также имеет пул рабочих потоков.Число потоков в этом пуле по умолчанию равно 4. Так почему имеет смысл запускать один процесс Node на ядро?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

В указанном документе четко указано, что Node является однопоточным:

Один экземпляр Node.js выполняется в одном потоке.Чтобы воспользоваться преимуществами многоядерных систем, пользователь иногда захочет запустить кластер процессов Node.js для обработки нагрузки.

Таким образом, процесс Node имеет один поток, если только новые потоки не являютсясозданные с соответствующими API, такими как child_process, cluster, собственные надстройки или несколько встроенных модулей , использующих libuv тредпул:

Используются API-интерфейсы асинхронной системыNode.js, когда это возможно, но там, где они не существуют, пул потоков libuv используется для создания API-интерфейсов асинхронных узлов на основе API-интерфейсов синхронных систем.API-интерфейсы Node.js, использующие пул потоков:

все API-интерфейсы fs, кроме API-интерфейсов наблюдателя файлов и явно синхронных

crypto.pbkdf2 ()

crypto.randomBytes (), если только он не используется без обратного вызова

crypto.randomFill ()

dns.lookup ()

все API-интерфейсы zlib, кроме тех, которые явно указанысинхронный

В одном потоке используется 1 ядро ​​ЦП, чтобы максимально использовать имеющиеся ресурсы и использовать многоядерный ЦП, должно быть несколько потоков, как правило, количество ядер используется..

Если процессы кластера занимают 100% ЦП, и известно, что существуют другие потоки или внешние процессы (служба базы данных), которые будут бороться за ядра ЦП с процессами кластера, число процессов кластера может быть уменьшено.

0 голосов
/ 24 февраля 2019

Эта статья содержит обзор расширения механизма потоков файла node.js, который стоит прочитать.

Короче говоря, основной вопрос в простом node.js - лишь несколько функцийзвонки использует пул потоков (DNS и FS звонки).Ваш звонок в основном выполняется по циклу событий только .Так, например, если вы написали веб-приложение, в котором каждый запрос занимает 100 мс синхронно, вы обязаны 10req / s.Пул потоков не будет задействован.А для увеличения пропускной способности в многоядерной системе стоит использовать другие ядра.

Тогда приходят асинхронные функции или функции обратного вызова.Хотя это дает вам чувство распараллеливания, на самом деле происходит ожидание завершения асинхронного кода в фоновом режиме, чтобы цикл обработки событий мог работать с вызовом другой функции.После этого коды обратного вызова по-прежнему должны выполняться в цикле событий, поэтому весь ваш написанный код по-прежнему выполняется в одном-единственном цикле событий, поэтому он не сможет использовать возможности многоядерных систем.

...