У меня есть 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 вилки не лучше двух вилок.
Спасибо за информацию. Тогда для Node.js другая половина ядер используется только для асинхронного кода? Требуется ли кластер или это означает, что Node.js использует только один поток выполнения, но ** также ** другие параллелируют потоки (~ ядра?) Для асинхронного кода? Кроме того, поскольку я разрабатываю игру, она в основном связана с процессором. Но я видел, что в github работают некоторые 'setTimeout (updateClients, 0);' в mainloop, потому что «асинхронные обновления увеличивают производительность». Правильно ли они? – zbeyens
Узел сам по себе ничего не планирует, это зависит от ОС (а также от самого процессора). Если у вас есть код с привязкой к процессору, «кластер» может вам помочь, потому что он позволит вам запускать тяжелый код CPU в отдельном процессе, что ОС может планировать на другой код как «основную» часть приложения , Использование тэга 'setTimeout()' очень полезно, если вы смешиваете ядро ввода-вывода и связанное с ЦП ядро вместе в одном и том же процессе. – robertklep