青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

sherrylso

C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks

        一般來(lái)講, 在服務(wù)器上,如果有足夠的資源,Winsock server,理論上可以支持成千的并發(fā)連接。而現(xiàn)實(shí)是,我們沒(méi)有足夠的資源可供使用,分配。本文主要來(lái)討論一下內(nèi)存資源之于Winsock server開發(fā)的重要性。
一)基本概念。
-> Pages,Locked Pages.
        在現(xiàn)代操作系統(tǒng)中,內(nèi)存管理會(huì)把主存(RAM)分成Pages來(lái)管理。 Paging(或者swapping)指的是主存與外存之間以Page為單位進(jìn)行數(shù)據(jù)的交換。Locked Pages指的是被鎖定在主存中的內(nèi)存頁(yè),以保證一些內(nèi)核組件,driver可以訪問(wèn)到它們。windows一定會(huì)保證一定數(shù)量的可交換的內(nèi)存空間,防止一些非法程序鎖定所有的物理內(nèi)存,而致使系統(tǒng)崩潰。在windows NT, windows 2000上,可鎖定的內(nèi)存總的大小上限大概是物理內(nèi)存的1/8(當(dāng)然對(duì)于程序的開發(fā)人員,不應(yīng)該對(duì)這個(gè)值進(jìn)行任何的假設(shè),這個(gè)值可能會(huì)隨著操作系統(tǒng)本版的變化而變化)。在Winsock應(yīng)用開發(fā)過(guò)程中,以overlapped方式讀寫IO操作,將會(huì)導(dǎo)致內(nèi)存被鎖定。
-> working set
        在程序開始運(yùn)行,并達(dá)到其穩(wěn)定的運(yùn)行狀態(tài)(主要指的是其對(duì)內(nèi)存的使用),在這個(gè)狀態(tài)下,程序使用內(nèi)存的數(shù)量一般小于其需要使用內(nèi)存的總量。這樣一個(gè)穩(wěn)定的運(yùn)行狀態(tài),我們可以稱為working set: 被該程序頻繁訪問(wèn)的內(nèi)存頁(yè)的集合。在windows上,你可以使用SetWorkingSetSize Win32 API來(lái)增加程序使用物理內(nèi)存的數(shù)量。
-> non-paged pool
       不可交換的內(nèi)存。這主要指以non-paged的方式分配的內(nèi)存,這些內(nèi)存就像locked pages一樣,是從來(lái)不會(huì)被交換出去的,用來(lái)存放一些由內(nèi)核組件,driver訪問(wèn)的信息。 在Winsock應(yīng)用開發(fā)過(guò)程中,以下的操作可能導(dǎo)致分配non-paged內(nèi)存。
1) 調(diào)用系統(tǒng)一些系統(tǒng)的API,例如打開文件,create socket,等,都會(huì)導(dǎo)致從non-paged pool分配內(nèi)存。
2) 一些driver可以顯式地從該區(qū)域分配內(nèi)存。
二) Winsock server上Locked Pages使用。
        我們提到過(guò),任何的overlapped IO操作,都會(huì)導(dǎo)致鎖定內(nèi)存頁(yè)。這些內(nèi)存頁(yè)一旦被locked,就不會(huì)被交換出去。我們知道,windows操作系統(tǒng)對(duì)最大的可鎖定內(nèi)存頁(yè)做了一個(gè)上限,如果超出這個(gè)上限,overlapped IO調(diào)用將會(huì)導(dǎo)致WSAENOBUFS錯(cuò)誤。
        考慮下面的情況,如果server在每個(gè)連接上會(huì)發(fā)出很多的overlapped receives操作,那么,隨著連接數(shù)目的增多,很明顯,被鎖定的內(nèi)存數(shù)量很有可能達(dá)到上限而導(dǎo)致WSAENOBUFS錯(cuò)誤。在這種情況下,如果服務(wù)器預(yù)期會(huì)處理大數(shù)量的客戶端連接,則需要服務(wù)器在每個(gè)連接上發(fā)出zero-byte buffer的overlapped接收請(qǐng)求(這種情況下,因?yàn)閠he size of buffer is zero,所以沒(méi)有任何內(nèi)存被鎖定),一旦overlapped接收操作完成,server可以以non-blocking方式執(zhí)行receive操作,以取得所有緩存在so_rcvbuf中的數(shù)據(jù),直到返回WSAEWOULDBLOCK為止。
        另外需要注意的是,windows在page的邊界上對(duì)內(nèi)存進(jìn)行鎖定,在x86平臺(tái)上,它是4kb的整數(shù)倍。所以,假如你post了一個(gè)1 KB buffer,而系統(tǒng)真實(shí)鎖定的是4 KB 的大小,為了避免這樣的浪費(fèi),盡量用4kb的整數(shù)做overlapped  IO操作。
三) Winsock server上non-paged pool使用。
        同Locked Pages限制一樣,windows對(duì)non-paged pool也有一個(gè)最大的限制。并且,當(dāng)你的應(yīng)用出現(xiàn)這個(gè)問(wèn)題的時(shí)候,超出它的最大限制數(shù),情況要遠(yuǎn)比Locked Pages復(fù)雜。這種情況下,后果是不確定的,有可能你的Winsock調(diào)用返回WSAENOBUFS錯(cuò)誤,也有可能,在系統(tǒng)中,一個(gè)和你的應(yīng)用毫無(wú)關(guān)聯(lián)的driver由于申請(qǐng)不到non-paged內(nèi)存而致使system crash。而這樣的災(zāi)難,是沒(méi)法恢復(fù)的。
        考慮一個(gè)具體的例子:我們假設(shè)在windows2000上,系統(tǒng)有1 GB內(nèi)存。這樣的配置下,windows大概會(huì)預(yù)留1/4的空間用作non-paged pool(同樣,對(duì)于程序的開發(fā)人員,不應(yīng)該對(duì)這個(gè)值進(jìn)行任何的假設(shè)),即:256MB。這樣的配置下,保守估計(jì),我們的Winsock server能夠處理到大概50,000連接,或者更多。(每個(gè)accepted socket大概消耗1.5kb,每個(gè)連接上post一個(gè)overlapped操作,分配一個(gè)IRP,大概需要500 byte, 總計(jì):(1500+500)*50,000 = 100 Mb) 。
       無(wú)論是對(duì)于Locked Pages,還是對(duì)于non-paged pool使用,一旦超出了上限,Winsock調(diào)用僅僅會(huì)返回一般的WSAENOBUFS 或者ERROR_INSUFFICIENT_RESOURCES錯(cuò)誤。為了處理這些錯(cuò)誤,你可以試試以下的方法:
1) 需要首先調(diào)用SetWorkingSetSize,增加應(yīng)用的可支配資源數(shù),看能否解決。
2)     確信你的應(yīng)用沒(méi)有做出太多的overlapped  IO操作。
3) 關(guān)閉一些連接數(shù)。
四) SOCKET的緩沖區(qū)設(shè)置問(wèn)題。

         Winsock在默認(rèn)的情況下,每個(gè)socket都會(huì)與一個(gè)send和receive buffer相關(guān)聯(lián)。你可以通過(guò)調(diào)用setsockopt來(lái)設(shè)置buffer的大小。
        在緩沖區(qū)沒(méi)有被關(guān)閉的情況下,我們看看overlapped send和revc是怎么工作的。
        當(dāng)上層的應(yīng)用做出了send調(diào)用,而這時(shí)如果send buffer還有剩余的空間,那么數(shù)據(jù)將會(huì)從用戶提交的buffer復(fù)制到send buffer中,然后調(diào)用返回成功。否則,假如這時(shí)send buffer已滿,用戶提交的buffer將會(huì)被鎖定,并且調(diào)用返回WSA_IO_PENDING。當(dāng)send buffer的數(shù)據(jù)被下層的tcp處理完成,winsock將直接處理用戶提交的buffer里的數(shù)據(jù),而不需要再?gòu)?fù)制。
        同樣,對(duì)于recv操作,如果數(shù)據(jù)已經(jīng)被緩存在socket的receive buffer里,當(dāng)發(fā)生recv調(diào)用的時(shí)候,數(shù)據(jù)將直接從socket的receive buffer復(fù)制到用戶的buffer里,recv調(diào)用返回成功。否則,假如發(fā)生調(diào)用時(shí)receive buffer里沒(méi)有數(shù)據(jù),用戶提交的buffer將會(huì)被鎖定,recv調(diào)用返回WSA_IO_PENDING。當(dāng)數(shù)據(jù)到達(dá)當(dāng)前連接,將會(huì)被直接復(fù)制到用戶提交的buffer里。
        一個(gè)應(yīng)用程序通過(guò)設(shè)定send buffer為0,把緩沖區(qū)關(guān)閉,然后發(fā)出一個(gè)阻塞send()調(diào)用。在這樣的情況下,系統(tǒng)內(nèi)核會(huì)把應(yīng)用程序的緩沖區(qū)鎖定,直到接收方確認(rèn)收到了整個(gè)緩沖區(qū)后send()調(diào)用才返回。似乎這是一種判定你的數(shù)據(jù)是否已經(jīng)為對(duì)方全部收到的簡(jiǎn)潔的方法,實(shí)際上卻并非如此。想想看,即使遠(yuǎn)端tcp通知數(shù)據(jù)已經(jīng)收到,其實(shí)也根本不代表數(shù)據(jù)已經(jīng)成功送給客戶端應(yīng)用程序,比如對(duì)方可能發(fā)生資源不足的情況,導(dǎo)致afd.sys不能把數(shù)據(jù)拷貝給應(yīng)用程序。另一個(gè)更要緊的問(wèn)題是,在每個(gè)線程中每次只能進(jìn)行一次發(fā)送調(diào)用,效率極其低下。
        另外,希望通過(guò)關(guān)閉Winsock緩沖區(qū),從而避免數(shù)據(jù)復(fù)制,達(dá)到優(yōu)化性能的目的,也是不可取的。從上面,我們看到:只要應(yīng)用保證適量的,足夠的send, recv調(diào)用,這樣的復(fù)制是完全可以避免的。
        高性能的服務(wù)器應(yīng)用程序可以關(guān)閉發(fā)送緩沖區(qū),同時(shí)不會(huì)損失性能。不過(guò),這樣的應(yīng)用程序必須十分小心,保證它總是發(fā)出多個(gè)重疊發(fā)送調(diào)用,而不是等待某個(gè)重疊發(fā)送結(jié)束了才發(fā)出下一個(gè)。如果應(yīng)用程序是按一個(gè)發(fā)完再發(fā)下一個(gè)的順序來(lái)操作,那浪費(fèi)掉兩次發(fā)送中間的空檔時(shí)間,總之是要保證傳輸驅(qū)動(dòng)程序在發(fā)送完一個(gè)緩沖區(qū)后,立刻可以轉(zhuǎn)向另一個(gè)緩沖區(qū)。
        如果關(guān)閉了recv buffer,在你的應(yīng)用沒(méi)有保證足夠的recv操作前提下,任何進(jìn)來(lái)數(shù)據(jù),必須在TCP層進(jìn)行緩存,最大緩存的數(shù)量將取決于tcp windows的大小(17Kb)。而最為嚴(yán)重的是這些緩存是從non-paged pool分配而來(lái)。如上所述,non-paged pool是非常珍貴,稀缺的內(nèi)存。所以,從這個(gè)意義上來(lái)講,關(guān)閉了recv buffer操作是不可取的。
    這是2007年最后一篇帖子,最后祝大家新年快樂(lè),過(guò)個(gè)好年!!!

posted on 2008-02-03 15:18 愛(ài)上龍卷風(fēng) 閱讀(3121) 評(píng)論(2)  編輯 收藏 引用

Feedback

# re: Winsock服務(wù)器內(nèi)存資源管理[未登錄](méi) 2008-02-03 16:01 汪江濤
好帖!頂!  回復(fù)  更多評(píng)論
  

# re: Winsock服務(wù)器內(nèi)存資源管理 2008-02-16 10:04 追夢(mèng)時(shí)代
好帖!  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美sm极限捆绑bd| 亚洲电影在线看| 91久久在线| 亚洲全部视频| 午夜精品在线看| 亚洲第一精品久久忘忧草社区| 久久久亚洲国产美女国产盗摄| 欧美阿v一级看视频| 最新成人在线| 欧美在线观看一二区| 另类综合日韩欧美亚洲| 欧美日韩午夜在线视频| 黄色成人av网站| 香港久久久电影| 欧美在线视频全部完| 亚洲国产欧美在线| 欧美一区二区在线免费播放| 久久久亚洲人| 韩国三级在线一区| 欧美在线观看日本一区| 日韩视频一区二区| 欧美精品在线观看| 亚洲理论电影网| 欧美多人爱爱视频网站| 久久成人免费视频| 国产一区白浆| 欧美影院视频| 午夜亚洲激情| 欧美啪啪一区| 亚洲国产福利在线| 国产一区久久久| 在线观看日韩一区| 欧美在线精品免播放器视频| 国语自产在线不卡| 亚洲人成网站在线观看播放| 亚洲一区二区三区免费观看| 欧美一级视频免费在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩视频永久免费| 欧美精品国产精品日韩精品| 国产欧美日韩免费看aⅴ视频| 一区二区三区在线看| 欧美一二三区精品| 亚洲视频999| 欧美午夜寂寞影院| 亚洲欧美日韩精品一区二区| 亚洲福利专区| 女女同性女同一区二区三区91| 国产一区二区三区在线播放免费观看| 亚洲激情午夜| 亚洲国产成人精品久久久国产成人一区| 久久久久久久综合狠狠综合| 国产精品一页| 久久免费观看视频| 老牛影视一区二区三区| 亚洲第一精品夜夜躁人人躁| 一区二区三区www| 亚洲午夜在线观看视频在线| 欧美天天在线| 久久久久成人网| 欧美一区亚洲一区| 亚洲精品国产欧美| 亚洲一二三区精品| 在线播放亚洲一区| 久久精品视频在线播放| 久久精品亚洲一区| 夜夜夜久久久| 亚洲三级毛片| 欧美日韩一区二区三区四区五区| 亚洲视频成人| 久久国产精品一区二区三区四区 | 中日韩视频在线观看| 欧美精品一区二区三区四区| 亚洲乱码久久| 久久er99精品| 亚洲一区二区三区中文字幕在线 | 欧美三级第一页| 久久久午夜精品| 欧美日韩国产一级| 免费观看国产成人| 欧美激情一区在线观看| 伊人久久久大香线蕉综合直播| 国产一区在线免费观看| 欧美国产日韩精品| 可以看av的网站久久看| 午夜久久黄色| 在线视频欧美一区| 久久久久久成人| 亚洲欧美日韩成人| 麻豆国产精品一区二区三区| 亚洲精品免费网站| 欧美一级理论片| 亚洲欧美成人网| 欧美黄色大片网站| 老司机午夜精品视频在线观看| 欧美区日韩区| 欧美在线观看视频在线| 欧美一区观看| 亚洲欧美日韩一区二区在线| 久久精品水蜜桃av综合天堂| 一个色综合av| 欧美国产一区视频在线观看| 欧美一级在线视频| 国产精品久久二区二区| 欧美激情亚洲一区| 在线日本欧美| 久久亚洲影音av资源网| 久久国产福利国产秒拍| 欧美日韩成人在线播放| 亚洲风情在线资源站| 狠狠做深爱婷婷久久综合一区 | 一区二区欧美日韩视频| 快播亚洲色图| 性做久久久久久久久| 欧美激情精品久久久六区热门 | 亚洲成人在线观看视频| 午夜精品一区二区在线观看| 99国产精品视频免费观看| 久久久免费精品| 美日韩精品免费| 亚洲国产一区二区视频| 久久久精品久久久久| 久久久久久亚洲综合影院红桃| 国产精品久久久一区二区三区| 99riav久久精品riav| 99一区二区| 欧美视频久久| 亚洲一区二区三区久久 | 精品白丝av| 开心色5月久久精品| 久久男人av资源网站| 精品999成人| 久久先锋影音| 久久久美女艺术照精彩视频福利播放 | 极品尤物av久久免费看| 香蕉久久国产| 亚洲三级视频| 久久久久青草大香线综合精品| 亚洲国产精品成人一区二区 | 午夜视频一区二区| 亚洲高清资源| 久久久久综合网| 亚洲一区二区三区在线| 国产一区二区高清视频| 欧美激情一区二区三区全黄 | 国产丝袜一区二区三区| 欧美成人免费一级人片100| 亚洲一区自拍| 亚洲精品视频一区二区三区| 性欧美videos另类喷潮| 亚洲国产精品一区二区www在线| 国产精品久久国产精麻豆99网站| 久久精品视频在线看| 夜色激情一区二区| 亚洲国产导航| 你懂的网址国产 欧美| 亚洲欧美日韩在线播放| 91久久在线播放| 加勒比av一区二区| 国产欧美一区二区三区久久| 久久综合久久美利坚合众国| 99精品视频一区| 91久久线看在观草草青青| 久久国产精品亚洲77777| 亚洲视频在线观看视频| 1000精品久久久久久久久| 国产精品日产欧美久久久久| 免费在线一区二区| 玖玖综合伊人| 久久婷婷国产综合精品青草| 亚洲视频欧美在线| 亚洲视频www| 亚洲一区二区视频| 亚洲免费在线视频| 亚洲欧美伊人| 欧美一区二区视频在线观看2020| 亚洲一区二区成人在线观看| 亚洲国产欧美一区二区三区同亚洲 | 午夜宅男欧美| 午夜精品视频在线观看| 一区二区三区产品免费精品久久75| 欧美成人一区二区三区片免费| 久久久水蜜桃| 欧美a级片一区| 亚洲电影av| 日韩图片一区| 亚洲一区二区免费| 欧美一区二区高清| 久久在线观看视频| 欧美高潮视频| 欧美私人网站| 国产亚洲欧美在线| 在线观看不卡av| 亚洲精品视频免费| 亚洲午夜激情免费视频| 亚洲免费一在线| 欧美专区第一页| 亚洲一区二区在线播放| 日韩亚洲视频| 午夜精品免费视频|