• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W

            昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W

            下面是俺的一些經(jīng)驗(yàn)

            1.基本結(jié)構(gòu)

            服務(wù)器結(jié)構(gòu)如下圖
            33.JPG

            使用2個(gè)不同的線程池來分別來處理 網(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個(gè)核心.
            在邏輯上就有8個(gè)處理單元.

            在第1個(gè)CPU上的每個(gè)核心上創(chuàng)建x個(gè)線程用于發(fā)送和接收.
            即: 發(fā)送接收線程池有線程數(shù) x*4個(gè),位于第1個(gè)CPU上.

            在第2個(gè)CPU上的每個(gè)核心上創(chuàng)建y個(gè)線程,用于業(yè)務(wù)處理
            即: 業(yè)務(wù)處理線程池有線程數(shù) y*4個(gè),位于第2個(gè)CPU上

            具體的x,y應(yīng)該按照實(shí)際的系統(tǒng)設(shè)置.設(shè)置的原則是:
            1. 盡量小的線程上下文切換開銷
            2. 盡量高的CPU利用率(注意,是利用率,不是占用率)
            一般來說,y>x

            BOOL?WINAPI?SetProcessAffinityMask(
            ??__in??????????HANDLE?hProcess,
            ??__in??????????DWORD_PTR?dwProcessAffinityMask
            );
            // ?此API用于設(shè)置進(jìn)程的CPU親緣屬性,第2個(gè)參數(shù)是"位或"表示.?對于2*4核系統(tǒng),則設(shè)置位0xFF

            DWORD_PTR?WINAPI?SetThreadAffinityMask(
            ??__in??????????HANDLE?hThread,
            ??__in??????????DWORD_PTR?dwThreadAffinityMask
            );
            // ?此API用于設(shè)置線程的CPU親緣屬性,第2個(gè)參數(shù)是"位或"表示.?需要注意的是,dwThreadAffinityMask必須是dwProcessAffinityMask的子集

            DWORD?WINAPI?SetThreadIdealProcessor(
            ??__in??????????HANDLE?hThread,
            ??__in??????????DWORD?dwIdealProcessor
            );
            // ?此API用于設(shè)置線程的首選CPU,操作系統(tǒng)在調(diào)度線程時(shí)優(yōu)先考慮首選核心,?第2個(gè)參數(shù)是以0為基數(shù)的處理器ID

            上述3個(gè)API都可以用來設(shè)置線程的執(zhí)行單元是哪個(gè). 一般來說,線程調(diào)度是由操作系統(tǒng)負(fù)責(zé).人為的控制有時(shí)候反而會降低效率.但針對高負(fù)荷的線程處理,完全可以指定獨(dú)立的CPU來優(yōu)化.
            比如,設(shè)定dwThreadAffinityMask=0xF,表示此線程在1-4核上執(zhí)行,具體是哪個(gè)核還是由操作系統(tǒng)調(diào)度.這樣可以將不同用途的線程分配到不同的CPU上,因?yàn)槊總€(gè)CPU有自己獨(dú)立的L2 Cache,這樣做可以避免不同類型線程在不同CPU之間切換帶來的損失.
            參考: 面向共享高速緩存多核系統(tǒng)的軟件技術(shù)

            上面所說的這些都只是理論,到實(shí)際的系統(tǒng)中,必須經(jīng)過反復(fù)的性能對比試驗(yàn)來確定最佳方案

            2. 登陸數(shù)據(jù)的接收
            在IOCP中,經(jīng)常使用AcceptEx來投遞前置式的accept請求. 這里有一個(gè)問題: 登陸數(shù)據(jù)如何接收?
            一般來說,登陸數(shù)據(jù)包是連接后的第1個(gè)或者第2個(gè)數(shù)據(jù)包.必須先保證一個(gè)TCP連接是信任的才能進(jìn)行業(yè)務(wù)處理.有下列方法

            方法1:
            如果登陸數(shù)據(jù)包是第一個(gè)客戶端發(fā)送的數(shù)據(jù)包,那么AcceptEx的dwReceiveDataLength 可以設(shè)置成登陸數(shù)據(jù)包大小,AcceptEx只有在收到此數(shù)據(jù)包后才投遞到完成隊(duì)列進(jìn)行驗(yàn)證

            方法2:
            AcceptEx的dwReceiveDataLength 設(shè)置成0,表示在接收到連接后立即投遞到完成隊(duì)列.在完成隊(duì)列中,投遞WSARecv獲得登陸數(shù)據(jù)包

            方法3:
            AcceptEx的dwReceiveDataLength 設(shè)置成0,表示在接收到連接后立即投遞到完成隊(duì)列.在Accept時(shí),使用阻塞的recv來接收登陸數(shù)據(jù)包,如果recv超時(shí),則踢掉連接

            這3種方式?jīng)]有哪種能夠徹底的解決D.O.S的問題,只能在一定程度上緩解.
            方法1:客戶端只連接不發(fā)送數(shù)據(jù),大量的這種連接會導(dǎo)致拒絕服務(wù)(一般采用附加線程定時(shí)檢測超時(shí))
            方法2:客戶端只連接不發(fā)送數(shù)據(jù),大量的這種連接會導(dǎo)致拒絕服務(wù)(一般采用附加線程定時(shí)檢測超時(shí))
            方法3:recv的超時(shí)時(shí)間設(shè)置很敏感,過大的超時(shí)時(shí)間同樣會因?yàn)榇罅窟B接而拒絕服務(wù)(recv超時(shí)時(shí)間設(shè)定得如果合適是能夠在一定程度上緩解)

            3. 設(shè)置LINGER縮短連接關(guān)閉時(shí)間

            // ?éè??SO_DONTLINGER
            BOOL?bDontLinger? = ?FALSE;
            ::setsockopt(?lpWsaOverlappedPlus
            -> hSocket
            ????,?SOL_SOCKET
            ????,?SO_DONTLINGER
            ????,?(
            const ? char * ) & bDontLinger
            ????,?sizeof(BOOL)
            ????);

            // ?éè??SO_LINGER
            linger?stLinger;
            stLinger.l_onoff?
            = ? 1 ;
            stLinger.l_linger?
            = ? 0 ;
            ::setsockopt(?lpWsaOverlappedPlus
            -> hSocket
            ????,?SOL_SOCKET
            ????,?SO_LINGER
            ????,?(CHAR
            * ) & stLinger
            ????,?sizeof(linger)
            ????);

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

            [ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Performance ]
            " MaxUserPort " = dword:0000fffe

            [ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters ]
            " TCPFinWait2Delay? " = dword:0000001e
            " SynAttackProtect " = dword: 1 ?
            " TcpMaxPortsExhausted " = dword: 5 ?
            " TcpMaxHalfOpen " = dword: 500 ?
            " TcpMaxHalfOpenRetried " = dword: 400 ?
            " TcpMaxConnectResponseRetransmissions " = dword: 2 ?
            " TcpMaxDataRetransmissions " = dword: 2 ?
            " EnablePMTUDiscovery " = dword: 0 ?
            " KeepAliveTime " = dword: 300000 ?
            " NoNameReleaseOnDemand " = dword: 1 ?
            " DefaultTTL " = dword: 256 ?
            " EnableDeadGWDetect " = dword: 0 ?
            " DisableIPSourceRouting " = dword: 1 ?
            " EnableFragmentChecking " = dword: 1 ?
            " EnableMulticastForwarding " = dword: 0 ?
            " IPEnableRouter " = dword: 0 ?
            " EnableAddrMaskReply " = dword: 0 ?
            " TcpTimedWaitDelay " = dword:0000001e

            [ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters ] ?
            " EnableICMPRedirect " = dword: 0 ?
            " EnableDynamicBacklog " = dword: 1 ?
            " MinimumDynamicBacklog " = dword: 20 ?
            " MaximumDynamicBacklog " = dword: 20000 ?
            " DynamicBacklogGrowthDelta " = dword: 10 ?

            Feedback

            # re: 昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W   回復(fù)  更多評論   

            2009-01-16 11:16 by true
            一個(gè)很關(guān)鍵的問題:
            對于一個(gè)客戶端的收包及發(fā)包順序是怎么判斷的呢,舉例:客戶端給服務(wù)器傳輸文件,肯定是多次發(fā)包,同時(shí)服務(wù)器給客戶端多次確認(rèn),這種情況,請問是怎么實(shí)現(xiàn)的同步的呢?或者是怎么解決的文件傳輸?shù)哪?/div>

            # re: 昨天優(yōu)化了一下服務(wù)器的網(wǎng)絡(luò)部分,測試了一下,在不考慮吞吐率的情況下,并發(fā)5W   回復(fù)  更多評論   

            2009-01-16 18:07 by tzhang
            可以提供個(gè)代碼下載么?
            欧美日韩久久中文字幕| 午夜福利91久久福利| 国产精品日韩欧美久久综合| 久久高清一级毛片| 色综合久久88色综合天天 | 久久精品国产2020| 久久亚洲国产欧洲精品一| 久久乐国产精品亚洲综合| 亚洲中文字幕无码久久综合网| 久久久中文字幕| 亚洲人成电影网站久久| 久久国产亚洲精品麻豆| 国内精品久久久久影院老司| 69久久精品无码一区二区| 久久人人爽人人爽AV片| 久久久国产乱子伦精品作者| 国内精品久久久久久久coent| 久久午夜福利无码1000合集| 色成年激情久久综合| 国产成年无码久久久免费| 中文字幕成人精品久久不卡| 无码人妻久久久一区二区三区 | 久久大香香蕉国产| 久久精品成人免费观看97| 日韩精品久久久肉伦网站| 久久婷婷五月综合97色直播| 国产91色综合久久免费| 久久久久高潮综合影院| 久久精品人妻一区二区三区| 国产成人久久精品激情| 久久婷婷五月综合国产尤物app | 区久久AAA片69亚洲 | 韩国三级大全久久网站| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 亚洲国产精品一区二区久久hs| 国产综合成人久久大片91| 久久精品国产亚洲AV高清热| 日韩美女18网站久久精品| 国产精品丝袜久久久久久不卡| 久久精品国产亚洲AV嫖农村妇女| 久久精品国产2020|