彭海云,李 亞
(周口師范學(xué)院 計算機科學(xué)系,河南 周口 466001)
隨著網(wǎng)絡(luò)的不斷發(fā)展,工作站和服務(wù)器也不斷增多,其提供的服務(wù)也越來越多,其中很重要的一個就是文件服務(wù)器。它為使用者提供文件儲存功能,用戶希望能夠快速訪問到自己經(jīng)常存儲在文件服務(wù)器上的文件,因此作為文件服務(wù)器,需要有好的性能,能夠提供快速、安全的訪問方式。這需要作為服務(wù)器的計算機除了本身具有比較好的性能外,還需要很好地去組織存儲在服務(wù)器磁盤的文件,把經(jīng)常被訪問的文件數(shù)據(jù)放在快速存儲器中(Cache)。I/O Trace收集器能夠在不影響服務(wù)器正常工作的情況下,收集I/O Trace信息,并將這些信息保存在日志文件中,然后分析器依據(jù)這些保存的信息進行分析,從而找出一些規(guī)律,將經(jīng)常被訪問到的數(shù)據(jù)保存在快速存儲器中,以優(yōu)化服務(wù)器的性能。目前也出現(xiàn)了一系列的比較成熟的產(chǎn)品,比如FileMon,它是基于文件級別的,也就是說它只是記錄經(jīng)常訪問的一些文件,并沒有具體的定位到文件中哪一部分,它所記錄的Trace信息不夠細膩,比如,如果一個文件很大,也許被經(jīng)常訪問的只是文件中的某一小部分,但它無法定位這一小部分數(shù)據(jù),也就無法只把這一小部分數(shù)據(jù)放入快速存儲器中而達到提升性能的目的?;赪DM的磁盤I/O Trace收集器是基于扇區(qū)級別實現(xiàn)的I/O Trace,它能夠知道硬盤上哪些扇區(qū)經(jīng)常被訪問到[1-4]。
通過加載基于磁盤的WDM過濾驅(qū)動程序,截獲讀寫磁盤的I/O請求包,從請求包中獲取讀寫磁盤的信息(包括讀寫磁盤的起始扇區(qū)以及讀寫扇區(qū)的數(shù)目),然后通過另外一個線程將這些信息寫入日志文件中,見圖1。
I/O Trace收集器主要由兩個功能模塊組成,一個是獲取讀寫磁盤的信息,另一個是將獲取到的讀寫磁盤的信息寫入到日志文件中。
模塊分解一:獲取讀寫磁盤信息。
由于需要實現(xiàn)磁盤I/O Trace收集器,需要收集到系統(tǒng)讀寫磁盤的相關(guān)信息,因此就需要有一個模塊去獲取這些信息,當(dāng)前需要獲取的信息主要是讀寫磁盤的位置,這個位置是以扇區(qū)來定義的。這個模塊的輸入是讀寫磁盤的I/O請求包,輸出則是讀寫磁盤的起始扇區(qū)以及讀寫扇區(qū)的數(shù)目。
模塊分解二:寫獲取的讀寫磁盤信息到日志文件。
獲取到的讀寫磁盤的信息需要被記錄到日志文件中,然后相關(guān)的分析器就可以通過分析日志文件知道哪些扇區(qū)是經(jīng)常被訪問到的,于是就需要專門的模塊去完成寫信息到日志文件中。在這個磁盤I/O Trace收集器的實現(xiàn)中,寫信息到日志文件是用一個專門的系統(tǒng)線程去完成這個工作的。
首先基于磁盤的WDM過濾驅(qū)動程序分發(fā)例程(簡稱SCSI例程)將讀寫磁盤的I/O請求包傳給獲取讀寫磁盤的信息模塊,然后該模塊便返回獲取到的讀寫磁盤的信息,這時,SCSI例程將獲取讀寫磁盤的信息模塊返回的數(shù)據(jù)傳給寫獲取的讀寫磁盤的信息到日志文件模塊來完成讀寫磁盤信息的保存。
當(dāng)系統(tǒng)需要讀寫磁盤時,I/O管理器會構(gòu)造一個I/O請求包,該請求包最終會被轉(zhuǎn)換格式并發(fā)給I/O Trace收集器對應(yīng)的WDM過濾驅(qū)動程序的SCSI例程,然后該例程調(diào)用獲取信息模塊來獲取讀寫磁盤的信息。再將獲取到的數(shù)據(jù)傳給寫日志文件模塊,該模塊先將這些數(shù)據(jù)封裝為鏈表的節(jié)點,插入到預(yù)先初始化好的鏈表中,然后返回SCSI例程,SCSI例程繼續(xù)傳遞該I/O請求包之的下層驅(qū)動程序以完成讀寫磁盤的操作。而讀寫磁盤的信息被插入到鏈表中以后,最終會被寫日志文件模塊對應(yīng)的一個系統(tǒng)線程從鏈表中取出,并將其中的數(shù)據(jù)寫入日志文件[5-6]。
日志線程完成需從鏈表中取出節(jié)點,將節(jié)點中的數(shù)據(jù)寫入日志文件。具體流程如圖2所示。
由于機器啟動時加載驅(qū)動程序的順序是通過讀取注冊表來定義的,因此可以通過修改注冊表來使系統(tǒng)把過濾驅(qū)動程序加載到特定的地方去,如圖3所示。
圖中LowerFilters鍵是為了安裝程序而新增加的,使系統(tǒng)在加載磁盤類驅(qū)動前,先加載Wdm1下層過濾驅(qū)動程序。這樣過濾驅(qū)動程序就能夠正常地安裝在正確的位置了。該圖對應(yīng)的注冊表的位置是HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4D36E 967-E325-11CE-BFC1-08002BE10318}。
修改了注冊表的這個位置,就完成了安裝過濾驅(qū)動程序最重要的操作,剩下的事情可以交給INF文件去完成。當(dāng)寫好相關(guān)的INF文件后,直接右鍵點擊INF文件,在彈出的菜單中選擇安裝選項即可完成安裝工作。
安裝好以后可以查看注冊表的相關(guān)項,以了解INF文件究竟做了哪寫操作,其實INF文件主要的作用就是修改注冊表的相關(guān)位置,并將驅(qū)動程序(擴展名為sys的文件)復(fù)制到驅(qū)動程序目錄,并在該設(shè)備對應(yīng)的注冊表中設(shè)置驅(qū)動程序所在的位置與其他值。圖4顯示了磁盤I/O Trace收集器對應(yīng)的注冊表項。
從圖中可以看出幾個比較重要的數(shù)據(jù)項,比如ImagePath便是描述驅(qū)動程序所在的位置,而Start的值為0表示該過濾驅(qū)動程序在機器啟動時便加載。其他值的功能在此不列舉。
這個功能測試比較簡單,只要日志文件中記錄的扇區(qū)位置是正確的,便可以說明該磁盤I/O Trace收集器能夠正常地工作。從其中一個分區(qū)拷貝一個比較大的文件到另一個分區(qū),然后分析日志文件記錄下來的數(shù)據(jù),并計算這些扇區(qū)應(yīng)該位于哪個分區(qū),來判斷它的正確性,雖然測試方法有些粗糙,但經(jīng)過大量的測試和計算,發(fā)現(xiàn)分區(qū)的扇區(qū)范圍能夠?qū)?yīng)起來,也說明了所記錄數(shù)據(jù)的正確性。
性能測試是通過軟件Iometer來進行測試的,圖5記錄的是寫磁盤時不安裝磁盤I/O Trace收集器與安裝磁盤I/O Trace收集器的性能對比,圖6記錄的是讀磁盤時兩者的性能對比。
由圖5和圖6可以看出,安裝磁盤Trace收集器對磁盤的性能影響相當(dāng)小,接近1%,基本上可以忽略,不會對系統(tǒng)的性能產(chǎn)生很大的影響。因此,通過加載基于磁盤的WDM過濾驅(qū)動程序來實現(xiàn)I/O Trace收集器是可行的。
在設(shè)計磁盤I/O Trace收集器的過程中有兩個問題比較棘手,可能也是所有基于磁盤的WDM過濾驅(qū)動訪問文件時都會碰到的問題。
1)延遲創(chuàng)建日志文件
如果在DriverEntry例程中立即調(diào)用創(chuàng)建日志文件的例程,則會返回失敗,原因是系統(tǒng)尚未初始化完畢,很多服務(wù)尚不可用,解決的辦法是增加一定的延遲,跳過記錄系統(tǒng)啟動時讀取磁盤的信息。
2)寫磁盤的遞歸問題
寫磁盤的遞歸問題(因為有記錄就要寫磁盤,而寫磁盤又有記錄),這樣便產(chǎn)生了寫磁盤的遞歸問題。解決這個問題的方案是將日志文件數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送出去,或者在磁盤中專門劃分一塊區(qū)域來保存日志文件,這樣在寫的讀寫的范圍位于這塊專用的區(qū)域中時,則不記錄。
本文設(shè)計并實現(xiàn)了基于WDM的磁盤I/O Trace的收集器,測試證明,該收集器能夠詳細記錄讀寫磁盤的信息,為優(yōu)化服務(wù)器讀寫性能提供了原始數(shù)據(jù)。近幾年,又出現(xiàn)了很多新的網(wǎng)絡(luò)應(yīng)用,比如網(wǎng)上點歌系統(tǒng)、視頻點播系統(tǒng),如果在這些系統(tǒng)上安裝Trace分析與收集器,就能夠?qū)⒑芏嗳它c播的一些歌曲以及視頻文件的數(shù)據(jù)存放在速度更快的存儲器中,這樣可以更好的提供服務(wù)。因此,I/O Trace收集與分析器具有廣闊的前景。
[1]CANT C.Writing Windows WDM設(shè)備驅(qū)動程序開發(fā)指南[M].孫義,馬莉波,國雪飛,等譯.北京:機械工業(yè)出版社,2000.
[2]BAKER A,LOZANO J.The Windows 2000 device driver book[M].2版.施諾,譯.北京:機械工業(yè)出版社,2001.
[3]王峰博,崔慧娟.WDM設(shè)備驅(qū)動程序的研究及實現(xiàn)[J].計算機應(yīng)用,2003,23(6):98-100.
[4]榮佳波,常明志,井科偉.USB設(shè)備的WDM驅(qū)動程序設(shè)計[J].應(yīng)用科技,2004,31(3):39-41.
[5]吳力煒,葉念渝.Windows平臺下的設(shè)備驅(qū)動程序開發(fā)[J].計算機與數(shù)字工程,2007,35(3):196-198.
[6]楊進,魏軼偉,賈惠波.存儲區(qū)域網(wǎng)的性能測試[J].計算機工程,2003(11):25-26.