调整RAID缓存块大小
缓存块大小是可以读入缓存的最小数据量,例如,在一块磁盘上的一个RAID分配单元可能是32KB,你可能会认为该磁盘的所有I/O单元都是32KB,但如果缓存块大小是4KB,那对该磁盘的最小读或写大小应该是4KB,而不是32KB,它是今天磁盘扇区大小的8倍,如果你的文件系统分配单元很大,你的写入请求也很大,但缓存块大小很小,就可能会降低RAID的性能。
我所见过的大多数RAID控制器都是这样,缓存块越小速度越慢,因为它们没有足够的处理器能力管理所有的块,也许等下一代控制器上市会改变这一现状(因为处理性能将会提升)。只有在RAID分配单元中数据处于非对齐状态时,缓存块小一点更好。
想象一下以小的请求写,大的请求读,文件系统分配单元和条带大小匹配时会是什么状况,发生多个连续写操作时,文件系统不会产生严重的碎片,并且读优先将会起作用,如果读比写更大,读优先也有帮助,所有RAID控制器会认为读是连续的,因此在调整读操作时,你需要知道读和写请求大小,并确定同一时间有多少文件写入,如果同一时间只有一个文件写入,数据将很可能是连续分配的,直到文件系统产生碎片,读优先将会带来很大的好处。
另一方面,如果有多个文件写入,并且写入大小和文件系统分配单元比条带尺寸小,这时读优先的作用就很小,甚至毫无作用。归结起来就是:读优先适用于写和分配单元相等,或者当有多个文件写入时,大于RAID的条带尺寸。
调整缓存镜像
在许多中端RAID产品中,写缓存镜像是一个常见的功能,所有写入内容全部镜像到RAID控制器中,控制器处理I/O请求,将其写入控制器的另一半缓存中,如果数据在条带上是完全对齐的,有些厂商在控制器上使用一些技术绕过缓存写入请求,但在普通环境中是具有写缓存镜像的,每一次写操作都要写入到缓存,在向I/O请求发出确认前再写入到另一个缓存,写缓存镜像因此通常会降低性能,因为写入其它缓存存在延迟,并会占用一定的带宽,每个缓存必须镜像到其它缓存,因此缓存空间利用率会下降一半。
如果厂商提供了读或写缓存调整参数,可以根据负载和可靠性考虑进行微调。我经常听到的一个问题是用户到底应不应该使用写缓存镜像,这要根据你对数据可靠性的需要而定。假设你正在写一个文件,将数据写入一个没有写缓存镜像系统的缓存,如果这个时候整个控制器出现故障(从缓存到磁盘),你的应用程序会被告知写入成功,但数据却没有来得及写入磁盘。虽然这种事故发生的几率非常小,但仍然是可能发生的,我就有幸见过一次。
如果你对同一个文件再执行一个写入操作,你可能会遭遇I/O错误,大多数RAID这个时候会意识到它们不能从缓存写入到磁盘,因此会暴露错误,有的RAID控制器会故障转移到可以工作的一侧,你的操作得以成功完成,但实际上已经有一个文件已经丢失了,但你的应用程序却不知道,如果文件少写入了内容,这可能会引发后续一系列的连锁反应,这也是为什么写缓存镜像默认启用的原因。调整写缓存镜像需要指定为写入操作保留多少缓存空间,写缓存镜像开关应该开启,如果控制器损坏,想要找出损坏的数据或缺少的数据几乎是不可能的。
其实只要掌握一点RAID控制器的常识,调整它就不难了。我们需要记住的是,如果同时有多个文件写入,文件系统分配单元很小时,读优先是没有用的,最糟糕的一个例子就是Windows上的NTFS。如果文件系统分配单元很大,与条带尺寸相当,或大于条带尺寸,读优先将会对性能起到很大的帮助。