我有4个核心,根据这个例子运行了这段代码:
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个fork(上面的代码),我得到了以下结果:
第1函数:1698.801毫秒 第2函数:3282.679毫秒 第3函数:3425.090毫秒 第4函数:3290.384毫秒 第5函数:3424.922毫秒
使用3个fork,我得到了以下结果:
第1函数:1695.155毫秒 第2函数:1822.867毫秒 第3函数:2444.156毫秒 第4函数:2606.680毫秒
使用2个fork,我得到了以下结果:
第1函数:1684.929毫秒 第2函数:1682.897毫秒 第3函数:1686.123毫秒
我不明白这些结果。难道不是每个核心一个fork(即1个fork/核心)才是最佳选择吗?在这里,我发现4个fork并不比2个fork更好。
setTimeout(updateClients, 0);
,因为“异步更新可以提高性能”。他们是正确的吗? - zbeyenscluster
可以帮助您,因为它允许您在单独的进程中运行CPU密集型代码,该进程可以由操作系统调度到应用程序的不同代码作为“主”部分。如果您将I/O绑定和CPU绑定的核心混合在同一个进程中,则使用setTimeout()
技巧很有用。 - robertklep