Кластеризация Node.js - 1 рабочий на ядро ​​замедляет основной поток? - PullRequest
0 голосов
/ 07 января 2019

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

if (cluster.isMaster)
{
    console.log('Initializing...');

    // Fork workers.
    for (let i = 0; i < os.cpus().length; i++)
    {
        cluster.fork();
    }
}
else
{
    doWork();
}

Для системы, имеющей 4 физических ядра, этот код будет разветвляться 4 раза для каждого ядра. Это означает, что в итоге мы получим основной поток + 4 рабочих потока == 5 потоков.

Кажется, у нас на одного работника больше, чем мы можем справиться! Чтобы гарантировать, что основной поток работает нормально, не должен ли код быть следующим: os.cpus().length - 1, чтобы мы оставили одно ядро ​​доступным для работы основного потока?

Для моих целей

Я использую сервер UDP, на котором я хочу, чтобы половина моих работников обрабатывала входящие пакеты, а другая половина отправляла тонны пакетов в секунду внутри функции setInterval.

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

В этом случае, я бы использовал os.cpus().length - 1 в цикле разветвления for, или я бы использовал os.cpus().length?

Заранее спасибо!

РЕДАКТИРОВАТЬ: я заметил, что есть вопрос, похожий на мой, и ответ объясняет, что основной поток обычно тратит очень мало времени на распространение, так что если оставить одно ядро ​​доступным для него, это, вероятно, оставит это ядро ​​бездействующим. Я верю, что это верно для TCP / IP, но в моем случае я ожидаю около 30-60 пакетов в секунду от каждого клиента, "подключенного" к моему серверу, поэтому будет постоянный поток входящих пакетов, который может отличаются от того, как выглядит трафик TCP / IP.

1 Ответ

0 голосов
/ 07 января 2019

Я считаю, что главный поток является только балансировщиком нагрузки и просто направляет запросы каждому из порожденных / разветвленных рабочих потоков. Таким образом, у вас есть один поток на ядро ​​вашего приложения + один поток для управления запросами. Если у вас есть os.cpus (). Length - 1, вы не будете использовать все свои ядра процессора.

...