彭海云,李 亞
(周口師范學(xué)院 計(jì)算機(jī)科學(xué)系,河南 周口 466001)
隨著網(wǎng)絡(luò)的不斷發(fā)展,工作站和服務(wù)器也不斷增多,其提供的服務(wù)也越來(lái)越多,其中很重要的一個(gè)就是文件服務(wù)器。它為使用者提供文件儲(chǔ)存功能,用戶希望能夠快速訪問(wèn)到自己經(jīng)常存儲(chǔ)在文件服務(wù)器上的文件,因此作為文件服務(wù)器,需要有好的性能,能夠提供快速、安全的訪問(wèn)方式。這需要作為服務(wù)器的計(jì)算機(jī)除了本身具有比較好的性能外,還需要很好地去組織存儲(chǔ)在服務(wù)器磁盤(pán)的文件,把經(jīng)常被訪問(wèn)的文件數(shù)據(jù)放在快速存儲(chǔ)器中(Cache)。I/O Trace收集器能夠在不影響服務(wù)器正常工作的情況下,收集I/O Trace信息,并將這些信息保存在日志文件中,然后分析器依據(jù)這些保存的信息進(jìn)行分析,從而找出一些規(guī)律,將經(jīng)常被訪問(wèn)到的數(shù)據(jù)保存在快速存儲(chǔ)器中,以優(yōu)化服務(wù)器的性能。目前也出現(xiàn)了一系列的比較成熟的產(chǎn)品,比如FileMon,它是基于文件級(jí)別的,也就是說(shuō)它只是記錄經(jīng)常訪問(wèn)的一些文件,并沒(méi)有具體的定位到文件中哪一部分,它所記錄的Trace信息不夠細(xì)膩,比如,如果一個(gè)文件很大,也許被經(jīng)常訪問(wèn)的只是文件中的某一小部分,但它無(wú)法定位這一小部分?jǐn)?shù)據(jù),也就無(wú)法只把這一小部分?jǐn)?shù)據(jù)放入快速存儲(chǔ)器中而達(dá)到提升性能的目的。基于WDM的磁盤(pán)I/O Trace收集器是基于扇區(qū)級(jí)別實(shí)現(xiàn)的I/O Trace,它能夠知道硬盤(pán)上哪些扇區(qū)經(jīng)常被訪問(wèn)到[1-4]。
通過(guò)加載基于磁盤(pán)的WDM過(guò)濾驅(qū)動(dòng)程序,截獲讀寫(xiě)磁盤(pán)的I/O請(qǐng)求包,從請(qǐng)求包中獲取讀寫(xiě)磁盤(pán)的信息(包括讀寫(xiě)磁盤(pán)的起始扇區(qū)以及讀寫(xiě)扇區(qū)的數(shù)目),然后通過(guò)另外一個(gè)線程將這些信息寫(xiě)入日志文件中,見(jiàn)圖1。

I/O Trace收集器主要由兩個(gè)功能模塊組成,一個(gè)是獲取讀寫(xiě)磁盤(pán)的信息,另一個(gè)是將獲取到的讀寫(xiě)磁盤(pán)的信息寫(xiě)入到日志文件中。
模塊分解一:獲取讀寫(xiě)磁盤(pán)信息。
由于需要實(shí)現(xiàn)磁盤(pán)I/O Trace收集器,需要收集到系統(tǒng)讀寫(xiě)磁盤(pán)的相關(guān)信息,因此就需要有一個(gè)模塊去獲取這些信息,當(dāng)前需要獲取的信息主要是讀寫(xiě)磁盤(pán)的位置,這個(gè)位置是以扇區(qū)來(lái)定義的。這個(gè)模塊的輸入是讀寫(xiě)磁盤(pán)的I/O請(qǐng)求包,輸出則是讀寫(xiě)磁盤(pán)的起始扇區(qū)以及讀寫(xiě)扇區(qū)的數(shù)目。
模塊分解二:寫(xiě)獲取的讀寫(xiě)磁盤(pán)信息到日志文件。
獲取到的讀寫(xiě)磁盤(pán)的信息需要被記錄到日志文件中,然后相關(guān)的分析器就可以通過(guò)分析日志文件知道哪些扇區(qū)是經(jīng)常被訪問(wèn)到的,于是就需要專門(mén)的模塊去完成寫(xiě)信息到日志文件中。在這個(gè)磁盤(pán)I/O Trace收集器的實(shí)現(xiàn)中,寫(xiě)信息到日志文件是用一個(gè)專門(mén)的系統(tǒng)線程去完成這個(gè)工作的。
首先基于磁盤(pán)的WDM過(guò)濾驅(qū)動(dòng)程序分發(fā)例程(簡(jiǎn)稱SCSI例程)將讀寫(xiě)磁盤(pán)的I/O請(qǐng)求包傳給獲取讀寫(xiě)磁盤(pán)的信息模塊,然后該模塊便返回獲取到的讀寫(xiě)磁盤(pán)的信息,這時(shí),SCSI例程將獲取讀寫(xiě)磁盤(pán)的信息模塊返回的數(shù)據(jù)傳給寫(xiě)獲取的讀寫(xiě)磁盤(pán)的信息到日志文件模塊來(lái)完成讀寫(xiě)磁盤(pán)信息的保存。
當(dāng)系統(tǒng)需要讀寫(xiě)磁盤(pán)時(shí),I/O管理器會(huì)構(gòu)造一個(gè)I/O請(qǐng)求包,該請(qǐng)求包最終會(huì)被轉(zhuǎn)換格式并發(fā)給I/O Trace收集器對(duì)應(yīng)的WDM過(guò)濾驅(qū)動(dòng)程序的SCSI例程,然后該例程調(diào)用獲取信息模塊來(lái)獲取讀寫(xiě)磁盤(pán)的信息。再將獲取到的數(shù)據(jù)傳給寫(xiě)日志文件模塊,該模塊先將這些數(shù)據(jù)封裝為鏈表的節(jié)點(diǎn),插入到預(yù)先初始化好的鏈表中,然后返回SCSI例程,SCSI例程繼續(xù)傳遞該I/O請(qǐng)求包之的下層驅(qū)動(dòng)程序以完成讀寫(xiě)磁盤(pán)的操作。而讀寫(xiě)磁盤(pán)的信息被插入到鏈表中以后,最終會(huì)被寫(xiě)日志文件模塊對(duì)應(yīng)的一個(gè)系統(tǒng)線程從鏈表中取出,并將其中的數(shù)據(jù)寫(xiě)入日志文件[5-6]。
日志線程完成需從鏈表中取出節(jié)點(diǎn),將節(jié)點(diǎn)中的數(shù)據(jù)寫(xiě)入日志文件。具體流程如圖2所示。
由于機(jī)器啟動(dòng)時(shí)加載驅(qū)動(dòng)程序的順序是通過(guò)讀取注冊(cè)表來(lái)定義的,因此可以通過(guò)修改注冊(cè)表來(lái)使系統(tǒng)把過(guò)濾驅(qū)動(dòng)程序加載到特定的地方去,如圖3所示。
圖中LowerFilters鍵是為了安裝程序而新增加的,使系統(tǒng)在加載磁盤(pán)類驅(qū)動(dòng)前,先加載Wdm1下層過(guò)濾驅(qū)動(dòng)程序。這樣過(guò)濾驅(qū)動(dòng)程序就能夠正常地安裝在正確的位置了。該圖對(duì)應(yīng)的注冊(cè)表的位置是HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4D36E 967-E325-11CE-BFC1-08002BE10318}。

修改了注冊(cè)表的這個(gè)位置,就完成了安裝過(guò)濾驅(qū)動(dòng)程序最重要的操作,剩下的事情可以交給INF文件去完成。當(dāng)寫(xiě)好相關(guān)的INF文件后,直接右鍵點(diǎn)擊INF文件,在彈出的菜單中選擇安裝選項(xiàng)即可完成安裝工作。
安裝好以后可以查看注冊(cè)表的相關(guān)項(xiàng),以了解INF文件究竟做了哪寫(xiě)操作,其實(shí)INF文件主要的作用就是修改注冊(cè)表的相關(guān)位置,并將驅(qū)動(dòng)程序(擴(kuò)展名為sys的文件)復(fù)制到驅(qū)動(dòng)程序目錄,并在該設(shè)備對(duì)應(yīng)的注冊(cè)表中設(shè)置驅(qū)動(dòng)程序所在的位置與其他值。圖4顯示了磁盤(pán)I/O Trace收集器對(duì)應(yīng)的注冊(cè)表項(xiàng)。

從圖中可以看出幾個(gè)比較重要的數(shù)據(jù)項(xiàng),比如ImagePath便是描述驅(qū)動(dòng)程序所在的位置,而Start的值為0表示該過(guò)濾驅(qū)動(dòng)程序在機(jī)器啟動(dòng)時(shí)便加載。其他值的功能在此不列舉。
這個(gè)功能測(cè)試比較簡(jiǎn)單,只要日志文件中記錄的扇區(qū)位置是正確的,便可以說(shuō)明該磁盤(pán)I/O Trace收集器能夠正常地工作。從其中一個(gè)分區(qū)拷貝一個(gè)比較大的文件到另一個(gè)分區(qū),然后分析日志文件記錄下來(lái)的數(shù)據(jù),并計(jì)算這些扇區(qū)應(yīng)該位于哪個(gè)分區(qū),來(lái)判斷它的正確性,雖然測(cè)試方法有些粗糙,但經(jīng)過(guò)大量的測(cè)試和計(jì)算,發(fā)現(xiàn)分區(qū)的扇區(qū)范圍能夠?qū)?yīng)起來(lái),也說(shuō)明了所記錄數(shù)據(jù)的正確性。
性能測(cè)試是通過(guò)軟件Iometer來(lái)進(jìn)行測(cè)試的,圖5記錄的是寫(xiě)磁盤(pán)時(shí)不安裝磁盤(pán)I/O Trace收集器與安裝磁盤(pán)I/O Trace收集器的性能對(duì)比,圖6記錄的是讀磁盤(pán)時(shí)兩者的性能對(duì)比。


由圖5和圖6可以看出,安裝磁盤(pán)Trace收集器對(duì)磁盤(pán)的性能影響相當(dāng)小,接近1%,基本上可以忽略,不會(huì)對(duì)系統(tǒng)的性能產(chǎn)生很大的影響。因此,通過(guò)加載基于磁盤(pán)的WDM過(guò)濾驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)I/O Trace收集器是可行的。
在設(shè)計(jì)磁盤(pán)I/O Trace收集器的過(guò)程中有兩個(gè)問(wèn)題比較棘手,可能也是所有基于磁盤(pán)的WDM過(guò)濾驅(qū)動(dòng)訪問(wèn)文件時(shí)都會(huì)碰到的問(wèn)題。
1)延遲創(chuàng)建日志文件
如果在DriverEntry例程中立即調(diào)用創(chuàng)建日志文件的例程,則會(huì)返回失敗,原因是系統(tǒng)尚未初始化完畢,很多服務(wù)尚不可用,解決的辦法是增加一定的延遲,跳過(guò)記錄系統(tǒng)啟動(dòng)時(shí)讀取磁盤(pán)的信息。
2)寫(xiě)磁盤(pán)的遞歸問(wèn)題
寫(xiě)磁盤(pán)的遞歸問(wèn)題(因?yàn)橛杏涗浘鸵獙?xiě)磁盤(pán),而寫(xiě)磁盤(pán)又有記錄),這樣便產(chǎn)生了寫(xiě)磁盤(pán)的遞歸問(wèn)題。解決這個(gè)問(wèn)題的方案是將日志文件數(shù)據(jù)通過(guò)網(wǎng)絡(luò)發(fā)送出去,或者在磁盤(pán)中專門(mén)劃分一塊區(qū)域來(lái)保存日志文件,這樣在寫(xiě)的讀寫(xiě)的范圍位于這塊專用的區(qū)域中時(shí),則不記錄。
本文設(shè)計(jì)并實(shí)現(xiàn)了基于WDM的磁盤(pán)I/O Trace的收集器,測(cè)試證明,該收集器能夠詳細(xì)記錄讀寫(xiě)磁盤(pán)的信息,為優(yōu)化服務(wù)器讀寫(xiě)性能提供了原始數(shù)據(jù)。近幾年,又出現(xiàn)了很多新的網(wǎng)絡(luò)應(yīng)用,比如網(wǎng)上點(diǎn)歌系統(tǒng)、視頻點(diǎn)播系統(tǒng),如果在這些系統(tǒng)上安裝Trace分析與收集器,就能夠?qū)⒑芏嗳它c(diǎn)播的一些歌曲以及視頻文件的數(shù)據(jù)存放在速度更快的存儲(chǔ)器中,這樣可以更好的提供服務(wù)。因此,I/O Trace收集與分析器具有廣闊的前景。
[1]CANT C.Writing Windows WDM設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)指南[M].孫義,馬莉波,國(guó)雪飛,等譯.北京:機(jī)械工業(yè)出版社,2000.
[2]BAKER A,LOZANO J.The Windows 2000 device driver book[M].2版.施諾,譯.北京:機(jī)械工業(yè)出版社,2001.
[3]王峰博,崔慧娟.WDM設(shè)備驅(qū)動(dòng)程序的研究及實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2003,23(6):98-100.
[4]榮佳波,常明志,井科偉.USB設(shè)備的WDM驅(qū)動(dòng)程序設(shè)計(jì)[J].應(yīng)用科技,2004,31(3):39-41.
[5]吳力煒,葉念渝.Windows平臺(tái)下的設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)[J].計(jì)算機(jī)與數(shù)字工程,2007,35(3):196-198.
[6]楊進(jìn),魏軼偉,賈惠波.存儲(chǔ)區(qū)域網(wǎng)的性能測(cè)試[J].計(jì)算機(jī)工程,2003(11):25-26.