在Linux上使用软件RAID和LVM时,哪些IO调度程序和预读设置受到尊重?

在多层(物理驱动器 – > md – > dm – > lvm)的情况下,调度程序,预读设置和其他磁盘设置如何交互?

想象一下,你有几个磁盘(/ 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

解决方法

如果从md0读取,则使用md0的预读.如果您从sd读取了md0的组件,那么它将使用sda设置.设备映射器只是将I / O拆分为多个读取和写入以执行RAID,但这都是在发生预读的块缓存层之下.存储堆栈看起来像:

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下没有队列目录.您只需通过磁盘升降机排序一次.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...