Ada*_*m C 29 linux lvm software-raid md block-device
我一直试图在这个问题上找到一个直接的答案,但事实证明这是难以捉摸的。这个问题和它的答案是接近,但并没有真正给我,我想细节。让我们从我认为我知道的开始。
如果你有一个标准的块设备并且你运行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
Run Code Online (Sandbox Code Playgroud)
现在,您决定使用--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
Run Code Online (Sandbox Code Playgroud)
这对我来说非常有意义 - 块级设备是设置所在的位置,而不是分区,所以它都会发生变化。此外,RA 设置和设备之间的默认关系对我来说很有意义,通常是:
RA * sector size (default = 512 bytes)
Run Code Online (Sandbox Code Playgroud)
因此,我在上面所做的更改,默认扇区大小将从 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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们在 mdadm 创建的 md0 之上有一个设备映射的 dm-0 LVM 设备,它实际上是跨四个设备 xvdg-j 的 RAID0 条带。
md0 和 dm-0 的 RA 设置都是 4096,远高于块设备。所以,这里有一些问题:
lvchange -r对 dm-0 设备产生影响而不会出现在这里?如果它像您使用的虚拟块设备的 RA 设置一样简单,这是否意味着从 dm-0(或 md0)读取将转换为 4 x 4096 RA 读取?(每个块设备上一个)。如果是这样,那将意味着这些设置会扩大上述场景中预读的大小。
然后在弄清楚预读设置实际上在做什么方面:
你用什么,相当于上面的扇区大小来确定虚拟设备的实际预读值:
最后,条带大小和 RA 设置(例如)之间是否存在任何首选关系?在这里,我在想,如果条带是将从 RAID 设备中取出的最小元素,那么理想情况下,您不希望必须有 2 个磁盘访问来为该最小数据单元提供服务,并且希望使 RA大到足以满足一次访问的请求。
woj*_*chz 12
RA 设置如何沿虚拟块设备链传递?
这取决于。假设您在 Xen domU 中,并且 RA=256。您的 /dev/xvda1 是 /dev/dm1 下可见的 dom0 上的实际 LV。所以你有 RA(domU(/dev/xvda1)) = 256 和 RA(dom0(/dev/dm1)) = 512 。它会产生这样的效果,即 dom0 内核将使用另一个 RA 访问 /dev/dm1,而不是 domU 的内核。就那么简单。
如果我们假设 /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
Run Code Online (Sandbox Code Playgroud)
设置 /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
Run Code Online (Sandbox Code Playgroud)
所以在我看来,内核通常以实际设置的方式访问块设备。一个逻辑卷可以通过 RAID(它是它的一部分)或 devicemapper 设备访问,每个逻辑卷都可以通过另一个 RA 访问。
所以答案是 - 恕我直言,RA 设置不会传递到区块设备链,但无论顶级设备 RA 设置是什么,都将用于访问组成设备
dm-0 是否胜过一切,因为那是您实际访问的顶级块设备?
如果您的意思是“胜过一切”的深度传播 - 根据我之前的评论,我认为您可能对系统中的不同设备有不同的 RA。
lvchange -r 是否会对 dm-0 设备产生影响而不显示在此处?
是的,但这是一个特例。让我们假设我们有 /dev/dm0,它是 LVM 的 /dev/vg0/blockdevice。如果你这样做:
lvchange -r 512 /dev/vg0/blockdevice
Run Code Online (Sandbox Code Playgroud)
/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
| 归档时间: |
|
| 查看次数: |
24245 次 |
| 最近记录: |