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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

Winsock五種I/O模型的性能分析

五種I/O模型的性能分析

重疊I/O模型的另外幾個優點在于,微軟針對重疊I/O模型提供了一些特有的擴展函數。當使用重疊I/O模型時,可以選擇使用不同的完成通知方式。

采用事件對象通知的重疊I/O模型是不可伸縮的,因為針對發出WSAWaitForMultipleEvents調用的每個線程,該I/O模型一次最多都只能支持6 4個套接字。假如想讓這個模型同時管理不止64個套接字,必須創建額外的工作者線程,以便等待更多的事件對象。因為操作系統同時能夠處理的事件對象是有限的,所以基于事件對象的I/O模型不具備伸縮性。

使用完成例程通知的重疊I/O模型,因為以下幾個原因,也不是開發高性能服務器的最佳選擇。首先,許多擴展功能不允許使用APCAsyncroneus Procedure Call,異步過程調用)完成通知。其次,由于APC在系統內部特有的處理機制,應用程序線程可能無限等待而得不到完成通知。當一個線程處于可警告狀態時,所有掛起的APC按照先進先出的順序(FIFO)接受處理。現在考慮這樣一種情況,服務器已經建立起了一個連接,并且調用含有完成例程指針的WSARecv投遞了一個重疊I/O請求。當有數據到達時(即I/O完成時),完成例程執行并且再次調用WSARecv拋出另外一個重疊I/O請求。一個APC拋出的I/O操作需要一定的時間才能完成,所以這期間可能另外一個完成例程等待執行(比如本次WSARecv還沒接收完時,又有一個新的客戶接入并發來數據),因為還有更多的數據需要讀取(上一個客戶發來的數據尚未讀完)。只要(投遞WSARecv的)那個套接字上還有未決(未接收完)的數據,就會導致調用線程長久阻塞。

基于完成端口通知的重疊I/O模型是Windows NT系統提供的一個真正支持高伸縮性的I/O模型。在上一章中,探討了Winsock幾種常見的I/O模型,并且說明了當應對大規模客戶連接時,完成端口是最佳的選擇,因為它提供了最好的伸縮性。

對不同Winsock I/O模型的性能測試結果如圖1所示。其中服務器采用Pentium 4 1.7 GHz XeonCPU768M內存;客戶端有3PC,配置分別是Pentium 2 233MHz 128 MB 內存,Pentium 2 350 MHz 128 MB內存,Itanium 733 MHz 1 GB內存。服務器、客戶端安裝的操作系統都是Windows XP


1 不同I/O模型的性能比較

1.分析圖表1提供的測試結果可知,在所用的I/O模型中,阻塞模式性能最差。這個測試程序中,服務器為每個客戶創建兩個線程:一個負責處理數據的接收,一個負責處理數據的發送。在多次測試中的共同問題就是,阻塞模式難以應對大規模的客戶連接,因為它在創建線程上耗費了太多的系統資源。因此,服務器創建太多的線程后,再調用CreateThread函數時,將返回ERROR_NOT_ENOUGH_MEMORY的錯誤,這個錯誤碼提示內存不夠。那些發出連接請求的客戶則收到WSAECONNREFUSED的錯誤提示,表示連接的嘗試被拒絕。

讓我們來看看監聽函數listen,其原型如下:

WINSOCK_API_LINKAGE int WSAAPI listenSOCKET s, int backlog ;

參數一s已綁定了地址的監聽套接字。

參數二backlog指定了正在等待連接的最大隊列長度。

參數backdog非常重要,?因為完全可能同時出現幾個對服務器的連接請求。例如,假定backlog參數為2時有三個客戶機同時發出連接請求,那么前兩個會被放在一個等待處理隊列中,以便應用程序依次為它們提供服務。而第三個連接的請求就會造成一個WSAECONNREFUSED錯誤。一旦服務器接受了一個連接請求,那個連接請求就會從隊列中刪去,以便可以繼續接收其他客戶發出的連接請求。即當一個連接請求到來時隊列已滿,那么客戶將收到一個WSAECONNREFUSED錯誤。而backlog參數本身的大小就存在著限制,這個限制是由協議提供者決定的。

故阻塞模式下,由于系統資源的限制,其并發處理量是極難突破的。

2.非阻塞模式表現出的性能要比阻塞模式稍好,但是占用了太多的CPU處理時間。測試服務器將所有客戶對應的socket分類放到FD_SET集合中,然后調用select函數篩選出對應集合中有事件發生的socket,并對集合更新。接下來調用FD_ISSET宏重新判斷一個套接字是否在原來加入的FD_SET集合中。隨著客戶連接數量的增多,這種模型的局限性逐漸凸現。僅僅為了判斷一個套接字是否有網絡事件發生,就需要對集合FD_SET執行一次遍歷!使用迭代搜索來對select更新的FD_SET進行掃描,性能可以得到一些提升。瓶頸在于,服務器必須能夠很快地掃描出FD_SET集合中的有網絡事件發生的套接字的相關信息。針對這個問題,可以使用更復雜的掃描算法,如哈希搜索,它的效率是極高的。還需要注意的一個問題就是,非分頁池(即直接在物理內存中分配的內存)的使用極高。這是因為AFDAncillary Function Driver,afd.sys提供的支持Windows Sockets應用程序的底層驅動程序,其中運行在內核模式下afd.sys驅動程序主要管理Winsock TCP/IP通信)和TCP都將使用I/O緩存,因為服務器讀取數據的速度是有限的,相對于CPU的處理速度而言,I/O基本是零字節的吞吐量。

3.基于Windows消息機制的WSAAsyncSelect模型能夠處理一定的客戶連接量,但是擴展性也不是很好。因為消息泵很快就會阻塞,降低了消息處理的速度。在幾次測試中,服務器只能處理大約1/3的客戶端連接。過多的客戶端連接請求都將返回錯誤提示碼WSAECONNREFUSED,說明服務器不能及時處理FD_ACCEPT消息導致連接失敗,這樣監聽隊列中待處理的連接請求不致于爆滿。然而,通過上表中的數據可以發現,對那些已經建立的連接,其平均吞吐量也是極低的(即使對于那些對比特率進行了限制的客戶也如此)。

4.基于事件通知的WSAEventSelect模型表現得出奇的不錯。在所有的測試中,大多數時候,服務器基本能夠處理所有的客戶連接,并且保持著較高的數據吞吐量。這種模型的缺點是,每當有一個新連接時,需要動態管理線程池,因為每個線程只能夠等待64個事件對象。當客戶連接量超過64個后再有新客戶接入時,需要創建新的線程。在最后一次測試中,建立起了超過45,000個的客戶連接后,系統響應速度變得非常緩慢。這時由于為處理大規模的客戶連接創建了大量的線程,占用了過多的系統資源。791個線程基本達到了極限,服務器不能再接受更多的連接了,原因是WSAENOBUFS:無可用的緩沖區空間,套接字無法創建。另外,客戶端程序也達到了極限,不能維持已經建立的連接。

使用事件通知的重疊I/O模型和WSAEventSelect模型在伸縮性上差不多。這兩種模型都依賴于等待事件通知的線程池,處理客戶通信時,大量線程上下文的切換是它們共同的制約因素。重疊I/O模型和WSAEventSelect模型的測試結果很相似,都表現得不錯,直到線程數量超過極限。

5.最后是針對基于完成端口通知的重疊I/O模型的性能測試,由上表中數據可以看出,它是所有I/O模型中性能最佳的。內存使用率(包括用戶分頁池和非分頁池)和支持的客戶連接量與基于事件通知的重疊I/O模型和WSAEventSelect模型基本相同。真正不同的地方,在于對CPU的占用。完成端口模型只占用了60%CPU,但是在維持同樣規模的連接量時,另外兩種模型(基于事件通知的重疊I/O模型和WSAEventSelect模型)占用更多的CPU。完成端口的另外一個明顯的優勢是,它維持更大的吞吐量。

對以上各種模型進行分析后,可以會發現客戶端與服務器數據通信機制本身存在的缺陷是一個瓶頸。在以上測試中,服務器被設計成只做簡單的回應,即只是將客戶端發送過來的數據發送回去。客戶端(即使有比特率限制)不停的發送數據給服務器,這導致大量數據阻塞在服務器上與這個客戶端對應的套接字上(無論是TCP緩沖區還是AFD的單套接字緩沖區,它們都是在非分頁池上)。在最后三種性能比較好的模型中,同一時間只能執行一個接受輸入操作,這意味著在大多數時間,還是有很多數據處于未決狀態。可以修改服務器程序使其以異步方式接受數據,這樣一旦有數據達到,需要將數據緩存起來。這種方案的缺點是,當一個客戶連續發送數據時,異步接受到了大量的數據。這會導致其他的客戶無法接入,因為調用線程和工作者線程都不能處理其他的事件或完成通知。通常情況下,調用非阻塞異步接收函數,先返回WSAEWOULDBLOCK,然后數據間斷性的傳輸,而不采取連續接收的方式。

從以上測試結果,可以看出WSAEventSelect模型和重疊I/O模型是性能表現最佳的。兩種基于事件通知的模型中,創建線程池來等待事件完成通知并作后續處理是很繁瑣的,但是并不影響以它們來架構中型服務器的良好性能。當線程的數量隨著客戶端連接數量而逐增時,CPU將花費大量時間在線程的上下文切換上,這將影響服務器的伸縮性,因為連接量達到一定數量后,便飽和了。完成端口模型提供了最佳的可擴展性,因為CPU使用率低,其支持的客戶連接量相對其他模型最多。

     I/O模型的選擇

通過上一節對各種模型的測試分析,對于如何挑選最適合自己應用程序的I/O模型已經很明晰了。同開發一個簡單的運行多線程的鎖定模式應用相比,其他每種I/O模型都需要更為復雜的編程工作。因此,針對客戶機和服務器應用開發模型的選擇,有以下原則。

1. 客戶端

若打算開發一個客戶機應用,令其同時管理一個或多個套接字,那么建議采用重疊I/OWSAEventSelect模型,以便在一定程度上提升性能。然而,假如開發的是一個以Windows為基礎的應用程序,要進行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一種最好的選擇,因為WSAAsyncSelect本身便是從Windows消息模型借鑒來的。采用這種模型,程序需具備消息處理功能。

2. 服務器端

若開發的是一個服務器應用,要在一個給定的時間,同時控制多個套接字,建議采用重疊I/O模型,這同樣是從性能角度考慮的。但是,如果服務器在任何給定的時間,都會為大量I/O請求提供服務,便應考慮使用I/O完成端口模型,從而獲得更佳的性能。

說明:

本文主要譯自Network programming for microsoft windows一書的6.4節《服務器策略》。

posted on 2009-09-10 18:44 楊粼波 閱讀(640) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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在线| 欧美日韩一区不卡| 国产精品久久久久久久久久免费看| 国产精品福利在线观看网址| 国产精品久久久久久久午夜| 国产亚洲午夜| 亚洲国产综合91精品麻豆| 99精品国产高清一区二区 | 亚洲一区影院| 久久久久久成人| 欧美日韩亚洲不卡| 一区免费观看视频| 亚洲一区欧美一区| 欧美freesex8一10精品| 日韩一级黄色av| 欧美黑人多人双交| 欧美激情一区二区三区蜜桃视频 | 久久黄色网页| 久久综合伊人| 国产精品久久网站| 亚洲黄色免费| 欧美呦呦网站| 99亚洲伊人久久精品影院红桃| 久久er精品视频| 国产精品久久久久9999高清| 亚洲国产另类 国产精品国产免费| 亚洲专区在线| 亚洲激情另类| 久久成人av少妇免费| 欧美日韩久久精品| 亚洲区一区二| 欧美成人国产| 久久疯狂做爰流白浆xx| 国产精品久久久一区麻豆最新章节| 亚洲高清视频在线| 久久婷婷国产综合精品青草| 国产精品久久久久久福利一牛影视 | 午夜久久资源| 亚洲国产精品成人| 久久成人av少妇免费| 欧美日韩久久精品| 亚洲理伦在线| 欧美电影免费观看高清| 久久黄色小说| 国产日韩亚洲| 久久精品99国产精品日本| 亚洲一区二区三区在线看| 欧美理论大片| 在线亚洲激情| 999在线观看精品免费不卡网站| 欧美成人一二三| 亚洲麻豆国产自偷在线| 亚洲国产高清高潮精品美女| 免费高清在线视频一区·| 亚洲国产精品毛片| 亚洲第一精品久久忘忧草社区| 久久综合图片| 91久久精品国产91性色tv| 亚洲国产精品成人| 欧美日韩国产123| 亚洲一区三区电影在线观看| 亚洲午夜国产一区99re久久 | 亚洲欧美综合网| 国产亚洲精品bv在线观看| 久久精品99| 麻豆乱码国产一区二区三区| 亚洲人成久久| 一区二区三区日韩在线观看| 国产精品美女一区二区| 久久成人精品无人区| 久久精品国产91精品亚洲| 在线观看视频一区二区| 亚洲欧洲一区二区在线播放| 国产精品theporn| 激情久久久久久久| 亚洲图片欧美午夜| 久久久久久色| 久久国产精品99精品国产| 狠狠色丁香婷婷综合久久片| 美日韩精品免费| 欧美精品二区三区四区免费看视频| 亚洲美女在线观看| 亚洲视频综合| 亚洲电影免费在线| 一区二区三区四区五区在线| 国产一区二区三区自拍| 亚洲国产精品专区久久| 国产精品你懂的在线欣赏| 美日韩在线观看| 欧美三级黄美女| 噜噜噜91成人网| 欧美特黄一级| 欧美国产丝袜视频| 欧美激情亚洲精品| 亚洲视频播放| 美国成人直播| 久久精品一区二区三区不卡牛牛| 影视先锋久久| 亚洲欧美日韩精品| 激情丁香综合| 亚洲视频每日更新| 亚洲片区在线| 久久精品一区二区国产| 亚洲视频观看| 欧美成人精品福利| 久久久噜噜噜久噜久久 | 亚洲精品美女| 久久精品欧美日韩精品| 亚洲欧美精品suv| 免费亚洲一区二区| 久久一二三区| 国产亚洲一区二区精品| 99国产欧美久久久精品| 亚洲欧洲美洲综合色网| 久久爱www.| 欧美在线视频全部完| 国产精品ⅴa在线观看h| 亚洲日本理论电影| 亚洲国产精品电影在线观看| 欧美在线免费播放| 久久成人av少妇免费| 国产精品日韩欧美一区| 一本色道久久综合亚洲精品不卡| 91久久在线| 欧美 日韩 国产 一区| 免费日本视频一区| 亚洲第一在线| 免费成人性网站| 亚洲国产精品传媒在线观看 | 欧美视频在线免费看| 亚洲精品影视| 在线亚洲精品| 国产精品嫩草久久久久| 亚洲欧美激情视频| 欧美一区久久| 国产自产在线视频一区| 久久国产66| 欧美成在线视频| 亚洲精品一线二线三线无人区| 欧美电影免费观看大全| 亚洲三级免费电影| 亚洲欧美激情诱惑| 国产亚洲一级| 免费h精品视频在线播放| 91久久久久久久久久久久久| 亚洲免费黄色| 国产精品区免费视频| 亚洲欧美日韩在线不卡| 久久夜色精品亚洲噜噜国产mv| 1000部国产精品成人观看| 欧美成人激情在线| 在线一区欧美| 久久综合给合久久狠狠色 | 久久久欧美一区二区| 亚洲第一精品夜夜躁人人爽| 欧美大片在线观看| 亚洲一区在线播放| 久久在线视频| 在线一区免费观看| 欧美一进一出视频| 亚洲成人影音| 欧美本精品男人aⅴ天堂| 亚洲第一精品夜夜躁人人爽| 狠狠色丁香婷婷综合久久片| 欧美在线观看视频| 亚洲欧美日韩一区二区在线 | 久久综合亚州| 亚洲美女免费精品视频在线观看| 欧美日本免费| 久久精品夜色噜噜亚洲a∨| 亚洲激情视频在线观看| 欧美一级在线播放| 最新日韩欧美| 国产午夜精品美女视频明星a级| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧美高清| 亚洲精品一区二区三区99| 久久免费99精品久久久久久| 一区二区三区视频在线观看| 韩国av一区二区| 国产精品欧美日韩一区| 免费日韩av片| 久久精品1区| 夜夜嗨av一区二区三区| 欧美成年人视频网站| 久久精品国产69国产精品亚洲| 日韩亚洲欧美成人| 一区免费视频| 国产欧美日韩在线观看| 欧美小视频在线| 欧美日韩免费观看一区二区三区 | 性欧美xxxx视频在线观看|