Так что меня немного беспокоит пример кода, который я нахожу в сети, когда дело доходит до кластеризации 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.