想象一下,你有几个磁盘(/ dev / sda – / dev / sdd)是用mdadm创建的软件RAID设备(/ dev / md0)的所有部分.每个设备(包括物理磁盘和/ dev / md0)都有自己的IO调度程序(changed like so)和预读(changed using blockdev)设置.当您投入dm(加密)和LVM之类的东西时,您可以使用自己的设置添加更多图层.
例如,如果物理设备预先读取了128个块,并且RAID具有64个块的预读,那么当我从/ dev / md0读取时,这是否值得尊敬? md驱动程序是否尝试64块读取,然后物理设备驱动程序转换为128块读取?或者RAID预读“传递”到底层设备,导致64块读取?
调度员也有同样的问题吗?我是否必须担心多层IO调度程序以及它们如何交互,或者/ dev / md0是否有效地覆盖了底层调度程序?
在我试图回答这个问题的过程中,我挖掘了一些关于调度程序和工具的有趣数据,这可能有助于解决这个问题:
> Linux Disk Scheduler Benchmarking from Google
> blktrace – generate traces of the i/o traffic on block devices
> Relevant Linux kernel mailing list thread
解决方法
filesystem – bypasses cache when you open with O_DIRECT
block cache – readahead,write cache,scheduler
device-mapper – dm,lvm,software RAID,snapshot,etc.
sd – disk driver
SCSI – error handling,device routing
hardware driver – scsi card,FC card,ethernet
请注意,当你这样做
dd if=/dev/sda of=foo
你正在阅读sda作为文件,所以你正在通过块缓存.要直接进入磁盘,请执行
dd if=/dev/sda of=foo iflag=direct
至于I / O电梯调度程序,那些只存在于磁盘驱动程序(sd)上. / sys / block / md或/ sys / block / dm下没有队列目录.您只需通过磁盘升降机排序一次.