Windows 7 的 ReadyBoost 原理及使用技巧

2010年4月15日

Windows 7 的 ReadyBoost 原理及使用技巧

在 Mark Russinovich 有关 Windows Vista 的介绍中,讲到了许多新功能,包括进程调度算法的改进、页面文件预读的改进、输入输出的优先级设定、开机时的预读和加速等等。其中有一个比较特别的功能,专门为内存比较小的机器设计的,叫 ReadyBoost。Windows 7 的此功能更被加以改进,本文的后面将会讲到如何让 Windows 7 更发挥出 ReadyBoost 的功效。

ReadyBoost,中文直接翻译过来:准备好了的加强。引申的意思是接上一个设备,系统就能变快。实际上,它的确就是通过 USB 闪存盘来加速的。闪存盘可以用来加速系统吗?这就要从系统的架构来说明了。

当代的计算机系统,完成计算的器件是中央处理单元 CPU,它使用的是多级存储架构。最高级别的是 CPU 的寄存器,存取一个寄存器只需要 1 个 CPU 时钟周期,在现代的 2 GHz 的 CPU 上约合 0.5 纳秒(一纳秒 = 0.000000001 秒)。寄存器数量通常在几十到几百个。其次是 CPU 的一级缓存(用于缓存数据和指令),大小通常在 16KB 到 64KB,速度是一到二个时钟周期。二级缓存访问速度更慢些,需要几个时钟周期,也更大,一般有 256KB 到 8MB。而内存的访问周期则是几十个时钟周期,也就是说可能要 20 到 30 纳秒才能从内存里面读取一个字(与 CPU 的字长一样)。但这都算好的。当代计算机存储系统性能的瓶颈在于硬盘。

硬盘的速度如何呢?硬盘存储文件,文件的读取通常以簇为单位,Windows 系统使用 NTFS 文件系统,通常一个簇是 4KB。当硬盘被连续读取时,可以一次读完一整个柱面。比如有两个盘片的硬盘,一共四个面,一条磁道假设有 300 个扇区,每个扇区 512 字节。那么一次可以读到 4 * 300 * 512 = 614400 字节,就是 600KB。读完一个柱面,读下一个柱面之前,需要寻道。现代硬盘的寻道时间是依赖于转速的。比如 7200 转的硬盘,每秒 120 转,那么等待一个扇区转到磁头底下至多需要 8.333 毫秒。假定平均下来寻道时间在 10 毫秒。如果是连续读取的情况,一秒可以寻道 100 次,那么就能读取 600KB * 100 = 60MB 数据。可见其连续读取速度还是相当快的。

但是如果遇到随机读呢?前面说了,一个簇是 4KB,如果随机读取很多簇,最坏情况下就是一秒读 100 个,这样是多少?400KB。和前面的 60MB 比起来实在相差太远了。不过,你可能会有疑问,实际情况中随机读的次数多不多?很难说。往往随机读不是用于读多个文件,而是用于从虚拟内存的交换文件中读取虚拟内存页面(虚拟内存的页大小也是 4KB)。在什么情况下需要作这种读取呢?在内存不够用的时候。比如应用程序占用了 700MB 内存,系统本身又要占用 450MB,而物理内存只有 1GB,此时必然会有一部分使用频率较低的页面被操作系统换出到交换文件。下一次,如果应用程序或系统需要在内存中操作这些页面时,就需要从交换文件中读出来了。这样就产生了前面所说的随机读了。

ReadyBoost 的功用正是把这些随机读从闪存 U 盘执行,从而利用 U 盘随机读是硬盘 10 倍的特点,提高系统性能。如何做到这一点呢?ReadyBoost 需要在 U 盘上分配一定量的空间作为缓存。当内存空间紧张时,某些数据会被换出内存,这包括交换文件以及内存中为磁盘设置的高速缓存。此时,ReadyBoost 会检查 U 盘上缓存中的可用空间,腾出空间来写入这些被换出内存的数据盘。此后,如果正巧需要读入这些数据,那么就可以从 U 盘作读取。

其中有几个技术问题需要注意:闪存盘的写入速度很慢,远不如它的读取速度;能否提高闪存盘上缓存的利用率;读取时,只读那些随机读的数据,而把大块读留给硬盘执行;能否只写入随机写的数据;到底在什么时候写入缓存,写入哪些数据。

ReadyBoost 针对上面这些问题,提出了一些解决方案:写入速度慢,有随机写,就在内存中分配一个不大的缓冲区,将多次写入并成一块 512KB 的数据然后再写入。当然,这样一来地址的映射工作就得在内存中做(理论上也可以再使用一层缓写操作写入到 U 盘),因为这 512KB 中的数据是分段的。读取时,如果遇到明显的大块读指令(可能来自应用程序,可能来自磁盘缓存的自动连续预读),那就留给硬盘,否则就从 U 盘读取。作为缓存必然在一定时间以后要把长远不用的数据删掉,由于有分段的数据,这个操作具体是怎样做的还是不清楚,可能是把一个块中要保留的数据读到缓冲区,把它和新的要写入的数据一并写入到原来的块中。写入哪些数据呢?根据 Mark Russinovich 的解释,ReadyBoost 在每次写入硬盘的时候,把这些数据同时写入 U 盘(当然,硬盘连续写入速度很快,如果 ReadyBoost 的内存缓冲区满了,就会跳过部分数据)。但是,实验表明,ReadyBoost 的作用是加速读取,因此光写入前述数据并不能完全加速读取,更重要的是 Superfetch 会将它预期将来会被读取的数据写入 U 盘,这样性能就能得到明显的提高。为了提高 ReadyBoost 对空间的利用率,它还应用压缩算法把数据压缩起来,而通常可以达到 2:1 的压缩率,因此 2GB 的 ReadyBoost 缓存可以缓存多达 4GB 的数据。

说了那么多理论,该是实战的时候了。打开“计算机”文件夹(以前叫“我的电脑”)。插上你的 U 盘。如果你是首次使用 U 盘的话,你在“计算机”文件夹里面就能看到你的 U 盘了,它看上去是一个像 G: 这样的比较排在后面的盘符,类型为可移动磁盘(叫它“磁盘”是因为叫惯了,实际上是闪存驱动器)。然后右键单击它,在弹出的菜单中选择“属性”,会打开一个属性对话框。对话框有多个标签页,有一个标签页叫 ReadyBoost。切换到 ReadyBoost 标签页,里面能看到“不使用这个设备”和“使用这个设备”两个选项。选择“使用这个设备”。下方有“用于加快系统速度的保留空间”。这个空间的大小的最大值是 U 盘剩余空间和 ReadyBoost 针对 U 盘上所使用的文件系统的限制值当中取较小的那个。要扩展 ReadyBoost 的限制值,在 Windows Vista 上让 U 盘使用 FAT32 文件系统能扩展到 4GB,而在 Windows 7 让 U 盘使用 exFAT 文件系统能扩展到 256GB。一般设置多少为宜呢?要看你的物理内存大小。微软建议一般设为物理内存大小的 1 到 3 倍为宜。

另外,要保证 Superfetch 没有被你关掉。要看它是否被关闭,请打开“控制面板”->“管理工具”->“服务”。然后查看服务名称为 Superfetch 的服务,它的状态是否为“已启动”。如果没有启动的话,双击此服务,在弹出的对话框中,有一个“启动类型”,从它的下拉列表中选择“自动”。然后单击下面的“启动”按钮,会把服务启动。启动时会有一个进度对话框。启动完成后进度对话框消失。此时单击“确定”,保存刚才的设置。然后关闭“服务”管理工具。

启用完毕之后,你可以在“性能监视器”里面看到它的实际效果。打开性能监视器,加上这些指标:ReadyBoost CacheTotal read bytes/sec, MemoryPage Reads/sec, MemoryPage Writes/sec。然后就能看到 ReadyBoost 带来的实质的性能提高了。

留下您的评论