基于WDM的磁盘I/O收集器的设计与实现

2011-03-15 01:22彭海云
电视技术 2011年11期
关键词:收集器注册表驱动程序

彭海云,李 亚

(周口师范学院 计算机科学系,河南 周口 466001)

0 引言

随着网络的不断发展,工作站和服务器也不断增多,其提供的服务也越来越多,其中很重要的一个就是文件服务器。它为使用者提供文件储存功能,用户希望能够快速访问到自己经常存储在文件服务器上的文件,因此作为文件服务器,需要有好的性能,能够提供快速、安全的访问方式。这需要作为服务器的计算机除了本身具有比较好的性能外,还需要很好地去组织存储在服务器磁盘的文件,把经常被访问的文件数据放在快速存储器中(Cache)。I/O Trace收集器能够在不影响服务器正常工作的情况下,收集I/O Trace信息,并将这些信息保存在日志文件中,然后分析器依据这些保存的信息进行分析,从而找出一些规律,将经常被访问到的数据保存在快速存储器中,以优化服务器的性能。目前也出现了一系列的比较成熟的产品,比如FileMon,它是基于文件级别的,也就是说它只是记录经常访问的一些文件,并没有具体的定位到文件中哪一部分,它所记录的Trace信息不够细腻,比如,如果一个文件很大,也许被经常访问的只是文件中的某一小部分,但它无法定位这一小部分数据,也就无法只把这一小部分数据放入快速存储器中而达到提升性能的目的。基于WDM的磁盘I/O Trace收集器是基于扇区级别实现的I/O Trace,它能够知道硬盘上哪些扇区经常被访问到[1-4]。

1 实现原理及模块分解

通过加载基于磁盘的WDM过滤驱动程序,截获读写磁盘的I/O请求包,从请求包中获取读写磁盘的信息(包括读写磁盘的起始扇区以及读写扇区的数目),然后通过另外一个线程将这些信息写入日志文件中,见图1。

2 模块的详细分析

I/O Trace收集器主要由两个功能模块组成,一个是获取读写磁盘的信息,另一个是将获取到的读写磁盘的信息写入到日志文件中。

模块分解一:获取读写磁盘信息。

由于需要实现磁盘I/O Trace收集器,需要收集到系统读写磁盘的相关信息,因此就需要有一个模块去获取这些信息,当前需要获取的信息主要是读写磁盘的位置,这个位置是以扇区来定义的。这个模块的输入是读写磁盘的I/O请求包,输出则是读写磁盘的起始扇区以及读写扇区的数目。

模块分解二:写获取的读写磁盘信息到日志文件。

获取到的读写磁盘的信息需要被记录到日志文件中,然后相关的分析器就可以通过分析日志文件知道哪些扇区是经常被访问到的,于是就需要专门的模块去完成写信息到日志文件中。在这个磁盘I/O Trace收集器的实现中,写信息到日志文件是用一个专门的系统线程去完成这个工作的。

2.1 模块间的数据流动

首先基于磁盘的WDM过滤驱动程序分发例程(简称SCSI例程)将读写磁盘的I/O请求包传给获取读写磁盘的信息模块,然后该模块便返回获取到的读写磁盘的信息,这时,SCSI例程将获取读写磁盘的信息模块返回的数据传给写获取的读写磁盘的信息到日志文件模块来完成读写磁盘信息的保存。

2.2 运行动态分析

当系统需要读写磁盘时,I/O管理器会构造一个I/O请求包,该请求包最终会被转换格式并发给I/O Trace收集器对应的WDM过滤驱动程序的SCSI例程,然后该例程调用获取信息模块来获取读写磁盘的信息。再将获取到的数据传给写日志文件模块,该模块先将这些数据封装为链表的节点,插入到预先初始化好的链表中,然后返回SCSI例程,SCSI例程继续传递该I/O请求包之的下层驱动程序以完成读写磁盘的操作。而读写磁盘的信息被插入到链表中以后,最终会被写日志文件模块对应的一个系统线程从链表中取出,并将其中的数据写入日志文件[5-6]。

3 写日志线程的实现

日志线程完成需从链表中取出节点,将节点中的数据写入日志文件。具体流程如图2所示。

4 磁盘I/O Trace收集器的安装测试

4.1 收集器的安装

由于机器启动时加载驱动程序的顺序是通过读取注册表来定义的,因此可以通过修改注册表来使系统把过滤驱动程序加载到特定的地方去,如图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表示该过滤驱动程序在机器启动时便加载。其他值的功能在此不列举。

4.2 测试

4.2.1 功能测试

这个功能测试比较简单,只要日志文件中记录的扇区位置是正确的,便可以说明该磁盘I/O Trace收集器能够正常地工作。从其中一个分区拷贝一个比较大的文件到另一个分区,然后分析日志文件记录下来的数据,并计算这些扇区应该位于哪个分区,来判断它的正确性,虽然测试方法有些粗糙,但经过大量的测试和计算,发现分区的扇区范围能够对应起来,也说明了所记录数据的正确性。

4.2.2 性能测试

性能测试是通过软件Iometer来进行测试的,图5记录的是写磁盘时不安装磁盘I/O Trace收集器与安装磁盘I/O Trace收集器的性能对比,图6记录的是读磁盘时两者的性能对比。

由图5和图6可以看出,安装磁盘Trace收集器对磁盘的性能影响相当小,接近1%,基本上可以忽略,不会对系统的性能产生很大的影响。因此,通过加载基于磁盘的WDM过滤驱动程序来实现I/O Trace收集器是可行的。

5 设计中遇到的主要问题

在设计磁盘I/O Trace收集器的过程中有两个问题比较棘手,可能也是所有基于磁盘的WDM过滤驱动访问文件时都会碰到的问题。

1)延迟创建日志文件

如果在DriverEntry例程中立即调用创建日志文件的例程,则会返回失败,原因是系统尚未初始化完毕,很多服务尚不可用,解决的办法是增加一定的延迟,跳过记录系统启动时读取磁盘的信息。

2)写磁盘的递归问题

写磁盘的递归问题(因为有记录就要写磁盘,而写磁盘又有记录),这样便产生了写磁盘的递归问题。解决这个问题的方案是将日志文件数据通过网络发送出去,或者在磁盘中专门划分一块区域来保存日志文件,这样在写的读写的范围位于这块专用的区域中时,则不记录。

6 小结

本文设计并实现了基于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.

猜你喜欢
收集器注册表驱动程序
一种病房用24小时尿蛋白培养收集器的说明
一种用于内镜干燥的酒精收集器的设计与应用
计算机硬件设备驱动程序分析
更上一层楼 用好注册表编辑器
注册表的便捷用法
雷电收集器
土壤重金属收集器
基于MPC8280的CPU单元与内部总线驱动程序设计
注册表编辑器也玩“失忆”
学习器揭开注册表面纱