【IT168 专稿】调整RAID控制器并没有象有些厂商吹嘘的那么困难,甚至不需要专业的技术支持就可以搞定。许多参数都与缓存和缓存利用率,以及众所周知的RAID LUN相关,本文不针对具体的RAID控制器优化,但阅读本文一样很有帮助,至少你知道有哪些参数经过调整对I/O性能有益。优化RAID控制器需要考虑的地方包括:LUN创建和RAID级别,缓存调整和配置。
关于RAID级别与性能有关的文章已经很多,这里就不再重复了,主要谈一下RAID的调优,如果你想通过配置RAID优化存储性能,不管是安装在PC服务器上的RAID控制器,还是高端企业级存储阵列,阅读本文之后,你将有清晰的方向。
首先我们来看看RAID控制器的种类,目前我们常见的有以下三种:
1、企业级“Active/Active”:这种控制器允许你从任何主机向任何LUN写入数据,不会造成性能下降,它通常具备很大的镜像缓存(一般会超过32GB),这种控制器支持热插播硬盘,正常运行时间很长,现在与控制器通信一般是走光纤通道(FC)或以太网光纤通道(FCoE)。
2、中端“主动/被动”:这种控制器对于每个LUN来说都有两个侧面,一个主动侧面,它是主要路径,一个被动侧面,用于故障转移,你通常需要在主要和故障转移侧之间分割LUN,平均划分你的系统,缓存可以在控制器上镜像,但这种控制器的弹性没有企业级控制器好。
3、RAID主机卡:这种卡插入到PCIe插槽,通过SAS或SATA数据线连接到硬盘,它没有独立的处理器,而企业级和中端控制器都有,它们支持的硬盘数量也没有前两种控制器多,此外,要想故障转移到另一个控制器也是不可能的,你系统的弹性完全取决于你的PCIe插槽和控制器卡。
RAID缓存调整和配置
可以从三个方面调整RAID缓存:
? 调整缓存,读优先,写在后。
? 调整缓存块大小。
? 调整缓存镜像(对于中端控制器来说特别重要)。
读优先,写在后:你可能会认为这样调整后不会产生实质性效果,但事实证明不是你想象的那样,如果读优先,它会认为数据是连续的,这样可以为数据分配连续的地址空间,RAID控制器不知道文件系统或数据的拓扑结构,它只知道连续块地址。如果你的文件系统分配单元小于RAID条带尺寸,如果同时有多个文件写入,这些文件将会在这些RAID条带上变成碎片。
例如,如果文件系统分配尺寸是64KB,RAID 5 8+1条带大小是512KB,同时有多个文件写入,RAID控制器做得最多的事情就是读取你请求的数据,在这里是64KB,也可能是另一个64KB,如果你连续读,直到读完整个条带,这就是读优先,另一方面,如果你只读一个64KB的块,条带中剩余部分的数据来自其它文件,那么读优先只有害处,只有RAID条带大小和文件系统分配单元相匹配时,实施读优先才会获得很好的性能。
写在后:将块读入缓存以便写入内容,当数据命中缓存时向写入程序发送一个响应,这里的关键是数据在RAID条带上必须是对齐的,如果没有对齐,RAID必须完成“读-修改-写入”(读入条带数据,修改成新数据,再写入条带),这样的后果是开销大,延迟严重,RAID缓存的目的本来就是为了隐藏写入磁盘的延迟,当数据命中缓存时接收确认。调整写在后通常需要针对读优先指定需要分配多少缓存空间,此外还需要指定可读或写的最小缓存块大小。
调整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。如果文件系统分配单元很大,与条带尺寸相当,或大于条带尺寸,读优先将会对性能起到很大的帮助。