日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现单台测试机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萬連接。

免費領取驗證碼、內容安全、短信發送、直播點播體驗包及云服務器等套餐

更多網易技術、產品、運營經驗分享請訪問網易云社區。

文章來源: 網易云社區

總結

以上是生活随笔為你收集整理的实现单台测试机6万websocket长连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。