我试图找出设置在RAID10arrays上的正确的预读值,而且我想知道RAID条带大小是否应该纳入考虑范围。
过去我听到有关这个信息的矛盾。 我曾经听说您应该始终将您的预读值设置为RAID条带大小的倍数,并且从不低于条带大小,因为这是RAID控制器一次尝试读取的最小数据量。
然而,有人告诉我,在条带大小下面设置预读是可以的,事实上,可以增加arrays中设备间并行读取的数量,从而提高性能并降低arrays上的负载。
那是哪个呢? 预读设置不是条带大小的倍数是否有意义?
Linux应用预读的逻辑很复杂。 从2.6.23开始,有一个非常花哨的按需预读 ,在此之前,它使用了一个不那么复杂的预测机制。 预读的devise目标总是包括不进行预读,除非你有一个读取访问模式,certificate它是正确的。 所以这里的条带大小是一个相关的数据的想法是根本不合理的。 在文件I / O范围的那一端,在条带大小之下的单个读取通常不会触发预读逻辑并且将其应用于它们。 预读的微小值有效地closures了该function。 而你不想要的。
当你真正对一个大的RAID10arrays进行顺序I / O时,要达到许多系统的全部吞吐量,唯一的办法就是预读工作。 否则,Linux不会快速调度请求,以保持arrays读数的最大潜力。 最近几次,我testing了更大的RAID10磁盘arrays,在24磁盘arrays范围内,大的预读设置(> = 4096 = 2048KB)在连续I / O上获得了50%至100%的性能提升,由dd或bonnie ++。 试试看, 运行bonnie ++,增加预读,看看会发生什么。 如果你有一个大的arrays,这将迅速消除这样的想法,即预读数字小于典型的条纹大小是有意义的。
Linux内核非常了解这种必要性,甚至在创build某些types的数组时,它甚至会自动增加预读。 从具有2.6.32内核的系统中检查这个例子:
[root@toy ~]# blockdev --report RO RA SSZ BSZ StartSec Size Device rw 256 512 4096 0 905712320512 /dev/md1 rw 768 512 512 0 900026204160 /dev/md0
为什么在md1上读取256(128KB),而在md0上是768(384KB)? 这是因为md1是一个3磁盘的RAID0,Linux增加了预读,因为它没有希望在默认值为256的情况下实现全部速度。 需要2048(1024KB)以上才能达到小阵的最大速度。
关于低级RAID设置(如条纹大小和alignment)的绝大部分知识就是:绝杀,而不是现实。 在自己的一些预读设置中运行一些基准,看看会发生什么,然后你会知道可以使用的好事实。