LVM,设备映射器,软件RAID和块设备的Readahead设置 – 什么赢?

我一直在试图find一个直接的答案,这已被certificate是难以捉摸的。 这个问题和答案很接近,但是并没有给我具体的细节。 让我们从我认为我知道的事情开始。

如果你有一个标准的块设备,你运行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在任何分区--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创build的md0之上有一个设备映射的dm-0 LVM设备,实际上这是四个设备xvdg-j上的RAID0条带。

对于RA,md0和dm-0都具有4096的设置,远高于块设备。 所以,这里有一些问题:

  • RA设置如何传递到虚拟块设备链上?
  • dm-0是否胜过所有,因为这是你实际访问的顶层块设备?
  • lvchange -r会对dm-0设备产生影响,而不会显示在这里?

如果它是如此简单,从您正在使用的虚拟块设备传递的RA设置,是否意味着从dm-0(或md0)的读取将转换为4 x 4096 RA读取? (每个块设备上一个)。 如果是这样,那就意味着这些设置在上面的场景中爆炸了预读的大小。

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

你使用什么,相当于上面的扇区大小来确定虚拟设备的实际readahead值:

  • RAID(对于md0)的条带大小?
  • 其他一些行业规模相当于?
  • 它是可configuration的,以及如何?
  • FS是否起作用(我主要对ext4和XFS感兴趣)?
  • 或者,如果它刚刚传递,是否仅仅是顶级设备的RA设置乘以实际块设备的扇区大小?

最后,条纹大小和RA设置之间会有什么优先关系? 在这里,我想如果条纹是要从RAID设备上拔下来的最小元素,那么理想情况下,您不希望必须有2个磁盘访问来服务该最小单位的数据,并且希望使RA大到足以通过单一访问来满足请求。

RA设置如何传递到虚拟块设备链上?

这取决于。 假设你在Xen domU里面,RA = 256。 / dev / xvda1是/ dev / dm1下可见的dom0上的实际LV。 所以你有RA(domU(/ dev / xvda1))= 256和RA(dom0(/ dev / dm1))= 512。 它会有这样的效果,dom0内核将访问/ dev / dm1与另一个RA比domU的内核。 就那么简单。

如果我们假设/ dev / md0(/ dev / sda1,/ dev / sda2)sittuation,则会发生另一个sittutation。

 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 blockdevices。

 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(它是其一部分)或者devicemapper设备访问,并且每个逻辑卷与另一个将被遵守的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。

你使用什么,相当于上面的扇区大小来确定虚拟设备的实际readahead值:

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

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

同上。

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

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

知道答案很难解释,所以我会这样做的例子。 说为了这个,你有3个块设备,你把你的RA设置为4(4 * 512字节),假设标准扇区。 如果您要使用3个磁盘使用RAID-5scheme,则任何读取甚至会触及独特磁盘上的条带,都会按您最初设置阻挡设备RA的因子来复合RA。 所以,如果你的读取精确地覆盖了所有3个磁盘,那么你的有效RA将是12 * 512字节。 这可以通过不同级别的settin RA(例如MD或LVM)来复合。 作为一个经验法则,如果我的应用程序受益于RA,我将它设置在可能的最高层,所以我不会不必要地将RA复合。 然后,我启动扇区2049上的文件系统,并将每个扇区开始的数字除以8来抵消。我可能对你所要求的方式有所偏差,但这是我的2¢。

这是为了解释。 我用RAID和LVM设置做了一些testing,certificate你是正确的:

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

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