我正在尝试测量我的 socket.io 服务器的响应时间。所以 socket.io 服务器只是回显一条消息,一个测试文件发送消息并记录发送和获取回显之间所需的时间。为了模拟多个客户端,我在管理器文件中使用 child_process 多次启动此测试文件。
奇怪的是,我只用一个测试文件就得到了 0.2 的响应时间。当我启动管理器时,它会再生成 4 个客户端,它会达到 1.3,当我在单独的终端中启动两个管理器时,每个管理器有 4 个客户端,它会达到 3 左右。但是当我只启动一个管理器时,它会产生 10 个客户端(甚至多达像 1000 一样疯狂)结果保持在 1 以下。
再次证明这一点:
manager.js 4 -> spawns 4 childs
manager.js 4 -> spawn 4 childs
test.js -> shows around 3 avg. response time
manager.js 10 -> spawns 10 childs
test.js -> shows around 0.5 avg. response time
那么,为什么多个单独的调用产生 4 个孩子的负载比一个调用多个孩子的负载要多呢?
这是我产生孩子的管理器文件:
var count = process.argv[2] || 1;
console.log("generating " + count + " childs");
for (var i = 0; i < count; i++){
var childProcess = require('child_process');
childProcess.exec('node test.js', function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: '+error.code);
console.log('Signal received: '+error.signal);
}
console.log('Child Process STDOUT: '+stdout);
console.log('Child Process STDERR: '+stderr);
});
}
这是我测量最后一秒平均响应时间的测试文件:
var io = require('socket.io-client');
var rtts = [];
var socket = io.connect('http://localhost:3000');
socket.emit('roundtrip', { time: new Date().getTime() });
socket.on('roundtrip', function (data) {
var roundtripTime = new Date().getTime() - data.time;
rtts.push(roundtripTime);
socket.emit('roundtrip', { time: new Date().getTime() });
});
setInterval(function(){
avgRTT = 0;
for (var i = 0; i < rtts.length; i++){
avgRTT += rtts[i];
}
avgRTT = avgRTT / rtts.length;
console.log("AVG RTT: " + avgRTT);
rtts = [];
}, 1000);
我在 linux mint 64 位上运行它。