Socket.io基准测试

6
我想对我的socket.io服务器进行基准测试。我想测试服务器可以处理多少并行连接和消息。然而,当我使用约200个WebSocket开始基准测试时,我的socket.io服务器会在几分钟后崩溃。
我尝试使用node.js的cluster模块将进程分配到各个核心上。但是在使用cluster模块后,一些连接会在一段时间后断开。
我用于测试的服务器是亚马逊云上的虚拟服务器,具有以下属性:
7 GB内存
20个EC2计算单元(每个具有2.5个EC2计算单元的8个虚拟核心)
1690 GB实例存储
64位平台
I/O性能:高
API名称:c1.xlarge 这是基准测试客户端的代码:
var fs = require('fs');
var io = require("socket.io-client");
var host = "http://localhost:3000";
var timeLog = fs.createWriteStream(__dirname+'/public/time.log',{flags:'a',mode:0666,   encoding:'encoding'});
var count = 200;
var sockets = [];
var total = 0;
var countTime = 0; 
var echo = exports;
echo.start = function() {
    fs.writeFile('public/time.log',"",function(err){
        if(err) throw err;
    });

    for(var i=0;i<count;i++){
        var socket = io.connect(host,{"force new connection":true});
        sockets.push(socket);
        //console.log(i);
        socket.on("message",function(message){
            countTime++;
            time = new Date().getTime()-message;
            total+=time;
            timeLog.write(time+"\n");
            socket.send(new Date().getTime());
        });
        socket.on("disconnect",function(){
            console.log("disconnect");
        });
    }

    parallelSockets();
    var j = 0;
}

function parallelSockets(){
    for(var i = 0 ;i<count;i++){
        sockets[i].send(new Date().getTime());
    }
}

以下是socket.io服务器端的代码:

socket.on('message',function(message){
    start = new Date().getTime();
    socket.send(message);
    end = new Date().getTime() - start;
    logfile.write(end+"\n");
});

socket.io是否有安全机制来阻止客户端发送太多的并行消息和连接?

有人可以帮我吗?


Node.js 在崩溃时会打印什么错误信息? - Vadim Baryshev
Node.js 只在崩溃时打印单词“Killed”。 - CodeChiller
可能是因为您的文件描述符不足。请尝试在运行node.js的相同用户下运行ulimit -n(如果您至少在Linux上)。您可以使用ulimit更改此值,或者更永久地,在配置文件中,例如/etc/security/limits.{conf,d} - Linus Thiel
我也遇到了同样的问题。你找到解决方法了吗?我正在我的MacBook Pro上测试我的节点测试。我已经设置了u限制,但是什么都没有改变。在200-250个连接后仍然会出现“无法调用null的'payload'方法”的错误。 - Ali Ersöz
我的程序每隔一分钟或两分钟就会崩溃,并显示错误消息:else throw new Error('not opened'); 这是在socket.io-client模块的Websocket.js文件中。我认为socket.io-client出了点问题。 - Maziyar
3个回答

4
我对Socket.IO和SockJS服务器实现进行了基准测试。 这里是测试结果 测试套件 该测试套件使用Java编写,支持三种传输方式:Socket.IO 0.7+,SockJS 0.2+,原始Websockets。没有预编译二进制文件可用,但您可以使用Eclipse进行编译或只需使用命令行javac即可。

谢谢你的回答,我有一个问题。你是如何使用2000个WebSockets进行Socket.io基准测试的?我只能打开大约1000个sockets。如果我想打开更多,服务器会崩溃或不可用。 - CodeChiller
请确保按照此处所述的方式增加限制:http://serverfault.com/questions/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system - Joes
@Joes 在单个核心上还是集群中进行测试的?编辑:算了,使用单个核心,哇,45k的出站速率?太疯狂了。谢谢你提供的基准数据!! - NiCk Newman

3

0

你可以检查Akinji

它会打开并发套接字到服务器,并监听给定的消息并将其打印出来

http://github.com/sonsuzdongu/akinji

python akinji.py -c 100 --host localhost --port 3000 --waitFor 100 --on "some msg"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接