资讯专栏INFORMATION COLUMN

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

marser / 2700人阅读

摘要:本文是我在测试过程中的记录,实现了单台测试机发起最大的长连接数。也就是说,一台机器一个只能创建六万多个长连接。四后续展望我的测试目标不是实现单台万的连接数。或者借用更多的机器数,每台机器维持万连接。文章来源网易云社区

本文由作者郑银燕授权网易云社区发布。

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

一、客户端参数调优

本文采用的测试机分别为黑mac系统和linux系统(由于黑mac机器本身性能问题,最大只能达到2万连接,于是换用linux)。下面先以mac系统为例,阐述下客户端参数调优,linux系统类似,这里不做阐述。

1、修改全局限制,系统默认的最大连接数限制

命令:sysctl kern.maxfiles

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

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

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

2、测试脚本是一个进程,开启上万个长连接,还需要修改单个进程的最大连接数。

命令:sysctl kern.maxfilesperproc

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

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

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

3、由于客户端与服务端需要建立大量的socket,所以我们需要调速一下最大文件描述符。

命令:ulimit -n

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

修改大小:ulimit -n 1048576

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

4、由于系统默认参数,自动分配的端口数有限,所以我们需要更改客户端ip端口号的参数

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

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

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

5、按以上的方式设置参数有个问题,当系统重启后,这些参数又恢复成了默认值,解决办法就是把参数写到/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中实现自动修改。

二、测试脚本

客户端脚本采用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);

}

三、测试结果

在相应的目录下输入命令node websocket.js,即可建立websocket连接。由于机器性能问题,连接数达到2w左右,就无法建立新的连接了。后面将机器改成云主机,可以达到6万的连接数。

四、后续展望

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

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

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

文章来源: 网易云社区

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25364.html

相关文章

  • 八问WebSocket协议:为你快速解答WebSocket热门疑问

    一、引言 WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持。它使用方面、应用广泛,已经渗透到前后端开发的各种场景中。 对http一问一答中二式流程(就是从所周之的长轮询技要啦)的不满,催生了支持双向通信的WebSocket诞生。WebSocket是个不太干净协议。 本文将从8个常见的疑问入手,为还不了解WebSocket协议的开发者快...

    Zoom 评论0 收藏0
  • 物联网高并发编程之单台服务器最大并发TCP连接

    摘要:对端,通过增加内存修改最大文件描述符个数等参数,单机最大并发连接数超过万甚至上百万是没问题的,国外公司在产品环境中已做到万并发 [TOC] 前言 曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。 我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用...

    leap_frog 评论0 收藏0
  • 记一次性能优化,单台4核8G机器支撑5QPS

    摘要:前言这篇文章的主题是记录一次程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。因为我们的连接数只有,一旦请求过多,势必会导致数据库瓶颈。我们再次压测,结果显示万,服务器数据库连接正常,连接正常,响应时间平均为,错误率为。 前言 这篇文章的主题是记录一次Python程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的。为大家提供一个优化的思路,首先要声明的一点是,我的方式...

    Barry_Ng 评论0 收藏0
  • 推送技术原理:移动无线网络连接

    摘要:在移动无线网络下维护长连接,相对也有一些技术上的难度。大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰表中的对应项,造成链路中断。 因为手机平台本身、电量、网络流量的限制,移动互联网应用在设计上跟传统 PC 上的应用很大不一样,需要根据手机本身的特点,尽量的节省电量和流量,同时又要尽可能的保证数据能及时到达客户端。 为了解决数据同步的问题,在手机平台上,常用的方法有2种。...

    qiangdada 评论0 收藏0
  • 【猿团专访】| 潜心研究的云视“华山派”,关于技术研发的那些事

    时通讯开发云注册开发者3000多个,平台承载的注册用户大概500W以上;融智服务云产品1.0,3月份上线,短短一个月的试用期内也已经累积了300多家企业用户。良好的市场反馈背后则是云视互动的技术掌门人刘宏仓和技术团队的不懈努力。用他的话来说,云视互动不但是IM通信行业有竞争力的代表,其技术团队更是一个自我修炼,潜心研究的华山派。 云视互动是集消息推送、富媒体聊天、音视频互动、PSTN融合为一体的服...

    HackerShell 评论0 收藏0

发表评论

0条评论

marser

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<