發現不少同學在用.NET做通訊的時候都關心一個問題,.NET能支持多少個在線連接。其實.net的通訊由winsocket所支持,既然由低層的winsocket所支持那.NET其端的接入連接數的受限完全取於winsocket當前操作系統的限制。
65535的限制?
有很多同學認為由於端口有限,所以接入的連接會受端口資源限制。其實對於服務端的連接接入是不會產生端口資源的分配,它只分配相應的操作系統句柄。所以可接入的連接不會不會受端口數的限制。其實WIN預留可接入的連接數上限值還是非常大的,通過以下注冊表值可以了解到
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] TcpNumConnections = 0x00fffffe (Default = 16,777,214)從值來看是1000多萬個接入限制,當然這緊緊是一個值實上當前操作系統和內存資源是否支持這么多句柄實例也很難說……由於連接的接入緊緊是創建和分配相應的句柄資源。如果內存夠大的情況的確可以支持很多的連接數接入,當然還需要操作系統支持管理這么多句柄實例。
測試
針對一些同學說6W個連接的做一下簡單的測試
從測試結果來看.NET支撐這個在線連接數那是沒有壓力的,單個連接每10秒交互一個消息和一些新連接接入,如果沒消息交互估計CPU資源看不到有百份比。
並發的理解
在交流過程發現大家對並發的理解都有些不同,有些同學並發是指同時在線的連接數,但有些同學則理解為當前服務同時處理的消息量(秒)。其實兩者異差還是非常大的。一個簡單的例子現在你有10個客戶,他們同一天走來向你談業務累,不是約個時間一天談一個累呢?雖然總體工作量一樣,但前者很有可能產生資源崩潰導致后面無法繼續工作……。同樣在服務處理上也一樣,連接數再多只要不產生數據交互和邏輯處理只是在內存里占個坑是不影響CPU資源的。所以評估一個服務的時候最好是結合實際業務出發,如果客戶要求10W在線,而每個客戶十來秒才產生一個交互;那這種硬件可行性還是很好評估的;但如果業務上是每個客戶每秒都要交互大量業務數據,那從硬件資源和帶寬上就比較難以規划,可能要做一些可行性測試才能評估出來。