我正在尝试找出在RAID10阵列上设置的正确预读值,我想知道RAID条带大小是否应该考虑到我的考虑因素.
我过去听过有关此事的相互矛盾的信息.我曾经听说你应该总是将你的预读值设置为RAID条带大小的倍数,并且永远不要低于条带大小,因为这是RAID控制器一次尝试读取的最小数据量.
然而,有人告诉我,设置低于条带大小的预读是可以的,事实上,可以增加你可以在阵列中的设备之间进行的并行读取量,从而提高性能并降低阵列的负载.
那是哪个呢?不是条带大小倍数的预读设置是否有意义?
解决方法
Linux应用预读时的逻辑很复杂.从2.6.23开始,真的很花哨
On-Demand Readahead,之前它使用了一个不那么复杂的预测机制.预读的设计目标始终包括不进行预读,除非您具有合理的读取访问模式.因此,条带大小是相关数据的想法在根本上是不合理的.在条带大小以下的文件I / O范围的那一端的单个读取通常不会触发预读逻辑并且无论如何都将它应用于它们.预读的微小值有效地关闭了该功能.你不希望这样.
当您真正对大型RAID10阵列执行顺序I / O时,达到许多系统的完整吞吐量的唯一方法是为您提供预读.否则Linux将不会足够快地发送请求以保持阵列读数的全部潜力.最近几次我测试了更大的RAID10驱动器磁盘阵列,在24磁盘阵列范围内,大的预读设置(> = 4096 = 2048KB)使顺序I / O的性能提升了50%到100%,用dd或bonnie测量.亲自尝试一下;运行bonnie,增加预读,看看会发生什么.如果你有一个大阵列,这将很快消除这样的想法,即小于典型条带大小的预读数字是有意义的.
Linux内核非常清楚这种必要性,它甚至会在您创建某些类型的数组时自动增加预读.从具有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设置(如条带大小和对齐)的大部分知识就是:绝杀,而不是现实.在自己的几个预读设置中运行一些基准测试,看看会发生什么,然后你就会知道好的事实.