实现单台测试机6万websocket长链接

本文由做者郑银燕受权网易云社区发布。node

本文是我在测试过程当中的记录,实现了单台测试机发起最大的websocket长链接数。在一台测试机上,链接到一个远程服务时的本地端口是有限的。根据TCP/IP协议,因为端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,因此能分配的端口只是1024到65534,也就是64511个。也就是说,一台机器一个IP只能建立六万多个websocket长链接。linux

1、客户端参数调优web

本文采用的测试机分别为黑mac系统和linux系统(因为黑mac机器自己性能问题,最大只能达到2万链接,因而换用linux)。下面先以mac系统为例,阐述下客户端参数调优,linux系统相似,这里不作阐述。shell

一、修改全局限制,系统默认的最大链接数限制安全

命令:sysctl kern.maxfilesbash

说明:全局限制,也就是系统默认的最大链接数限制是12288服务器

修改大小: sudo sysctl -w kern.maxfiles=1048600websocket

说明:设置系统最大链接数从12288到1048600socket

二、测试脚本是一个进程,开启上万个长链接,还须要修改单个进程的最大链接数。性能

命令:sysctl kern.maxfilesperproc

说明:单个进程默认最大链接数限制是10240

修改大小:sudo sysctl -w kern.maxfilesperproc=1048576

说明:设置进程链接数限制,进程的最大链接数要小于等于全局链接数

三、因为客户端与服务端须要创建大量的socket,因此咱们须要调速一下最大文件描述符。

命令:ulimit -n

说明:“ulimit -n”命令显示当前shell能打开的最大文件数,默认值:256,该值老是小于kern.maxfilesperproc的值,由于一个shell就是一个进程。

修改大小:ulimit -n 1048576

说明:设置当前shell能打开的最大文件数为1048576,该值不能大于kern.maxfilesperproc,不然会提示设置失败。

四、因为系统默认参数,自动分配的端口数有限,因此咱们须要更改客户端ip端口号的参数

命令:sysctl net.inet.ip.portrange,查询获得的系统默认的端口号分配以下:

将可分配的首个端口号设置为1024

修改大小:sudo sysctl net.inet.ip.portrange.first=1024

五、按以上的方式设置参数有个问题,当系统重启后,这些参数又恢复成了默认值,解决办法就是把参数写到/etc/sysctl.conf文件中,可是,默认这个文件是不存在的,因此首先就要建立它:

sudo touch /etc/sysctl.conf

而后把参数写到文件里

kern.maxfiles=1048600

kern.maxfilesperproc=1048576

net.inet.ip.portrange.first=1024

net.inet.ip.portrange.last=65535

重启系统,查看结果,显示成功。

至于ulimit -n的值,能够把ulimit -n 1048576 写到.bashrc中实现自动修改。

2、测试脚本

客户端脚本采用nodejs编写,之因此不采用jmeter的方式,是由于jmeter每一个链接都是线程的方式,而单台测试机最好保持开启1000个之内的线程,不然机器容易崩溃。

测试脚本以下:

var cwd = process.cwd();var WebSocketClient = require('websocket').client;var size = 10000;var host = 'example.com:80';var port = 443;var authInterval = 10;var index = 0;

setInterval(function(){ if(index < size){

uid = index;
        cid = index;
        init(uid, cid);
        index++;
    }

},authInterval);console.log('begin...');
init = function(uid, cid){ var client = new WebSocketClient();

client.connect('ws://XX.XX.XX.XX:XXXX/ws?token='+index,"","http://example.com:80");
client.on('connectFailed', function(error) {        console.log('Connect Error: ' + error.toString());
});

client.on('connect', function(connection) {        console.log(index+' Connected');
    connection.on('error', function(error) {            console.log("Connection Error: " + error.toString());
    });
    connection.on('close', function(error) {            console.log(error + ';  Connection Closed');            //client.close();
        reconnect();
    });
    connection.on('message', function(message) {
        
    });
});

};function timeLogout(){ return setTimeout(function (){

logout(uid);
}, StartTime);

}

3、测试结果

在相应的目录下输入命令node websocket.js,便可创建websocket链接。因为机器性能问题,链接数达到2w左右,就没法创建新的链接了。后面将机器改为云主机,能够达到6万的链接数。

4、后续展望

个人测试目标不是实现单台6万的链接数。个人目标是能够达到百万级稳定的长链接,而且能够向websocket服务器收发信息,计算每一个消息从服务器发送到客户端接收的平均耗时时间,以及查看创建百万级链接,服务器的内存和cpu的使用状况。最终限制于机器的性能,暂时还没作到。而且业务需求繁忙,这个测试就暂时告一段落了。后续想要经过使用虚拟IP的方式来实现百万级链接,好比增长了18个IP地址,这样就能够产生18 * 60000 = 1080000个链接。或者借用更多的机器数,每台机器维持6万链接。

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请访问网易云社区。

文章来源: 网易云社区

相关文章
相关标签/搜索