實(shí)現(xiàn)單臺(tái)測(cè)試機(jī)6萬(wàn)websocket長(zhǎng)連接

本文由作者鄭銀燕授權(quán)網(wǎng)易云社區(qū)發(fā)布。


本文是我在測(cè)試過(guò)程中的記錄,實(shí)現(xiàn)了單臺(tái)測(cè)試機(jī)發(fā)起最大的websocket長(zhǎng)連接數(shù)。在一臺(tái)測(cè)試機(jī)上,連接到一個(gè)遠(yuǎn)程服務(wù)時(shí)的本地端口是有限的。根據(jù)TCP/IP協(xié)議,由于端口是16位整數(shù),也就只能是0到?65535,而0到1023是預(yù)留端口,所以能分配的端口只是1024到65534,也就是64511個(gè)。也就是說(shuō),一臺(tái)機(jī)器一個(gè)IP只能創(chuàng)建六萬(wàn)多個(gè)websocket長(zhǎng)連接。

一、客戶端參數(shù)調(diào)優(yōu)


本文采用的測(cè)試機(jī)分別為黑mac系統(tǒng)和linux系統(tǒng)(由于黑mac機(jī)器本身性能問(wèn)題,最大只能達(dá)到2萬(wàn)連接,于是換用linux)。下面先以mac系統(tǒng)為例,闡述下客戶端參數(shù)調(diào)優(yōu),linux系統(tǒng)類(lèi)似,這里不做闡述。

1、修改全局限制,系統(tǒng)默認(rèn)的最大連接數(shù)限制


命令:sysctl kern.maxfiles


說(shuō)明:全局限制,也就是系統(tǒng)默認(rèn)的最大連接數(shù)限制是12288

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



說(shuō)明:設(shè)置系統(tǒng)最大連接數(shù)從12288到1048600

2、測(cè)試腳本是一個(gè)進(jìn)程,開(kāi)啟上萬(wàn)個(gè)長(zhǎng)連接,還需要修改單個(gè)進(jìn)程的最大連接數(shù)。

命令:sysctl kern.maxfilesperproc


說(shuō)明:?jiǎn)蝹€(gè)進(jìn)程默認(rèn)最大連接數(shù)限制是10240

修改大?。簊udo sysctl -w kern.maxfilesperproc=1048576


說(shuō)明:設(shè)置進(jìn)程連接數(shù)限制,進(jìn)程的最大連接數(shù)要小于等于全局連接數(shù)

3、由于客戶端與服務(wù)端需要建立大量的socket,所以我們需要調(diào)速一下最大文件描述符。


命令:ulimit -n


說(shuō)明:“ulimit?-n”命令顯示當(dāng)前shell能打開(kāi)的最大文件數(shù),默認(rèn)值:256,該值總是小于kern.maxfilesperproc的值,因?yàn)橐粋€(gè)shell就是一個(gè)進(jìn)程。

修改大?。?strong>ulimit?n 1048576

說(shuō)明:設(shè)置當(dāng)前shell能打開(kāi)的最大文件數(shù)為1048576,該值不能大于kern.maxfilesperproc,否則會(huì)提示設(shè)置失敗。

4、由于系統(tǒng)默認(rèn)參數(shù),自動(dòng)分配的端口數(shù)有限,所以我們需要更改客戶端ip端口號(hào)的參數(shù)


?命令:sysctl net.inet.ip.portrange,查詢得到的系統(tǒng)默認(rèn)的端口號(hào)分配如下:


將可分配的首個(gè)端口號(hào)設(shè)置為1024

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



5、按以上的方式設(shè)置參數(shù)有個(gè)問(wèn)題,當(dāng)系統(tǒng)重啟后,這些參數(shù)又恢復(fù)成了默認(rèn)值,解決辦法就是把參數(shù)寫(xiě)到/etc/sysctl.conf文件中,但是,默認(rèn)這個(gè)文件是不存在的,所以首先就要?jiǎng)?chuàng)建它:


sudo touch /etc/sysctl.conf

然后把參數(shù)寫(xiě)到文件里

kern.maxfiles=1048600

kern.maxfilesperproc=1048576

net.inet.ip.portrange.first=1024

net.inet.ip.portrange.last=65535

重啟系統(tǒng),查看結(jié)果,顯示成功。

至于ulimit -n的值,可以把ulimit -n 1048576?寫(xiě)到.bashrc中實(shí)現(xiàn)自動(dòng)修改。


二、測(cè)試腳本


客戶端腳本采用nodejs編寫(xiě),之所以不采用jmeter的方式,是因?yàn)閖meter每個(gè)連接都是線程的方式,而單臺(tái)測(cè)試機(jī)最好保持開(kāi)啟1000個(gè)以內(nèi)的線程,否則機(jī)器容易崩潰。


測(cè)試腳本如下:

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);
}


三、測(cè)試結(jié)果


在相應(yīng)的目錄下輸入命令node websocket.js,即可建立websocket連接。由于機(jī)器性能問(wèn)題,連接數(shù)達(dá)到2w左右,就無(wú)法建立新的連接了。后面將機(jī)器改成云主機(jī),可以達(dá)到6萬(wàn)的連接數(shù)。

四、后續(xù)展望

我的測(cè)試目標(biāo)不是實(shí)現(xiàn)單臺(tái)6萬(wàn)的連接數(shù)。我的目標(biāo)是可以達(dá)到百萬(wàn)級(jí)穩(wěn)定的長(zhǎng)連接,并且可以向websocket服務(wù)器收發(fā)信息,計(jì)算每個(gè)消息從服務(wù)器發(fā)送到客戶端接收的平均耗時(shí)時(shí)間,以及查看建立百萬(wàn)級(jí)連接,服務(wù)器的內(nèi)存和cpu的使用情況。最終限制于機(jī)器的性能,暫時(shí)還沒(méi)做到。并且業(yè)務(wù)需求繁忙,這個(gè)測(cè)試就暫時(shí)告一段落了。后續(xù)想要通過(guò)使用虛擬IP的方式來(lái)實(shí)現(xiàn)百萬(wàn)級(jí)連接,比如增加了18個(gè)IP地址,這樣就可以產(chǎn)生18 * 60000 = 1080000個(gè)連接?;蛘呓栌酶嗟臋C(jī)器數(shù),每臺(tái)機(jī)器維持6萬(wàn)連接。


免費(fèi)領(lǐng)取驗(yàn)證碼、內(nèi)容安全、短信發(fā)送、直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐

更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問(wèn)網(wǎng)易云社區(qū)。



相關(guān)文章:
【推薦】?網(wǎng)易云容器服務(wù)微服務(wù)化實(shí)踐—微服務(wù)測(cè)試及鏡像化提測(cè)全流程實(shí)踐
【推薦】?預(yù)售倉(cāng)庫(kù)修正小工具
【推薦】?淺談代碼結(jié)構(gòu)的設(shè)計(jì)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容