我一直试图就此找到一个直接的答案,但事实证明这是难以捉摸的。This question and its answer is close,但并没有真正给我我想要的细节。让我们从我认为我知道的开始。
如果你有一个标准的块设备并且你运行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
现在,您决定将--setra
任何分区上使用的默认值 256 更改为 128,它发生在整个块设备上,如下所示:
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大到足以通过一次访问满足请求。
这取决于。假设您在 Xen domU 中并且 RA=256。您的 /dev/xvda1 是 /dev/dm1 下可见的 dom0 上的实际 LV。所以你有 RA(domU(/dev/xvda1)) = 256 和 RA(dom0(/dev/dm1)) = 512 。它会产生这样的效果,即 dom0 内核将使用另一个 RA 而不是 domU 的内核访问 /dev/dm1。就那么简单。
如果我们假设 /dev/md0(/dev/sda1,/dev/sda2) 情况,则会发生另一种情况。
设置 /dev/md0 RA 不会影响 /dev/sdX 块设备。
所以在我看来,内核通常以实际设置的方式访问块设备。可以通过 RAID(它的一部分)或 devicemapper 设备访问一个逻辑卷,每个逻辑卷都与另一个将受到尊重的 RA 一起访问。
所以答案是 - RA 设置是恕我直言,不会向下传递到块设备链,但是无论顶级设备 RA 设置是什么,都将用于访问组成设备
如果你的意思是“胜过一切”的深度传播——根据我之前的评论,我认为你可能对系统中的不同设备有不同的 RA。
是的,但这是一个特例。假设我们有 /dev/dm0,它是 LVM 的 /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。
同上。
当然 - 这是一个很大的话题。我建议你从这里开始http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php
知道答案更难解释,所以我将在示例中这样做。为此假设您有 3 个块设备,假设标准扇区,您将 RA 设置为 4(4*512 字节)。如果您要说使用 3 个磁盘使用 RAID-5 方案,则任何读取甚至触及唯一磁盘上的条带都会使 RA 与您最初将块设备 RA 设置为的因素相结合。因此,如果您的读取正好跨越所有 3 个磁盘,那么您的有效 RA 将为 12*512 字节。这可以通过不同级别的 RA 设置来混合,例如 MD 或 LVM。根据经验,如果我的应用程序受益于 RA,我会将其设置在可能的最高层,这样我就不会不必要地混合 RA。然后,我在扇区 2049 上启动文件系统,并将每个扇区开始的偏移量设置为可被 8 整除的数字。我可能与您的要求相去甚远,但这是我的 2¢。
那是为了解释。我用 RAID 和 LVM 设置做了一些测试来证明你是对的:
https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices
重要的是操作系统正在使用的那个