我一直在试图找到这个问题的直接答案,但结果却难以捉摸。这问题和它的答案很接近,但并没有真正提供我想要的细节。让我们从我认为我知道的内容开始。
如果您有一个标准块设备并且运行,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 -r
dm-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 设置进行了一些测试来证明你是对的:
重要的是操作系统正在使用的