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

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

本文是我在测试过程中的记录,实现了单台测试机发起最大的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万连接。

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

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

相关文章:
【推荐】 考拉消息中心消息盒子处理重构(策略模式)
【推荐】 windows系统下npm升级的正确姿势以及原理
【推荐】 网易云易盾与A10 Networks达成战略合作 携手打造抗DDoS攻击的解决方案

原文地址:https://www.cnblogs.com/zyfd/p/10113900.html

时间: 2024-07-31 14:45:27

实现单台测试机6万websocket长连接的相关文章

HTML5 中websocket长连接的具体实现方法

HTML5中通过调用与数据通信相关的Web Socket API,实现从服务器中推送信息到客户端. Socket又称为套接字,是基于W3C标准开发在一个TCP接口中进行双向通信的技术.通常情况下,Socket用于描述IP地址和端口,是通信过程中的一个字符句柄.当服务器端又多个应用服务绑定一个Socket时,通过通信中的字符句柄,实现不同端口对应不同应用服务功能.目前,大部分浏览器都支持HTML5中Socket API的运行. WebSocket连接服务器和客户端,这个链接是一个实时的长连接,服务

Spring+Stomp+ActiveMq实现websocket长连接

stomp.js+spring+sockjs+activemq实现websocket长连接,使用java配置. pom.xml(只列出除了spring基本依赖意外的依赖,spring-version为4.3.3.RELEASE): <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1

用nginx的Push_stream_module推送模块管理WebSocket长连接会不会限制WebSocket的双向通信的能力

最近项目在用nginx的Push_stream_module推送模块去实现服务器端向客户端信息的推送,本来只想实现这个单向通信的需求的,可是给客户端推送完消息之后,如果想让客户端给一个反馈,就没办法监听获取到客户端的反馈事件,并及时作出反应.后来知道push_stream_module管理长连接是基于pub/sub模式的,而且好像模块中也没有给出类似websocket中onmessage的API,是不是就是限制了webSocket全双工的通信能力,这点好像nodejs的socket.io做的就更

websocket长连接

代码如下: using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; namespace SYW_WebScoket { public class WebSocketManager : Singleto

WebSocket 长连接

<?php class SocketService { private $address = 'localhost'; private $port = 80; private $_sockets; public function __construct($address = '', $port='') { if(!empty($address)){ $this->address = $address; } if(!empty($port)) { $this->port = $port;

HTTP长连接200万尝试及调优

对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一.这种应用常见于消息推送系统,也称为comet应用,比 如聊天室或即时消息推送系统等.comet应用具体可见我之前的介绍,在此不多讲.对于这类系统,因为很多消息需要到产生时才推送给客户端,所以当没有消 息产生时,就需要hold住客户端的连接,这样,当有大量的客户端时,就需要hold住大量的连接,这种连接我们称为长连接. 首先,我们分析

HTTP长连接200万尝试及调优方法

转自:http://www.linuxde.net/2011/10/1230.html 对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一.这种应用常见于消息推送系统,也称为comet应用,比如聊天室或即时消息推送系统等.comet应用具体可见我之前的介绍,在此不多讲.对于这类系统,因为很多消息需要到产生时才推送给客户端,所以当没有消息产生时,就需要hold住客户端的连接,这样,当有

Vue+WebSocket 实现页面实时刷新长连接

Vue+WebSocket 实现页面实时刷新长连接:https://www.cnblogs.com/fmixue/p/9110074.html 看完让你彻底搞懂Websocket原理:https://blog.csdn.net/frank_good/article/details/50856585 webSocket长连接实现demo(场景:扫码自动跳转登录,或者替换轮询):https://blog.csdn.net/GordoHu/article/details/78293803 原文地址:h

使用四种框架分别实现百万websocket常连接的服务器

著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的**,单机1万还是一个非常值得挑战的目标.但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情.现在用任何一种主流语言都能提供单机1万的并发处理的能力.所以现在目标早已提高了100倍,变成C1000k,也就是一台服务器为100万连接提供服务.在2010年,2011年已经看到一些实现C1000K的文章