最近使用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
