Nodejs不同版本的cluster负载均衡测试
发布于 2天前 作者 struCoder 131 次浏览 来自 分享

做这个测试的原因

之所以做这个测试是因为,昨天听到同事说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*版本测试结果 1.png

第二张图为node v0.11*版本测试结果 2.png

第三张图为node v0.12*版本测试结果 3.png

可以明显的开出在这三个不同版本中测试结果,目前我暂不清楚在node0.12版本之前 pm2是怎么实现正确的负载均衡的。

最后

本文为原创,允许转载,但请保留此链接 http://www.itodo.me/u/p/detail/gxjo9TBvenx8q8NkB

文章文字叙述或者代码有不正确的地方欢迎指正. :)

1 回复

windows 上的测试结果,对于绝大多数部署在 linux 服务器上的程序来说。。是否有借鉴意义? 使用 cluster 模式的时候,pm2 完全不懂怎么正确的进行负载均衡,pm2 也是忠实地在使用 cluster 而已。

回到顶部