昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W
Posted on 2008-12-20 23:20 S.l.e!ep.¢% 閱讀(727) 評論(2) 編輯 收藏 引用 所屬分類: VC昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W
昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W
下面是俺的一些經(jīng)驗
1.基本結(jié)構(gòu)
服務(wù)器結(jié)構(gòu)如下圖
使用2個不同的線程池來分別來處理 網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送接收 以及 消息的處理.
這樣可以避免繁重的業(yè)務(wù)處理導(dǎo)致網(wǎng)絡(luò)數(shù)據(jù)包接收的阻塞.
根據(jù)服務(wù)器CPU情況創(chuàng)建線程. 服務(wù)器是2*4核心. 即雙CPU, 每CPU上有4個核心.
在邏輯上就有8個處理單元.
在第1個CPU上的每個核心上創(chuàng)建x個線程用于發(fā)送和接收.
即: 發(fā)送接收線程池有線程數(shù) x*4個,位于第1個CPU上.
在第2個CPU上的每個核心上創(chuàng)建y個線程,用于業(yè)務(wù)處理
即: 業(yè)務(wù)處理線程池有線程數(shù) y*4個,位于第2個CPU上
具體的x,y應(yīng)該按照實際的系統(tǒng)設(shè)置.設(shè)置的原則是:
1. 盡量小的線程上下文切換開銷
2. 盡量高的CPU利用率(注意,是利用率,不是占用率)
一般來說,y>x

















上述3個API都可以用來設(shè)置線程的執(zhí)行單元是哪個. 一般來說,線程調(diào)度是由操作系統(tǒng)負(fù)責(zé).人為的控制有時候反而會降低效率.但針對高負(fù)荷的線程處理,完全可以指定獨立的CPU來優(yōu)化.
比如,設(shè)定dwThreadAffinityMask=0xF,表示此線程在1-4核上執(zhí)行,具體是哪個核還是由操作系統(tǒng)調(diào)度.這樣可以將不同用途的線程分配到不同的CPU上,因為每個CPU有自己獨立的L2 Cache,這樣做可以避免不同類型線程在不同CPU之間切換帶來的損失.
參考: 面向共享高速緩存多核系統(tǒng)的軟件技術(shù)
上面所說的這些都只是理論,到實際的系統(tǒng)中,必須經(jīng)過反復(fù)的性能對比試驗來確定最佳方案
2. 登陸數(shù)據(jù)的接收
在IOCP中,經(jīng)常使用AcceptEx來投遞前置式的accept請求. 這里有一個問題: 登陸數(shù)據(jù)如何接收?
一般來說,登陸數(shù)據(jù)包是連接后的第1個或者第2個數(shù)據(jù)包.必須先保證一個TCP連接是信任的才能進行業(yè)務(wù)處理.有下列方法
方法1:
如果登陸數(shù)據(jù)包是第一個客戶端發(fā)送的數(shù)據(jù)包,那么AcceptEx的dwReceiveDataLength 可以設(shè)置成登陸數(shù)據(jù)包大小,AcceptEx只有在收到此數(shù)據(jù)包后才投遞到完成隊列進行驗證
方法2:
AcceptEx的dwReceiveDataLength 設(shè)置成0,表示在接收到連接后立即投遞到完成隊列.在完成隊列中,投遞WSARecv獲得登陸數(shù)據(jù)包
方法3:
AcceptEx的dwReceiveDataLength 設(shè)置成0,表示在接收到連接后立即投遞到完成隊列.在Accept時,使用阻塞的recv來接收登陸數(shù)據(jù)包,如果recv超時,則踢掉連接
這3種方式?jīng)]有哪種能夠徹底的解決D.O.S的問題,只能在一定程度上緩解.
方法1:客戶端只連接不發(fā)送數(shù)據(jù),大量的這種連接會導(dǎo)致拒絕服務(wù)(一般采用附加線程定時檢測超時)
方法2:客戶端只連接不發(fā)送數(shù)據(jù),大量的這種連接會導(dǎo)致拒絕服務(wù)(一般采用附加線程定時檢測超時)
方法3:recv的超時時間設(shè)置很敏感,過大的超時時間同樣會因為大量連接而拒絕服務(wù)(recv超時時間設(shè)定得如果合適是能夠在一定程度上緩解)
3. 設(shè)置LINGER縮短連接關(guān)閉時間




















4. 修改注冊表,修改TCP參數(shù),具體的含義可以查閱MSDN






























