2016-09-15 2 views
1

У меня есть 4 ядра и побежал этот код в соответствии с this example:Node.js кластер - оптимальное количество рабочих

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

var id = 0; 
if (cluster.isWorker) { 
    id = cluster.worker.id; 
} 

var iterations = 1000000000; 
console.time('Function #' + id); 
for (var i = 0; i < iterations; i++) { 
    var test = 0; 
} 
console.timeEnd('Function #' + id); 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
} 

С 4 вилкой (выше кода), я получил:

Функция # 0: 1698.801ms

Функция # 1: 3282.679ms

Функция # 4: 3290.384ms

Функция # 3: 3425.090ms

Функция # 2: 3424.922ms

С 3 вилкой, я получил:

Функция # 0: 1695.155ms

Функция # 2: 1822.867ms

Функция № 3: 2444.156ms

Функция # 1: 2606.680ms

С 2 развилки, я получил:

Функция # 0: 1684.929ms

Функция # 1: 1682.897ms

Функция # 2 : 1686.123ms

Я не понимаю этих результатов. Не 1 вилка/сердечникоптимальный номер? Здесь я вижу, что 4 вилки не лучше двух вилок.

ответ

4

Я предполагаю, что на вашем оборудовании фактически есть только 2 физическое сердечники. Однако из-за hyper-threading (HT) ОС скажет, что есть 4 (логических) ядра.

Работники вашего кода сохраняют (физическое) ядро ​​полностью занятым, что ХТ не может справиться очень хорошо, поэтому производительность при сохранении всех 4 логических ядер будет хуже, чем когда вы сохраняете только 2 физических ядра заняты.

Мой аппаратных средств (Quad Core, так что 4 физические и 8 логических ядер) показывает ту же картину:

  • 8 рабочих:

    Function #5: 926ms 
    Function #3: 916ms 
    Function #1: 928ms 
    Function #4: 895ms 
    Function #7: 934ms 
    Function #6: 905ms 
    Function #8: 928ms 
    Function #2: 928ms 
    
  • 4 рабочих:

    Function #3: 467ms 
    Function #2: 467ms 
    Function #1: 473ms 
    Function #4: 472ms 
    

Это, как правило, правило что число работников, эквивалентное количеству логических ядер в вашем оборудовании, все еще имеет смысл, если ваши работники привязаны к вводу/выводу (что большинство приложений Node).

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

+0

Спасибо за информацию. Тогда для Node.js другая половина ядер используется только для асинхронного кода? Требуется ли кластер или это означает, что Node.js использует только один поток выполнения, но ** также ** другие параллелируют потоки (~ ядра?) Для асинхронного кода? Кроме того, поскольку я разрабатываю игру, она в основном связана с процессором. Но я видел, что в github работают некоторые 'setTimeout (updateClients, 0);' в mainloop, потому что «асинхронные обновления увеличивают производительность». Правильно ли они? – zbeyens

+1

Узел сам по себе ничего не планирует, это зависит от ОС (а также от самого процессора). Если у вас есть код с привязкой к процессору, «кластер» может вам помочь, потому что он позволит вам запускать тяжелый код CPU в отдельном процессе, что ОС может планировать на другой код как «основную» часть приложения , Использование тэга 'setTimeout()' очень полезно, если вы смешиваете ядро ​​ввода-вывода и связанное с ЦП ядро ​​вместе в одном и том же процессе. – robertklep

Смежные вопросы