摘要:本文是我在測(cè)試過程中的記錄,實(shí)現(xiàn)了單臺(tái)測(cè)試機(jī)發(fā)起最大的長(zhǎng)連接數(shù)。也就是說,一臺(tái)機(jī)器一個(gè)只能創(chuàng)建六萬多個(gè)長(zhǎng)連接。四后續(xù)展望我的測(cè)試目標(biāo)不是實(shí)現(xiàn)單臺(tái)萬的連接數(shù)。或者借用更多的機(jī)器數(shù),每臺(tái)機(jī)器維持萬連接。文章來源網(wǎng)易云社區(qū)
本文由作者鄭銀燕授權(quán)網(wǎng)易云社區(qū)發(fā)布。
本文是我在測(cè)試過程中的記錄,實(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è)。也就是說,一臺(tái)機(jī)器一個(gè)IP只能創(chuàng)建六萬多個(gè)websocket長(zhǎng)連接。
一、客戶端參數(shù)調(diào)優(yōu)
本文采用的測(cè)試機(jī)分別為黑mac系統(tǒng)和linux系統(tǒng)(由于黑mac機(jī)器本身性能問題,最大只能達(dá)到2萬連接,于是換用linux)。下面先以mac系統(tǒng)為例,闡述下客戶端參數(shù)調(diào)優(yōu),linux系統(tǒng)類似,這里不做闡述。
1、修改全局限制,系統(tǒng)默認(rèn)的最大連接數(shù)限制
命令:sysctl kern.maxfiles
說明:全局限制,也就是系統(tǒng)默認(rèn)的最大連接數(shù)限制是12288
修改大小: sudo sysctl -w kern.maxfiles=1048600
說明:設(shè)置系統(tǒng)最大連接數(shù)從12288到1048600
2、測(cè)試腳本是一個(gè)進(jìn)程,開啟上萬個(gè)長(zhǎng)連接,還需要修改單個(gè)進(jìn)程的最大連接數(shù)。
命令:sysctl kern.maxfilesperproc
說明:?jiǎn)蝹€(gè)進(jìn)程默認(rèn)最大連接數(shù)限制是10240
修改大小:sudo sysctl -w kern.maxfilesperproc=1048576
說明:設(shè)置進(jìn)程連接數(shù)限制,進(jìn)程的最大連接數(shù)要小于等于全局連接數(shù)
3、由于客戶端與服務(wù)端需要建立大量的socket,所以我們需要調(diào)速一下最大文件描述符。
命令:ulimit -n
說明:“ulimit -n”命令顯示當(dāng)前shell能打開的最大文件數(shù),默認(rèn)值:256,該值總是小于kern.maxfilesperproc的值,因?yàn)橐粋€(gè)shell就是一個(gè)進(jìn)程。
修改大小:ulimit -n 1048576
說明:設(shè)置當(dāng)前shell能打開的最大文件數(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è)問題,當(dāng)系統(tǒng)重啟后,這些參數(shù)又恢復(fù)成了默認(rèn)值,解決辦法就是把參數(shù)寫到/etc/sysctl.conf文件中,但是,默認(rèn)這個(gè)文件是不存在的,所以首先就要?jiǎng)?chuàng)建它:
sudo touch /etc/sysctl.conf
然后把參數(shù)寫到文件里
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 寫到.bashrc中實(shí)現(xiàn)自動(dòng)修改。
二、測(cè)試腳本
客戶端腳本采用nodejs編寫,之所以不采用jmeter的方式,是因?yàn)閖meter每個(gè)連接都是線程的方式,而單臺(tái)測(cè)試機(jī)最好保持開啟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ī)器性能問題,連接數(shù)達(dá)到2w左右,就無法建立新的連接了。后面將機(jī)器改成云主機(jī),可以達(dá)到6萬的連接數(shù)。
四、后續(xù)展望
我的測(cè)試目標(biāo)不是實(shí)現(xiàn)單臺(tái)6萬的連接數(shù)。我的目標(biāo)是可以達(dá)到百萬級(jí)穩(wěn)定的長(zhǎng)連接,并且可以向websocket服務(wù)器收發(fā)信息,計(jì)算每個(gè)消息從服務(wù)器發(fā)送到客戶端接收的平均耗時(shí)時(shí)間,以及查看建立百萬級(jí)連接,服務(wù)器的內(nèi)存和cpu的使用情況。最終限制于機(jī)器的性能,暫時(shí)還沒做到。并且業(yè)務(wù)需求繁忙,這個(gè)測(cè)試就暫時(shí)告一段落了。后續(xù)想要通過使用虛擬IP的方式來實(shí)現(xiàn)百萬級(jí)連接,比如增加了18個(gè)IP地址,這樣就可以產(chǎn)生18 * 60000 = 1080000個(gè)連接。或者借用更多的機(jī)器數(shù),每臺(tái)機(jī)器維持6萬連接。
免費(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ǎng)易云社區(qū)。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25364.html
摘要:對(duì)端,通過增加內(nèi)存修改最大文件描述符個(gè)數(shù)等參數(shù),單機(jī)最大并發(fā)連接數(shù)超過萬甚至上百萬是沒問題的,國(guó)外公司在產(chǎn)品環(huán)境中已做到萬并發(fā) [TOC] 前言 曾幾何時(shí)我們還在尋求網(wǎng)絡(luò)編程中C10K問題的解決方案,但是現(xiàn)在從硬件和操作系統(tǒng)支持來看單臺(tái)服務(wù)器支持上萬并發(fā)連接已經(jīng)沒有多少挑戰(zhàn)性了。 我們先假設(shè)單臺(tái)服務(wù)器最多只能支持萬級(jí)并發(fā)連接,其實(shí)對(duì)絕大多數(shù)應(yīng)用來說已經(jīng)遠(yuǎn)遠(yuǎn)足夠了,但是對(duì)于一些擁有很大用...
摘要:前言這篇文章的主題是記錄一次程序的性能優(yōu)化,在優(yōu)化的過程中遇到的問題,以及如何去解決的。因?yàn)槲覀兊倪B接數(shù)只有,一旦請(qǐng)求過多,勢(shì)必會(huì)導(dǎo)致數(shù)據(jù)庫瓶頸。我們?cè)俅螇簻y(cè),結(jié)果顯示萬,服務(wù)器數(shù)據(jù)庫連接正常,連接正常,響應(yīng)時(shí)間平均為,錯(cuò)誤率為。 前言 這篇文章的主題是記錄一次Python程序的性能優(yōu)化,在優(yōu)化的過程中遇到的問題,以及如何去解決的。為大家提供一個(gè)優(yōu)化的思路,首先要聲明的一點(diǎn)是,我的方式...
閱讀 2947·2023-04-25 22:16
閱讀 2093·2021-10-11 11:11
閱讀 3248·2019-08-29 13:26
閱讀 593·2019-08-29 12:32
閱讀 3410·2019-08-26 11:49
閱讀 2988·2019-08-26 10:30
閱讀 1939·2019-08-23 17:59
閱讀 1507·2019-08-23 17:57