LVM、设备映射器、软件 Raid 和块设备的预读设置 - 哪个更好?

LVM、设备映射器、软件 Raid 和块设备的预读设置 - 哪个更好?

我一直在试图找到这个问题的直接答案,但结果却难以捉摸。这问题它的答案很接近,但并没有真正提供我想要的细节。让我们从我认为我知道的内容开始。

如果您有一个标准块设备并且运行,sudo blockdev --report您将得到如下结果:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0    500107862016   /dev/sda
rw   256   512  4096       2048    399999238144   /dev/sda1
rw   256   512  1024  781252606            1024   /dev/sda2

现在,您决定在任意分区上将默认值 256 更改为 128 --setra,并且它会发生在整个块设备上,如下所示:

sudo blockdev --setra 128 /dev/sda1
sudo blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   128   512  4096          0    500107862016   /dev/sda
rw   128   512  4096       2048    399999238144   /dev/sda1
rw   128   512  1024  781252606            1024   /dev/sda2

这对我来说完全说得通 - 块级设备是设置所在的位置,而不是分区,因此一切都会改变。此外,RA 设置和设备之间的默认关系对我来说也很有意义,通常是:

RA * sector size (default = 512 bytes)

因此,我上面所做的更改,以及默认扇区大小将使预读从 128k 降至 64k。到目前为止一切顺利。

但是,当我们添加软件 RAID、LVM 和设备映射器时会发生什么?想象一下您的报告如下所示:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0     10737418240   /dev/xvda1
rw   256   512  4096          0    901875499008   /dev/xvdb
rw   256   512  4096          0    108447924224   /dev/xvdj
rw   256   512  4096          0    108447924224   /dev/xvdi
rw   256   512  4096          0    108447924224   /dev/xvdh
rw   256   512  4096          0    108447924224   /dev/xvdg
rw  4096   512  4096          0    433787502592   /dev/md0
rw  4096   512   512          0    429496729600   /dev/dm-0

在这种情况下,我们在由 mdadm 创建的 md0 之上有一个设备映射的 dm-0 LVM 设备,它实际上是跨四个设备 xvdg-j 的 RAID0 条带。

md0 和 dm-0 的 RA 设置均为 4096,远高于块设备。因此,这里有一些问题:

  • RA 设置如何在虚拟块设备链中传递?
  • dm-0 是否胜过一切,因为它是您实际访问的顶级块设备?
  • 会对lvchange -rdm-0 设备产生影响并且不会显示在这里吗?

如果很简单,即您正在使用的虚拟块设备的 RA 设置被传递,这是否意味着来自 dm-0(或 md0)的读取将转换为 4 x 4096 个 RA 读取?(每个块设备一个)。如果是这样,那就意味着这些设置会使上述场景中的预读大小激增。

然后弄清楚预读设置实际上在做什么:

您使用什么(相当于上面的扇区大小)来确定虚拟设备的实际预读值:

  • RAID 的条带大小 (对于 md0)?
  • 其他一些扇区大小等同吗?
  • 它是可配置的吗?如何配置?
  • FS 是否发挥了作用(我主要对 ext4 和 XFS 感兴趣)?
  • 或者,如果只是传递,它是否仅仅是顶层设备的 RA 设置乘以真实块设备的扇区大小?

最后,条带大小和 RA 设置之间是否存在任何首选关系(例如)?在这里,我在想,如果条带是从 RAID 设备中拉出的最小元素,那么理想情况下,您不希望有 2 次磁盘访问来为该最小数据单元提供服务,并且希望使 RA 足够大,以便通过一次访问即可满足请求。

答案1

RA 设置如何在虚拟块设备链中传递?

视情况而定。假设您在 Xen domU 内,并且 RA=256。您的 /dev/xvda1 是 dom0 上的实际 LV,在 /dev/dm1 下可见。因此,您有 RA(domU(/dev/xvda1)) = 256 和 RA(dom0(/dev/dm1)) = 512 。这将产生这样的效果,即 dom0 内核将使用另一个 RA 而不是 domU 的内核来访问 /dev/dm1。就这么简单。

如果我们假设 /dev/md0(/dev/sda1,/dev/sda2) 情况,将会出现另一种情况。

blockdev --report | grep sda
rw   **512**   512  4096          0   1500301910016   /dev/sda
rw   **512**   512  4096       2048      1072693248   /dev/sda1
rw   **512**   512  4096    2097152   1499227750400   /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw   **256**   512  4096          0   1500301910016   /dev/sda
rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2

设置 /dev/md0 RA 不会影响 /dev/sdX 块设备。

rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2
rw   **512**   512  4096          0      1072627712   /dev/md0

因此,我认为内核通常以实际设置的方式访问块设备。一个逻辑卷可以通过 RAID(它是其中的一部分)或设备映射器设备进行访问,每个逻辑卷都有另一个将被遵守的 RA。

所以答案是 - RA 设置在我看来不会传递到块设备链中,但无论顶级设备 RA 设置是什么,都将用于访问组成设备

dm-0 是否胜过一切,因为它是您实际访问的顶级块设备?

如果您指的是“胜过所有”的深度传播 - 根据我之前的评论,我认为您可能对系统中的不同设备有不同的 RA。

lvchange -r 会对 dm-0 设备产生影响并且不会显示在这里吗?

是的,但这是特殊情况。假设我们有 /dev/dm0,它是 LVM 的 /dev/vg0/blockdevice。如果你这样做:

lvchange -r 512 /dev/vg0/blockdevice

/dev/dm0 也会改变,因为 /dev/dm0 和 /dev/vg0/blockdevice 在内核访问时是完全相同的块设备。

但是我们假设 /dev/vg0/blockdevice 与使用它的 Xen domU 中的 /dev/dm0 和 /dev/xvda1 相同。设置 /dev/xvda1 的 RA 将生效,但 dom0 仍将拥有自己的 RA。

您使用什么(相当于上面的扇区大小)来确定虚拟设备的实际预读值:

我通常通过尝试不同的值并使用 hdparm 进行测试来发现 RA。

RAID 的条带大小 (对于 md0)?

同上。

FS 是否发挥了作用(我主要对 ext4 和 XFS 感兴趣)?

当然 - 这是一个很大的话题。我建议你从这里开始http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

答案2

知道答案很难解释,所以我将举例说明。假设您有 3 个块设备,您将 RA 设置为 4(4*512 字节),假设为标准扇区。如果您说使用 3 个磁盘的 RAID-5 方案,任何读取甚至触及唯一磁盘上的条带都会将 RA 乘以您最初设置块设备 RA 的因子。因此,如果您的读取恰好跨越所有 3 个磁盘,那么您的有效 RA 将是 12*512 字节。这可以通过在各个级别设置 RA 来复合,例如 MD 或 LVM。根据经验,如果我的应用程序受益于 RA,我会将其设置在尽可能高的层上,这样我就不会不必要地复合 RA。然后,我在扇区 2049 上启动文件系统,并将每个扇区的起始偏移量设置为 8 的整除数。我可能与您的要求大相径庭,但这是我的 2¢。

答案3

这就是解释。我用 RAID 和 LVM 设置进行了一些测试来证明你是对的:

https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices

重要的是操作系统正在使用的

相关内容