服务器端:
脚本文件:
var cluster = require(‘cluster’);
var http = require(‘http’);
var numCPUs = require(‘os’).cpus().length;
// 获取CPU核数
// 主进程一般只在第一次运行,然后常驻内存,监控个子进程,共享资源的目的
if (cluster.isMaster) {
//首次运行,由主进程调用fork(本质是调用child_process),产生多个子进程
require(‘os’).cpus().forEach(function(){
cluster.fork();
});
var counts = new Array(numCPUs);
//共享变量,用于统计各个子进程的调用次数
for (var i = 0; i < counts.length; i++) {
counts[i] =0;
}
cluster.on(‘exit’, function(worker, code, signal) {
//主进程监听有子进程退出时,触发exit 事件
console.log(‘worker ’ + worker.process.pid + ’ died’);
});
cluster.on(‘listening’, function(worker, address) {
// 主进程监听到有子进程生产时,触发listening 事件
console.log(“A worker with #”+worker.id+” is now connected to ” +
address.address +
“:” + address.port);
});
// 主进程监听到子进程的发送来的消息时,触发message事件,这是共享的关键,因为各子进程相互独立,占有各自的内出以及CPU资源,
所以需要统一的主进程调控,统一,达到共享某些指定的资源的目的,比如本处的counts 数组
cluster.on(‘message’,function (msg) {
counts[msg.id-1]++;
console.log(counts.toString());
});
} else {
http.createServer(function(req, res) {
console.log('Worker #' + cluster.worker.id + ' has a request');
process.send({ id:cluster.worker.id}); //进程通信
,实际上是发送给中间媒介,主线程
res.writeHead(200);
console.time('Time');
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
}
sleep(5000)/
res.end("hello world\n");
console.log('Worker #' + cluster.worker.id + ' make a response');
console.timeEnd('Time');
}).listen(8000);
}
客户端:
客户端模拟http(GET)请求,每间隔一秒,向服务器端发送一起请求。
var http = require(‘http’);
function IntervalReq()
{
http.get(“http://127.0.0.1:8000“, function(res) { // http.get(option,[callback]),http请求
console.log(“Got response: ” + res.statusCode);
}).on(‘error’, function(e) { // 请求失败(服务器端无响应),输出错误
console.log(“Got error: ” + e.message);
})
}
setInterval(IntervalReq, 1000); // 每隔一秒,发送一次请求
图三、 对每隔一秒的请求的响应的负载情况
结果发现,8核CPU,一般会调用5核,而且,这5核负载比较均衡,但是还有3核一久没用调用。以后经过测试,如果,缩短请求间隔,改为每100毫秒请求一次,测试结果,令人满意:
图四、 对每隔100毫秒的响应负载情况
结果分析:
为什么请求间隔,这么影响负载情况?
个人分析,在每秒隔间请求时,由于间隔时间较长,所以较少的CPU数,可以应付并不密集的请求,但是当,请求间隔改为100毫秒时,前者的核心数,可能不能够足以应付这么高的请求,所以全部CPU核都会被调用
,这底层的调用算法上,基本能够随机的调用各个子进程,从而较长时间看,负载情况,会符合算法期望。