.net如何處理高併發socket,創建高性能健壯的socket服務

看到一個問題,說如何保持5000-10000+的健壯的socket服務。windows

初學者確定是會把每一個鏈接都開一個線程來監聽。這很浪費資源服務器

一般只會(動態地)佔用幾個線程就能保持3000個長鏈接會話了。
「爲每一個監聽對象開一個新的線程」這是設計錯誤。你可使用NetworkStream的異步Read,在沒有消息的時候無需阻塞在什麼線程裏。多線程

據不一樣的操做系統,多線程的約束條件也不一樣。當你發現工做線程超過1000個,或者IOCP(IO完成端口)線程超過800個,就應該趕忙斷掉服務器進行維護了。
首先要有一個意識,使用幾個、十幾個線程就足以應付上千個普通業務鏈接了。
有人說「若是我要保持1000個客戶端鏈接,就得開1001個線程來接收數據」,這純粹是瞎扯。請必定要注意。異步

我說的「工做線程」是指你的進程中使用的工做線程總數,而不是隻windows的。socket

在你的windows中,總線程數超過1500個是常常有的事情。你能夠打開你的進程管理器看看cpu的指標,看看當前有多少線程在切換使用。極可能超過1500個。可是能夠監視每個單個的進程,看看它的線程數,一般只有10個左右(只有System線程數會有100多)。

而你的服務器進程,工做線程數不該該過高。日常只有十幾個線程足以應對幾千客戶端了。操作系統

相關文章
相關標籤/搜索