探討.net Socket支援線上連線數量

smark發表於2014-05-08
發現不少同學在用.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線上,而每個客戶十來秒才產生一個互動;那這種硬體可行性還是很好評估的;但如果業務上是每個客戶每秒都要互動大量業務資料,那從硬體資源和頻寬上就比較難以規劃,可能要做一些可行性測試才能評估出來。

相關文章