在多层(物理驱动器-> -> dm dm -> lvm)的情况下,调度器、readahead设置和其他磁盘设置是如何交互的?
假设有几个磁盘(/dev/sda - /dev/sdd)都是用mdadm创建的软件RAID设备(/dev/md0)的一部分。每个设备(包括物理磁盘和/dev/md0)都有自己的IO调度程序(变得像这样)和readahead (使用区块开发更改)设置。当你加入像dm (加密)和LVM这样的东西时,你会添加更多的层和它们自己的设置。
例如,如果物理设备先于128个块读取,而RAID的readahead为64个块,那么当我从/dev/md0读取数据时,就会出现这种情况吗?md驱动程序是否尝试读取物理设备驱动程序随后转换为128个块的64块?或者RAID readahead“通过”到底层设备,从而导致64块读取?
同样的问题也适用于调度程序吗?我是否需要担心IO调度器的多个层及其如何交互,或者/dev/md0是否有效地覆盖底层调度程序?
在回答这个问题时,我挖掘了一些有关调度程序和工具的有趣数据,这些数据可能有助于解决这个问题:
发布于 2012-05-12 16:12:46
如果从md0读取,则使用md0的readahead。如果您执行了从sda的读取,这是md0的一个组件,那么它将使用sda设置。设备映射器只是将I/O拆分成多个读和写来执行RAID,但这都在发生readahead的块缓存层下面。存储堆栈看起来如下:
文件系统-当您使用O_DIRECT块缓存打开时绕过缓存- readahead、写缓存、调度器设备-mapper- 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下没有队列目录。你只通过磁盘电梯排序一次。
https://serverfault.com/questions/385841
复制相似问题