我正在尝试找出在 RAID10 阵列上设置的正确的预读值,并且想知道 RAID 条带大小是否应该被纳入我的考虑范围。
我过去曾听到过关于此问题的相互矛盾的信息。我曾听说您应该始终将预读值设置为 RAID 条带大小的倍数,并且永远不要低于条带大小,因为这是 RAID 控制器一次尝试读取的最小数据量。
然而,其他人告诉我,将预读设置为低于条带大小是可以的,并且实际上可以增加在阵列中的设备之间进行的并行读取量,从而提高性能并减少阵列上的负载。
那么到底是哪一个呢?不是条带大小倍数的预读设置是否有意义?
答案1
Linux 应用预读的逻辑很复杂。从 2.6.23 开始,有一个非常花哨的按需预读,在此之前它使用了一种不太复杂的预测机制。预读的设计目标始终包括不进行预读,除非您有一个读访问模式来证明这样做的合理性。因此,认为条带大小是此处相关数据的想法从根本上说是不合理的。位于文件 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 设置(如条带大小和对齐)的很多传说都只是传说,不是现实。自己在一些预读设置下运行一些基准测试,看看会发生什么,然后你就会知道可以使用的有用事实。