做这个测试的原因
之所以做这个测试是因为,昨天听到同事说nodejs在0.10* 版本中的负载均衡没有达到预期的效果,他也做了他的测试 刚好这几天我自己也不怎么的忙,所以就去官网看了看关于cluster相关的API,于是就有了下面的内容。
测试思路
fork
出子进程创建http
服务器- 主进程监听子进程的发来的消息进行统计
- 主进程发起一定数量的
http
请求, 请求完后进行统计
实现代码
文件结构
|--clusterMode.js
|--req.js
clusterMode.js代码
var cluster = require('cluster');
var http = require('http');
var cpus = require('os').cpus().length;
if (cluster.isMaster) {
var workers = 0;
var workerObj = {};
var options = {
hostname: 'localhost',
port: 3050,
path: '/',
agent: false
}
console.log('master process start up...');
for (var i = 0; i < cpus; i++) {
cluster.fork();
}
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].on('message', function(pid) {
workerObj['process id: ' + pid] += 1;
});
})
cluster.on('listening', function(worker, address) {
workerObj['process id: ' + worker.process.pid] = 0;
console.log('worker process id: ' + worker.process.pid);
});
cluster.on('exit', function(worker, code, signal) {
console.log('worker: ' + worker.process.pid + ' died');
});
cluster.on('online', function(worker) {
workers +=1;
if (workers === 4) {
setTimeout(function() {
var totalReq = 100;
var selfReq = require('./req');
console.log('requesting');
selfReq(options, totalReq, function() {
console.log('req end');
console.log('waiting for result...');
setTimeout(function() {
console.log(workerObj);
}, 2500);
});
}, 2000);
}
});
} else {
var server = http.createServer(function(req, res) {
process.send(process.pid);
res.end();
});
server.listen(3050);
}
req.js代码
var http = require('http');
module.exports = function(options, totalReq, cb) {
var finishReq = 0;
for(var i = 0; i < totalReq; i ++) {
(function(j) {
http.get(options, function(res) {
finishReq += 1;
if (finishReq === totalReq && typeof cb === 'function') {
cb();
}
}).on('error', function(e) {
console.log('error: ',e);
});
})(i);
}
}
测试结果
第一张图为node v0.10*版本测试结果
第二张图为node v0.11*版本测试结果
第三张图为node v0.12*版本测试结果
可以明显的开出在这三个不同版本中测试结果,目前我暂不清楚在node0.12版本之前 pm2是怎么实现正确的负载均衡的。
最后
本文为原创,允许转载,但请保留此链接 http://www.itodo.me/u/p/detail/gxjo9TBvenx8q8NkB
文章文字叙述或者代码有不正确的地方欢迎指正. :)