RAID 条带大小对预读设置有何影响?

stb*_*ody 6 linux raid software-raid md block-device

我正在尝试找出要在 RAID10 阵列上设置的正确预读值,我想知道 RAID 条带大小是否应纳入我的考虑因素。

我过去听说过关于此的相互矛盾的信息。我曾经听说您应该始终将预读值设置为 RAID 条带大小的倍数,并且永远不要低于条带大小,因为这是 RAID 控制器尝试一次读取的最小数据量。

然而,其他人告诉我,将预读设置为低于条带大小很好,并且实际上可以增加您可以跨阵列中的设备执行的并行读取量,从而提高性能并减少阵列上的负载。

那么它是哪个?不是条带大小倍数的预读设置是否有意义?

Gre*_*ith 4

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
Run Code Online (Sandbox Code Playgroud)

为什么 md1 上的预读为 256 (128KB),而 md0 上的预读为 768 (384KB)?这是因为 md1 是一个 3 磁盘 RAID0,Linux 增加了预读,因为它知道它没有希望在默认值为 256 的该大小的阵列上实现全速。即使这样实际上也太低了;它需要是 2048 (1024KB) 或更大才能达到小型阵列能够达到的最大速度。

关于低级 RAID 设置(例如条带大小和对齐方式)的大部分知识都只是传说,而非现实。自己在一些预读设置下运行一些基准测试,看看会发生什么,然后您就会知道可以使用的好事实。