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

sherrylso

C++博客 首頁 新隨筆 聯系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks

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

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

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

Feedback

# re: Winsock服務器內存資源管理[未登錄] 2008-02-03 16:01 汪江濤
好帖!頂!  回復  更多評論
  

# re: Winsock服務器內存資源管理 2008-02-16 10:04 追夢時代
好帖!  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   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>
            免费成人小视频| 国产日韩综合一区二区性色av| 女女同性精品视频| 久久精品中文| 欧美不卡视频一区发布| 欧美激情精品久久久久久免费印度| 久久久噜噜噜久久中文字幕色伊伊| 欧美亚洲尤物久久| 久久av一区二区三区| 欧美在线三级| 久久亚洲综合网| 91久久综合亚洲鲁鲁五月天| 欧美14一18处毛片| 亚洲精品一区二区三区在线观看| 亚洲国产小视频| 一本色道久久综合| 亚洲欧美成人在线| 麻豆精品国产91久久久久久| 欧美日韩99| 国产精品视频导航| 亚洲电影毛片| 亚洲专区在线视频| 欧美国产日本韩| 亚洲免费视频在线观看| 两个人的视频www国产精品| 欧美国产欧美综合| 国产精品高潮呻吟久久av黑人| 国产欧美日韩精品丝袜高跟鞋| 黑人巨大精品欧美一区二区小视频 | 亚洲调教视频在线观看| 欧美在线视频导航| 欧美激情视频免费观看| 国产亚洲毛片在线| 亚洲色图在线视频| 免费观看久久久4p| 亚洲一级特黄| 欧美精品国产精品| 精品成人一区| 午夜一区二区三区在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 久久精品久久99精品久久| 亚洲国产精品va在看黑人| 亚洲欧美精品在线观看| 欧美激情国产日韩精品一区18| 99国产精品| 欧美本精品男人aⅴ天堂| 国产欧美一区二区三区沐欲| 这里只有精品丝袜| 亚洲国产第一页| 麻豆精品视频在线观看视频| 国产欧美日韩专区发布| 亚洲一区免费看| 亚洲黄色性网站| 麻豆免费精品视频| 亚洲高清在线播放| 蜜月aⅴ免费一区二区三区| 亚洲一区二区三区精品动漫| 欧美日韩综合久久| 亚洲午夜激情在线| 在线视频中文亚洲| 国产精品swag| 午夜天堂精品久久久久| 亚洲一线二线三线久久久| 国产精品swag| 久久国内精品视频| 久久不射2019中文字幕| 国产视频在线观看一区二区| 欧美在线地址| 欧美制服丝袜| 在线免费观看欧美| 欧美丰满高潮xxxx喷水动漫| 久久午夜影视| 99亚洲视频| 一区二区三区日韩在线观看 | 欧美中日韩免费视频| 好吊色欧美一区二区三区四区 | 一区二区三区精品国产| 国产精品视频久久久| 久久国产高清| 久久国产精品一区二区三区四区| 国内精品久久久久影院优| 久久在精品线影院精品国产| 久久久久久久综合色一本| 在线成人黄色| 91久久久久久国产精品| 国产精品久久二区| 久久久久久网| 欧美激情国产精品| 午夜精品亚洲一区二区三区嫩草| 欧美一级一区| 亚洲人成啪啪网站| 亚洲一区二区日本| 亚洲高清不卡一区| 亚洲视频自拍偷拍| 18成人免费观看视频| 亚洲国产精品第一区二区三区| 欧美日韩精品一区二区在线播放 | 亚洲欧美日韩精品久久奇米色影视| 国产在线视频欧美| 亚洲一级网站| 久久精品91久久香蕉加勒比| 日韩一区二区精品视频| 欧美一区二区福利在线| 亚洲美女淫视频| 欧美伊人久久| 亚洲手机在线| 麻豆视频一区二区| 久久成人这里只有精品| 欧美极品aⅴ影院| 久久欧美肥婆一二区| 欧美吻胸吃奶大尺度电影| 免费美女久久99| 国产精品久久久久久av福利软件| 美女视频一区免费观看| 国产精品一区久久| 夜夜夜精品看看| 亚洲激情欧美| 久久久精彩视频| 久久久噜噜噜久久久| 国产精品综合网站| 亚洲一区二区三区视频| 亚洲午夜成aⅴ人片| 欧美丰满少妇xxxbbb| 你懂的国产精品| 激情欧美一区二区三区| 亚洲欧美日韩国产精品 | 亚洲黄色小视频| 久久九九久精品国产免费直播| 午夜精品亚洲一区二区三区嫩草| 欧美黑人在线播放| 欧美激情精品久久久六区热门 | 久久久久久亚洲综合影院红桃 | 午夜精品视频一区| 国产精品久久久久久久免费软件| 亚洲精品自在在线观看| 99精品欧美一区二区三区| 欧美激情1区| 亚洲精品午夜| 亚洲午夜精品视频| 国产精品第一区| 在线中文字幕一区| 性欧美video另类hd性玩具| 国产精品99免费看| 亚洲影院免费观看| 久久久久国产精品www| 国产日韩精品视频一区| 性做久久久久久久免费看| 久久久人成影片一区二区三区观看| 国产三区精品| 久久久精品网| 亚洲高清免费视频| 亚洲香蕉伊综合在人在线视看| 国产精品久久久对白| 欧美一级视频| 亚洲黄色成人久久久| 夜夜嗨av一区二区三区四季av| 欧美午夜一区二区| 久久gogo国模啪啪人体图| 免费在线视频一区| 欧美日韩精品综合在线| 欧美xart系列在线观看| 欧美日韩精品二区第二页| 亚洲美女免费精品视频在线观看| 日韩视频不卡中文| 欧美午夜在线| 久久乐国产精品| 亚洲每日在线| 久久亚洲欧洲| 亚洲视频香蕉人妖| 国产偷国产偷精品高清尤物| 葵司免费一区二区三区四区五区| 亚洲黄一区二区| 亚洲欧美一区二区三区在线| 狠狠色综合播放一区二区| 欧美电影在线| 亚洲一区日韩| 亚洲国产成人av好男人在线观看| 亚洲尤物在线| 亚洲国产天堂久久国产91| 欧美日韩综合不卡| 久久久午夜视频| 中文无字幕一区二区三区| 久久久噜噜噜久噜久久| 亚洲午夜在线观看视频在线| 在线观看成人av电影| 国产精品社区| 欧美日韩在线播放一区| 久久久天天操| 欧美一区高清| 亚洲午夜久久久| 亚洲高清在线播放| 久久久噜噜噜久久中文字免| 亚洲综合三区| 亚洲美洲欧洲综合国产一区| 国产一区二区在线观看免费| 欧美日韩中文字幕精品| 欧美激情一二三区| 另类欧美日韩国产在线| 久久国产99| 欧美一区二区在线免费观看 |