利用線程池技術和內存池,SOCKET池技術,基本能夠處理一千五百個左右的SOCKET鏈接,但咱們通常使用的機器大約有兩M內存,而在不改變線程堆棧的大小狀況下,咱們至多能夠建立一千七八百個線程,不過也就基本動不了了。咱們測試基本到一千個線程左右,機器就很慢了。
還有在WIN-XP-SP2中,對單進程中的線程的併發作了處理,默認是10個,修改的方法網上多的是。
二、SELECT模型(同步非阻塞)
這個模型在單線程的狀況下默認是64個最大SOCKET鏈接。你能夠修改WINSOCK2.h這個文件中的FD_SETSIZE,但不得超過底層WINSOCK的限制(1024),但若是採用多線程的話,能夠處理更多,其實際的最大數量,在單線程裏建議不超過1000個,至於多線程,應該也要控制線程切換的效率和數據處理的時間。應該幾千個沒有什麼問題。
三、WSAASYNCSELECT模型
這個模型利用的是消息機制,建議不超過1000個。
四、WSAEVENTSELECT模型
這個模型利用的是事件驅動方式,單個線程不超過64個(WSAWaitForMultipleEvents最多等待64個事件),若是多SOCKET併發宜採用線程池技術,應該幾千個沒什麼問題。
五、重疊IO
應該幾千個沒問題。這個畢竟是下面IOCP的一個技術基礎。
六、IOCP完成端口+重疊IO
這個是解決SOCKET通訊的終極武器,惋惜只用在WIN上和2000以上,LINUX上好象有一個相似的EPOLL,並且好象比這個還好用,沒具體用過。這個東東解決幾萬個SOCKET併發應該是很輕鬆,固然你得編程水平和技術得跟上。
從網上查看說這個東西若是使用的服務器版的操做系統和機器最大可到一百W,太恐怖了吧,那傢伙本身在XP上最大達到了五萬,但不斷出現內存溢出的BUG。他最高到了9W。 算法
順道把NET下的SOCKET通訊併發搞一下,是從別人的BLOG上摘來的:
.NET平臺下幾種SOCKET模型的簡要性能供參考
這個內容在cnblogs中也討論過不少次了,這兩天大概看了一些資料,看到一些簡單的性能指標拿出來和你們討論一下。
Socket + Threads/ThreadPool
大概性能:小於1500個鏈接
實現:Accept一個Socket,就交給一個線程去管理,比較笨,但也比較有效,由於是同步方式,控制起來很方便。高級點的,就是交給一個線程池去管理,線程池由系統自動託管,省去了開銷線程的時間。通常小型項目,用這個徹底足夠,開發也簡單。但要注意,若是若干Socket長時間佔用線程池中的線程,同時其它鏈接數又比較多,很容易出現提示說你沒有足夠的線程供使用。呵呵,讓Socket少作點事,少佔用時間,換一個快點的CPU是不錯的方式。另外,若是有一些比較好的第三方線程池組件,也能夠選擇使用,好比SmartThreadPool。
Socket + Select
大概性能:大於1500個鏈接後性能降低
實現:Select是很經常使用的一種模型。是在阻塞功能中輪詢一個或多個Socket,將要處理的Socket放到一個IList中,當Select輪詢結束後,而後咱們再本身處理這個IList中的Socket。具體的用法能夠看一下MSDN。Select的效率並不能說是高的,由於當隊列中待處理的Socket比較多的時候,處理最後幾個Socket至關於要遍歷全部前面的Socket,很是不划算的。
Socket + Asynchronous
大概性能:約7500個客戶端鏈接
實現:BeginXXXX,EndXXXX,再熟悉不過了吧。異步Socket歸根到底,仍是用的線程池技術,用線程池來處理異步IO。這就又引出個問題,.NET的線程池又是用的什麼實現方式,之前看過有人說,.NET的線程池是用的完成端口來實現的,我不知道這樣的說法是否是正確,從查到的資料中也沒有辦法確認(但願這點有朋友能夠告訴我)。異步Socket對於程序的處理流程來講比同步複雜了許多,異步回調函數的控制不如同步方式那樣直觀。但有一點我想應該是要注意的,就是回調函數應該輕裝上陣,不該該處理過多的事務,對傳遞數據的處理,應該交給其它線程進行處理。 編程
IOCP(完成端口)
大概性能:約20000~50000個客戶端鏈接
實現:如今.NET下有一些僞IOCP,你們能夠去搜索一下,尚未見過開放出來的用這些僞IOCP來實現的SOCKET例子。我說的20000~50000個客戶端鏈接,是指在C++下開發的狀況,這樣的狀況下,須要用到的基本技術還包括內存池、查詢算法等。 服務器
僞IOCP能實現多少最大鏈接,沒有資料能夠查,若是有朋友知道,能夠討論一下。另外上面提到的許多數據,是從一些資料上摘抄下來的,我沒有本身試過,僅僅是拿出來和你們討論一下。我想,一個高性能的服務端程序,可能須要的技術不只僅是採用什麼模型,還有許多細節須要注意,好比內存的處理,採用什麼算法等等,固然,這僅僅是軟件成本上的,硬件上確定也是須要投入的。 多線程