優化方法:
增大io緩存
不應盲目增加以上隊列參數值。這樣有可能造成磁盤子系統過載或在啟動時引起設備配置報錯。因此,僅增加hdisk的queue_depths值並不是最好的方法,而應該同時調整可提交最大IO數量。當queue_depths和發送至磁盤子系統的IO數量同時增加時,IO響應時間可能會增加,但同時吞吐量也得到了提升。當IO響應時間接近磁盤超時時間,則說明所提交IO超過了磁盤能夠處理的界限。如果看到IO超時並在錯誤日志中報出IO無法完成,說明可能有硬件問題,或需要縮短隊列。
調整queue_depths的一條法則是:對於隨機讀寫或隊列未滿的情況,如果IO響應時間超過15ms,就不能再增加queue_depths值。一旦IO響應時間增加,瓶頸就從磁盤和adapter隊列轉移至磁盤子系統。調整隊列長度應依據:1)實際應用程序產生的IO請求數,2)使用測試工具以觀察磁盤子系統的處理能力。其中,1)為主要依據。
IO隊列有以下四種狀態:
- 隊列已滿,IO等在hdisk或adapter驅動層
- 隊列未滿,IO響應時間短
- 隊列未滿,IO響應時間長
- 隊列未滿,IO提交速度快於存儲處理速度並導致IO丟失
我們需要把隊列調整為2或3的狀態。情況3表明瓶頸不在hdisk驅動層,而很有可能在磁盤子系統自身,也有可能位於adapter驅動層或SAN。
第4種情況是應該避免的。受限於存儲IO請求和數據的內存大小,所有磁盤和磁盤子系統都有IO執行數量的限制。當存儲丟失IO時,主機端超時,IO將被重新提交,同時等待該IO的事件將被暫停。CPU為了處理IO多做了很多事情,這種情況應該避免。如果IO最終失敗,將會導致應用程序崩潰或更嚴重的結果。所以必須仔細確認存儲的處理極限。
合理的平均IO響應時間:
假設隊列中沒有IO,一次讀操作將會占據0至15ms,取決於尋址時間,磁盤轉速,以及數據傳輸時間。之后數據從存儲移動至主機。有時數據位於磁盤讀緩存,這種情況下IO響應時間約為1ms。對於大型磁盤系統在正常工作狀態下,平均IO響應時間約為5-10ms。當隨機讀取小數據耗時超過15ms時,表明存儲較為繁忙。
寫操作通常將數據寫入cache中,平均耗時不到2.5ms。但是也有例外:如果存儲同步將數據鏡像至遠端,寫操作將耗費更長時間。如果寫入數據量較大(多於64KB)則數據傳輸時間會顯著增加。沒有cache的情況下,寫時間的讀時間差不多。
如果IO是大塊順序讀寫,除了傳輸時間較長,IO會暫存於磁盤物理層隊列,IO響應時間遠高於平均值。例如:應用提交50個IO(50個64KB順序讀),最初幾個IO會獲得較快的響應時間,而最后一個IO必須等待其他49個完成,從而耗費很長的響應時間。
Windows五種IO模型性能分析
重疊I/O模型的另外幾個優點在於,微軟針對重疊I/O模型提供了一些特有的擴展函數。當使用重疊I/O模型時,可以選擇使用不同的完成通知方式。
采用事件對象通知的重疊I/O模型是不可伸縮的,因為針對發出WSAWaitForMultipleEvents調用的每個線程,該I/O模型一次最多都只能支持6 4個套接字。假如想讓這個模型同時管理不止64個套接字,必須創建額外的工作者線程,以便等待更多的事件對象。因為操作系統同時能夠處理的事件對象是有限的,所以基於事件對象的I/O模型不具備伸縮性。
使用完成例程通知的重疊I/O模型,因為以下幾個原因,也不是開發高性能服務器的最佳選擇。首先,許多擴展功能不允許使用APC(Asyncroneus 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 Xeon的CPU,768M內存;客戶端有3台PC,配置分別是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 listen(SOCKET 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集合中的有網絡事件發生的套接字的相關信息。針對這個問題,可以使用更復雜的掃描算法,如哈希搜索,它的效率是極高的。還需要注意的一個問題就是,非分頁池(即直接在物理內存中分配的內存)的使用極高。這是因為AFD(Ancillary 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/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如開發的是一個以Windows為基礎的應用程序,要進行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一種最好的選擇,因為WSAAsyncSelect本身便是從Windows消息模型借鑒來的。采用這種模型,程序需具備消息處理功能。
2. 服務器端
若開發的是一個服務器應用,要在一個給定的時間,同時控制多個套接字,建議采用重疊I/O模型,這同樣是從性能角度考慮的。但是,如果服務器在任何給定的時間,都會為大量I/O請求提供服務,便應考慮使用I/O完成端口模型,從而獲得更佳的性能。
windows 服務器性能優化 IO 優化三
增加文件系統緩存
磁盤緩存有兩種,這兩種的主要目的也是不同的。
第一種是硬盤上自帶的緩存,他的作用主要是用於提升磁盤性能。早期大多數為512K-2M,現在的主流硬盤都提升到8M,甚 至有部份達到16M以及32M的。由於它們是硬盤上的一個硬件,其容量是不能更改的。
第二種是指OS或者下載軟件在內存上開辟出來的緩沖區,一般都比較大(相對於碰盤上的緩存),並且可以隨時更改。它的作用主要是減少碰盤的IO操作,延長磁盤的壽命。
磁盤緩存對xp運行起着至關重要的作用,但是默認的I/O頁面文件比較保守。所以,對於不同的內存,采用不同的磁盤緩存是比較好的做法。
1.運行 \"regedit\";edit; 2.去[HKEY_LOCA
2.去[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management\\IoPageLockLimit];
3.根據你的內存修改其十六進制值:
64M: 1000; (2M)
128M: 4000; (8M)
256M: 10000; (16M)
512M或更大: 40000. (64M)。
硬盤的緩存
點擊電腦桌面上的“開始”/“運行”,鍵入““msconfig”啟動“系統配置實用程序”,跟着選中“system.ini”標簽下的“Vcache”項,就可以根據系統的實際情況來調節硬盤的緩存了。在該選項中一般會有三行內容:ChunkSize=1024、MaxFileCache=10240和MinFileCache=10240;其中第一行是緩沖區讀寫單元值,第二、三行是硬盤的最大和最小緩沖值,等號后的數值都是可以修改的,只要右鍵單擊選中任一行就可以進行修改了。如果你的內存是128MB的話,上面這三行的取值就比較合理了,當然也可以自定。如果不知道該如何設置合適的緩沖值,請“Windows優化大師”幫忙吧,這個軟件中有一個“磁盤緩存優化”項,用鼠標就可以方便地設置好緩存;又或者讓“Windows優化大師”自動幫你進行優化設置。當硬盤的緩存值足夠大時,硬盤就不用頻繁地讀寫磁盤,一來可以延長硬盤的壽命,二來也可以提高數據的傳輸速度。(在 Widows98 下很簡單,只要在 system.ini 的[VCache] 段下設置 MinFileCache 和 MaxFileCache 的大小就可以了,在 Win2000, XP 下這些字段的設置無效了)。
另外,將硬盤的“文件系統緩存”設置為“網絡服務器”,可以加快系統對硬盤的訪問速度,因為文件系統緩存里存放了硬盤最近被訪問過的文件名和路徑,緩存越大所能儲存的內容也就越多。如果點擊“控制面板”/“系統”/“性能”/“文件系統”/“硬盤”,將“此計算機的主要用途”由“台式機”改為“網絡服務器”,可以將原來10K左右的緩存增加至近50K左右。
啟用磁盤寫入緩存在“我的電腦”上單擊鼠標右鍵選擇“屬性->硬件”,打開設備管理器找到當前正在使用的硬盤,單擊鼠標[/url]右鍵選擇屬性。在硬盤屬性的的“策略”頁中,打開“啟用磁盤上的寫入緩存”(如圖1)。
這個選項將會激活硬盤的寫入緩存,從而提高硬盤的讀寫速度。不過要注意一點,這個功能打開后,如果計算機突然斷電可能會導致無法挽回的數據丟失。因此最好在有UPS的情況下再打開這個功能。當然,如果你平常使用計算機時不要進行什么重要的數據處理工作,沒有UPS也無所謂,這個功能不會對系統造成太大的損失。
控制系統緩存
讓硬盤使用DMA(直接內存訪問)
如果你的“愛姬”不是“太后”級的,那么一般來說,你的硬盤已經支持Ultra DMA 100模式了(當然目前支持Ultra DMA 133的硬盤也已經比比皆是了),其最大瞬間傳輸率為100MB/S,且占用CPU時間更少,那么我們為什么不使用DMA來進行加速呢?可惜在Windows 98的系統默認設置中,該功能卻是被禁用的,需要手工打開它。
實現方法:在“控制面板”中,點擊“系統-設備管理-磁盤驅動器-GENERIC IDE DISK TYPE46(不同的機器上該值可能有所不同) –屬性-設置”(對硬盤而言),然后選擇DMA即可。
讓硬盤使用更多的內存做cache(高速緩存)
Cache 可以顯著提高系統性能,這是人所公知的,不是連cpu都需要一級cache,二級cache甚至三級cache嗎?硬盤上面的cache即已無法再變,但是我們可以讓硬盤使用內存做cache,這樣他們跑起來是不是要塊一些?有兩點要注意:
(1)要使下面的修改生效,系統必須使用32位的CDFS。不過請放心,Windows 98已經默認使用了。
(2)這里設置的都是物理內存,只有內存在32MB以上效果才能比較明顯,否則可能會弄巧成拙。
下面我們就來看一下其實現方法:對硬盤來說,用記事本打開系統目錄下的System.ini文件,找到[Vcache]段,在其下面分別寫入MinFileCacheSize=xxxx、MaxFileCacheSize=xxxx、ChunkSize=yyyy,其中的XXXX是Cache的大小,以KB為單位,若有16MB內存可取值2048,若有32MB內存可取值4124,若有64MB內存可取值4096等;YYYY是每一個緩存塊的大小,一般設置為1024即可。
讓硬盤使用FAT32
在分區時即指定讓硬盤使用FAT32或者用一些轉換程序將硬盤由FAT16轉為FAT32,這樣不但可以通過更高效地存儲數據以節省磁盤空間(大約10%-15%),而且還可以改善磁盤的性能,在使用較少的系統資源的情況下使程序運行加快50%。
實現方法:在Windows 98中,單擊“開始-程序-附件-系統工具-驅動器轉換器(FAT32)”,然后按操作說明一步步進行即可。
優化文件系統
通過更改文件系統設置,可以顯著改善系統性能。
實現方法:在“控制面板”中,單擊“系統-性能-文件系統…”,在“硬盤”標簽中,將“計算機的主要用途”改為“網絡服務器”,“預讀式優化”調到“全部”;在“軟盤”標簽中,將“每次啟動計算機時都搜尋新的軟盤驅動器”取消(因為默認情況下,軟盤驅動程序在每次啟動Windows 98時都要掃描新設備,而通過禁止系統啟動時檢查軟驅,讓軟盤驅動程序仍然使用先前的設置,則可以使系統啟動速度更快);在“CD-ROM”標簽中,將“追加的高速緩存”調至最大,“最佳的訪問方式”選“四倍速或更高速”;在“可移動式磁盤”標簽中,選取“啟動所有可移動型磁盤驅動器上的后與高速緩存”。
讓文件系統也使用Cache
系統在讀寫文件時要訪問文件分配表,而文件系統Cache則可以把剛訪問過的文件的路經和文件名存入內存,以加快下一次的訪問速度。
設置方法:在注冊表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\FSTemlates位置下有三個名為“Desktop”、“Mobile”、“Server”的主鍵,分別對應上述“文件系統屬性”對話框中“台式機”、“便攜或接駁式系統”、“網絡服務器”三個選項。如果使用的是台式機就可對“Desktop”中的字符串“NameCache”、“PathCache”進行修改;MameCache=“80 00 00 00”(可緩沖128個文件夾)、PathCache=“00 10 00 00”(可緩沖4096個8.3格式的文件名,約使用48KB常規內存)。
https://community.emc.com/docs/DOC-18970
https://community.emc.com/thread/129131
https://community.emc.com/thread/145929