在日常的交流中常常有人問.net socket能支持多少在線?和C++或linux下比起來應該差很遠吧?其實產生這樣問題的主要緣由是.net不多人去作這方面的測試,而在linux下則常常聽到什麼100w或500w在線鏈接的測試.這樣一個數字看起來多麼地讓人興奮...其實在這幾年編寫通信服務的過程當中已經意識到鏈接數的多少對總體影響並不大,主要歸功於現有成熟悉的網絡模型和硬件資源.爲了更進一步證明這個問題,因此打算在.NET下測試一下100w鏈接交互狀況,不過因爲硬件內存不足不能進行100W鏈接量,所以只能跑個50W在線的效果.linux
測試硬件數量有限和IP端口的限制,爲了知足這一次的測試須要只好一臺機上添加多個IP...windows
給測試的Client電腦添加了10個IP,每一個IP分別綁定10000-60000端口,而測試程序針對每一個IP構建一個線程來建立鏈接,鏈接建立完成後就定量輪循鏈接向服務器發送消息.服務器
static void Connect(object state)網絡
{ string ipaddress = (string)state; System.Net.IPAddress ip = System.Net.IPAddress.Parse(ipaddress); for(int i=10000;i<60000;i++) { try { Socket mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); mSocket.Bind(new System.Net.IPEndPoint(ip, i)); mSocket.Connect(mHost, mPort); SocketAsyncEventArgs sae = new SocketAsyncEventArgs(); sae.SetBuffer(new byte[1024], 0, 1024); sae.UserToken = mSocket; sae.Completed += OnReceive; BeginReceive(mSocket, sae); lock (mSockets) { mSockets.Add(mSocket); } } catch (Exception e_) { Console.WriteLine("create socket client error {0} with {1}@{2}", e_.Message, ipaddress, i); } System.Threading.Thread.Sleep(1); } while (true) { for (int i = 0; i < 20; i++) { long index = System.Threading.Interlocked.Increment(ref mIndex); mSockets[(int)(index % mSockets.Count)].Send(Encoding.UTF8.GetBytes("{\"name\":\"henryfan\"}")); } System.Threading.Thread.Sleep(1); } }
代碼程序比較簡單,每次獲取20個鏈接進行數據發送,每次發送完後sleep一次,這樣主要是爲了防止資源被用光致使測試沒法進行;畢竟這一次的測試是以鏈接數量爲基準.socket
整個測試結果和我想的沒有多大的出入,構建50W鏈接後因爲數據交互量不大,因此除了佔用比較多的內存之外基本沒有對服務器CPU構成壓力.性能
50W鏈接整個交互大概是每秒1.2w的請求應答量.因爲鏈接太多在超過十幾W鏈接的狀況下netstat已經沒法正常顯示該端口對應的鏈接數量了....;雖然鏈接數量比較多但程序所佔用的CPU資源並不高測試
CPU的平均佔用率大概在7%左右.操作系統
服務端的內存佔用率大概在2.6G左右,實際操做系統的內存已經滿了..net
因爲內存的限制在這些測試中不能跑到100w個鏈接有點惋惜(不過之後閒着的時候把內存加上去後還會無聊地再刷一次)...;從結果已經能夠進一步說明了一個很是重要的問題,只從鏈接數上來衡量一個服務的能力是沒有多大意義.只有請求應答量才能體現出服務端的性能優點.因此當你看到100W鏈接的測試文章不感到驚歎,畢竟請求應答量纔是體現性以指數.若是有興趣的同窗其電腦內存資源充足的狀況能夠作出更高的鏈接數出來,爲了方便測試便順提供測試程序.線程
/files/file/20140907/20140907145550_4695.rar
從windows的配置表信息來看,最大鏈接數是1K多W的鏈接數,若是你的內存資源足夠看能衝到多少,別忘了把結果分享出來.