我一直试图在这个问题上找到一个直截了当的答案,但事实证明它是难以捉摸的。这个问题和它的答案是接近,但并没有真正给我,我想细节。让我们从我认为我所知道的开始。
如果您具有标准块设备并运行,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读取?(每个块设备上一个)。如果是这样,则意味着这些设置在上述情况下会爆炸预读的大小。
然后从弄清楚readahead设置实际上在做什么:
使用什么(等于上面的扇区大小)来确定虚拟设备的实际预读值:
- RAID的条带大小(对于md0)?
- 其他一些部门的规模是否相等?
- 它是可配置的,如何配置?
- FS是否起作用(我主要对ext4和XFS感兴趣)?
- 或者,如果只是将其传递出去,是将顶级设备的RA设置乘以实际块设备的扇区大小吗?
最后,例如,条带大小与RA设置之间是否存在任何优选的关系?在这里我在想,如果条带是要从RAID设备中拉出的最小元素,则理想情况下,您不希望必须要进行2次磁盘访问才能为该最小数据单位提供服务,并且希望使RA足够大以一次访问即可满足请求。