引用:
原帖由 冬瓜头 于 2008-8-18 18:33 发表 
raid3的实现,只是一个大思想。具体算法具体实现。
至于byte level,感觉不可能有厂家这么干了,因为这样做得不偿失,一般就是按照文件系统块来做,一个块覆盖一个stripe。
当然byte level可能也实际被应用了,来作 ...
嗯,我想,我可以确定的说,RAID3就是byte level的。其实,这个帖子让我去搞明白了一个一直以来忽略的问题,RAID3和RAID4到底有什么区别。一直有一种说法是,在特定条件下,RAID3拥有最佳的读和写性能(当然,在使用相同的硬盘数条件下)。仔细想下RAID3和RAID4/5的具体写的操作,当使用3,5,9块硬盘做RAID3时候,一个byte level strip的大小为2个,4个,8个字节,任何以文件块或者数据库块(一般为512byte的整数倍)的写操作,都是和RAID3的byte level stripe对齐的。也就是说,不需要进行任何类似RAID5或者RAID4的读数据并重新计算校验的操作,控制器只管拼命写就是了。
这样看来,RAID3对于单个IO,的确具有最高的性能,但为什么,现在基本没有使用RAID3的案例了呢?因为,RAID3使用byte level strip有效规避了写操作时需要读取其他盘上数据重新计算校验的问题,但是同时大大降低了读操作的并行性。使用byte level stripe,导致了基本上所有大于一个stripe(几个字节)的读操作都是不可并行的。这个,大家也知道,好像现在没有小于单个文件系统块或数据库块的IO操作了。而且,由于strip size太小了,导致每次读操作读取的数据量也太少,硬盘将太多的时间浪费在seek上。
另外,由于byte level stripe的数据过于分散,如果没有专门的硬件电路,我觉得拆分和组合数据块也要占去不少计算资源。
综合一下,无论RAID3,4,5,写性能最好的时候,是IO位置和stripe对齐,且大小为stripe size整数倍的时候;读并行性最高的时候,是IO于stripe element对齐,且大小不大于一个stripe element大小的时候。(考虑到prefetch,读操作对stripe element size的实际要求可能会更高)
写到这里,突然发现我写这么点文字收获不少,RAID3到RAID5的发展,其实正反映了我们优化存储时候需要解决的问题,怎么样使用RAID和合适的stripe size并结合优化的cache大小和算法,获得一个廉价的,符合应用需要的读写性能。
又1:你所说的 ”一般就是按照文件系统块来做,一个块覆盖一个stripe。“的做法,完完全全是RAID3的思想,和byte level也没有明显区别。任何读操作都不可能并发。就算按照4K大小的文件系统块,在一个5块盘的盘组中,单个硬盘的IO大小也只有1K。当然,写操作上的确也拥有最佳的性能。
又2:更正你一点,RAID3决对不会是RAID2优化后的产物,因为RAID2使用海明码,完全不同于RAID3以后使用的奇偶校验。
最后,作为一个不资深,不熟练的存储从业人员,我最近才开始关注这个论坛。以上文字只是在对RAID3和RAID4做了一些粗浅的研究后的结论。如果有错漏的地方,希望大家指出。
[
本帖最后由 big_mammon 于 2008-8-19 01:58 编辑 ]