websocket 70K連接測試


最近使用socket.io做了一個實時應用,實時性、穩定性還是很讓人滿意的。如果拿socket.io來做小型應用,綜合效率應該是最高的。但是網上少有socket.io做大量連接測試的案例,這是比較讓人擔心的一點,socket.io是否適合做具有大量連接場景的需求呢?Trello其實就是用socket.io來處理實時通信的,而且trello目前已經有數百萬的用戶了,所以從這點看,socket.io的規模應用應該還是可行了。

為了以防萬一,我想拿websocket([https://github.com/websockets/ws][1])做后備應用,並且找到了國外網友的測試代碼,我稍微改了下,代碼比較簡單,自己寫一份也可以,但對於了解一台普通的PC能夠支撐的連接數量,已經夠了。測試的結果也比較滿意,以后可以放心用websocket來做應用了。

測試的內容包括:

  • win7測試
  • win7修改PC最大連接數
  • ubuntu14.04測試
  • ubuntu14.04修改最大連接數

1. 代碼說明

服務端代碼功能:
  • 接收連接,連接到來時計數器加1
  • 連接斷開時,計數器減1
  • 在定時器中打印系統資源占用狀態
客戶端代碼功能:
  • 循環建立10K(或20K)連接【建議10K,數量過大時,成功連接的數量可能會比較小,所以小批量,多個實例】
  • 連接建立時,將連接壓入數組
  • 連接斷開時,將連接移出數組
  • 在定時器中打印連接數量
  • 每個連接建立時,發送一定的消息到server【如果消息發送量過大,注意修改server的接收緩沖區大小
  • 建立client代碼的副本,方便修改連接數。【不管是windows還是linux環境,建議使用多個client副本,以方便調整連接數

2. win7測試

在win7中測試時,如果不修改win7的注冊表連接限制,server只能接收13K左右的連接,再繼續建立連接時,就會報event.js的錯誤

3. win7修改PC最大連接數

步驟:

  • 打開注冊表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,
  • 新建一個名為MaxUserPort的鍵,設置其值為65534
  • 再新建一個名為TcpTimedWaitDelay的鍵,設置其值為50

保存,然后重新運行client連接,可以發現已經可以突破默認的限制了。我只加到了30K連接,沒有再繼續加多。【在linux服務測試中,需要win7有足夠的連接。】

注意:如果注冊表中找不到需要的鍵值,自己新建

4. ubuntu14.04測試

測試條件:

  • 我的ubuntu14.04運行在visualBox中,最開始分配的內存是2G。
  • 我一開始就修改了ubuntu的file限制,將上限改成了500,000
  • 直接把win7下的測試代碼拷貝到linux中運行,開啟多個client實例。

測試現象:

  • 當建立大約4oK連接時,連接數停留在這里了。查看linux file數量,發現已經到500000,再次修改file限制,改為1,000,000
  • 在ubuntu中啟動的連接數達到45K左右時,繼續在ubuntu中開啟client實例,不能夠繼續建立連接了。(此時開始在win7中建立到ubunut的連接)
  • 在win7中開啟client連接,當建立連接數達到55K左右時,server總是被linux Killed。此時,我關閉了虛擬機,調整虛擬機的分配內存為3GB,再次開始測試。
  • 繼續在win7中開啟client,我一共開啟了3個實例,共30K連接。ubuntu中開啟了4個實例(20K一個,10K3個,只能保持45K左右的連接),ubuntu內存占用大概1.2GB,此時建立的連接數達到了75K。

5. ubuntu14.04修改最大連接數

步驟

  • 配置 /etc/security/limits.conf,文件尾追加
    * hard nofile 1000000
    * soft nofile 1000000
  • 編輯/etc/pam.d/common-session
    加入一行
    session required pam_limits.so
  • 編輯/etc/profile,加入
    ulimit -SHn 51200

注意:我沒有調整linux內存方面的設置,僅僅只是調整了分配給虛擬機的內存

6. 結論

我不想在這里妄下結論,只是測試現象可以讓我確定,nodejs 使用websocket來處理大量連接的場景是可行的。
[1]: https://github.com/websockets/ws


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM