在Linux上使用软件RAID和LVM时,采用哪种IO调度程序和预读设置?


28

如果是多层(物理驱动器-> md-> dm-> lvm),调度程序,预读设置和其他磁盘设置如何交互?

假设您有几个磁盘(/ dev / sda-​​/ dev / sdd),这些磁盘是用mdadm创建的软件RAID设备(/ dev / md0)的所有部分。每个设备(包括物理磁盘和/ dev / md0)都有其自己的IO调度程序设置(更改如下)和预读(使用blockdev更改)。当您放入dm(加密)和LVM之类的东西时,您可以使用自己的设置添加更多层。

例如,如果物理设备的预读为128个块,而RAID的预读为64个块,那么当我从/ dev / md0进行读取时是否可以接受?md驱动程序是否尝试读取64块,然后物理设备驱动程序将其转换为读取128块?还是RAID预读“传递”到底层设备,从而导致读取64块?

调度程序也有同样的问题吗?我是否需要担心IO调度程序的多层以及它们如何相互作用,或者/ dev / md0是否有效地覆盖了基础调度程序?

在回答这个问题的尝试中,我挖掘了一些有关调度程序和工具的有趣数据,这些数据可能有助于弄清楚这一点:

Answers:


7

如果您从md0中进行读取,那么将使用md0的预读。如果您是从md0的组成部分sda中读取的,则它将使用sda设置。设备映射器只是将I / O分成多个读写操作来进行RAID,但这都位于发生预读的块缓存层之下。存储堆栈如下所示:

文件系统-使用O_DIRECT打开时绕过缓存

块缓存-预读,写缓存,调度程序

设备映射器-dm,lvm,软件RAID,快照等

SD-磁盘驱动器

SCSI-错误处理,设备路由

硬件驱动程序-scsi卡,FC卡,以太网

请注意,当您这样做

dd if=/dev/sda of=foo

您正在将sda作为文件读取,因此要进行块缓存。要直接进入磁盘,请执行

dd if=/dev/sda of=foo iflag=direct

对于I / O电梯调度程序,这些仅存在于磁盘驱动器(sd)中。/ sys / block / md或/ sys / block / dm下没有队列目录。您只需要经过一次磁盘升降机排序。


2
有一个/sys/block/md0/queue/scheduler在我的系统,但在那里的唯一选择是none
Peter Eisentraut 2015年
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.