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

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

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

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


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