LVM,设备映射器,软件突袭和阻止设备的预读设置-什么是胜利?


26

我一直试图在这个问题上找到一个直截了当的答案,但事实证明它是难以捉摸的。这个问题它的答案是接近,但并没有真正给我,我想细节。让我们从我认为我所知道的开始。

如果您具有标准块设备并运行,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 -rdm-0设备产生影响,并且不在此处显示吗?

如果就这么简单,那么您正在使用的虚拟块设备的RA设置就会传递下去,这是否意味着对dm-0(或md0)的读取将转换为4 x 4096 RA读取?(每个块设备上一个)。如果是这样,则意味着这些设置在上述情况下会爆炸预读的大小。

然后从弄清楚readahead设置实际上在做什么:

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

  • RAID的条带大小(对于md0)?
  • 其他一些部门的规模是否相等?
  • 它是可配置的,如何配置?
  • FS是否起作用(我主要对ext4和XFS感兴趣)?
  • 或者,如果只是将其传递出去,是将顶级设备的RA设置乘以实际块设备的扇区大小吗?

最后,例如,条带大小与RA设置之间是否存在任何优选的关系?在这里我在想,如果条带是要从RAID设备中拉出的最小元素,则理想情况下,您不希望必须要进行2次磁盘访问才能为该最小数据单位提供服务,并且希望使RA足够大以一次访问即可满足请求。


您正在使用什么Linux发行版?您正在使用硬件或软件突袭吗?好像软件。如果是硬件,则将设置您使用的卡/芯片组,并将其存储在设备固件中。
杰森·亨特利

另外,RA设置很大程度上取决于您的文件系统分配方案。您正在使用ext4吗?
杰森·亨特利

我实际上提到的是软件RAID和LVM,是的-软件。在文件系统方面,我会对XFS和ext4之间的区别感兴趣,尽管对任何一个答案都将是不错的
Adam C

可以对XFS进行重大调整以提高性能。这个站点的几个地方都涉及到了:这里这里 ...您正在使用什么发行版的Linux?之所以起作用,是因为还有一些特定于发行版的工具可用。
ewwhite

这不是性能问题,而是更具体的问题-我只想了解RA设置以及它们如何通过LVM /软件RAID层进行转换/与之交互
Adam C

Answers:


11

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

这取决于。假设您在Xen domU内并且RA = 256。您的/ dev / xvda1是在/ dev / dm1下可见的dom0上的实际LV。所以您有RA(domU(/ dev / xvda1))= 256和RA(dom0(/ dev / dm1))= 512。这样做的效果是,dom0内核将使用不同于domU内核的另一个RA访问/ 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

因此,我认为内核通常以实际设置的方式访问blockdevice。一个逻辑卷可以通过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。

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

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

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

同上。

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

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


这与我正在寻找的东西和我所怀疑的非常接近-您能为我清除一件事吗:在/ dev / md0(/ dev / sda1,/ dev / sda2)的情况下,我知道您可以设置单独的RA值,但是如果您说在/ dev / md0上挂载/ data并从中读取文件-512 RA是否用于从/ dev / sda1和/ dev / sda2读取(即,两者均使用512)或每个使用256个?如果是前者,则将RAID0 RA设置为:SUM(RAID0中设备的RA)
Adam

1
从我的经验来看-在/ dev / md0上使用/ dev / sdX磁盘设置RA = 512,其行为与我们使用RA = 512访问/ dev / sdX的行为完全相同,尽管例如,我们可以将RA = 256设置在底部块设备上。在这种情况下,将忽略256设置(请注意,如果/ dev / sda是​​/ dev / md0的一部分,则它不能用作块设备)。我不是内核程序员,但是这似乎合乎逻辑,并且被我的实践所证实。好吧。从/ dev / md0,RA = 512读取的3个线程等于从/ dev / sd {a,b,c}读取的3个线程,且RA = 512。
wojciechz 2012年

万分谢意!我对内容进行了稍微的编辑,以使答案更加清晰。我可以在接受之前再问一件事吗?您是否有使用hdparm测试RA的示例(或链接到该示例)?我本人也会做类似的事情,因此,如果有很好的参考资料,可以节省我的时间。
亚当C

它并不复杂,但是取决于您要检查的内容。请参考hdparm手册。如果要检查磁盘读取(这是readahead的派生),则可以发出类似hdparm -t / dev / md0的命令。结果将显示类似Timing缓冲的磁盘读取:3.02秒中的310 MB = 102.79 MB /秒。最后一个值通常受RA设置的强烈影响。
wojciechz 2012年

1
啊,所以不是直接测量-可以理解,现在接受-感谢您的帮助:)
Adam C

4

知道答案更难解释,因此我将在示例中进行说明。为此,假设您有3个块设备,并假设标准扇区将RA设置为4(4 * 512字节)。如果要说使用了使用3个磁盘的RAID-5方案,那么任何读取甚至触及唯一磁盘上的条带的读取都会使RA与最初将块设备RA设置为的因素相加。因此,如果您的读取恰好覆盖了所有3个磁盘,则您的有效RA将为12 * 512字节。这可以通过各种水平的settin RA(例如MD或LVM)来加重。根据经验,如果我的应用受益于RA,则将其设置在尽可能高的层次上,这样就不必不必要地增加RA的成本。然后,我在扇区2049上启动文件系统,并将每个扇区的偏移量都偏移为8的整数。我可能与您要问的相去甚远,但这是我的2美分。


因此,您说的是,无论顶级设备上的RA设置是什么,它都会被简单地传递出去。因此,如果您分别使用LVM-> 2 x RAID-> 4 x物理磁盘,并且RA等于4,那么由于有8个物理设备,您的有效RA最终为32。在这种情况下,RAID的块/条带大小要有效-我假设您希望RA覆盖整个条带,因此您不必访问两次?
亚当C

顺便说一句,如果我做对了,在我描述的场景中,我想将RAID0的块/条设置为X,其中X = RA * 512bytes。因此,如果我的块/条带为64k(默认为mdadm),那么我应该使用的最小RA为128,因为这样一来,我就能获得整个条带。
亚当·C

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.