os 5 io

发布于
os

Linux I/O体系七层:

  • VFS

适配各种文件系统,对外提供统一API

磁盘:EXT,XFS …

网络:NFS, CIFS …

特殊:/proc,裸设备

  • 磁盘缓存

磁盘数据驻留 RAM

  • Dentry cache
  • Page cache
  • Buffer cache

  • 映射层

确定数据在物理设备上的位置

  • 通用块层

绝大多数I/O操作是跟块设备打交道

下层对接各种不同属性的块设备,对上提供统一的Block IO请求标准

  • I/O调度层

管理块设备的请求队列,有利于减少磁盘寻址时间,提高全局吞吐量

大多数块设备都是磁盘设备

根据设备及应用特点设置不同的调度器

  • 块设备驱动

设备操作接口

  • 物理硬盘

I/O调度器

Linus Elevator

每个设备维护一个查询请求

新请求,能合并就合并

不能合并尝试排序

既不能合并,也没有合适的位置插入,放到请求队列的最后

DeadLine

对Linus Elevator的一种改进,避免有些请求太长时间不能被处理

可以区分读和写操作,分别提供FIFO队列

提高机械硬盘吞吐量为出发点,尽量保证在有I/O请求达到最终期限的时候进行调度,适合业务比较单一并且I/O压力比较重的业务,比如下载,数据库应用等

四个队列分两类,每一类都由读和写两种队列组成

一类队列用来对请求按起始扇区序号进行排序,通过红黑树来组织,称sort_list

另一类对请求按它们的生成时间进行排序,由链表来组织,称fifo_list

CFQ

按I/O请求地址排序,而不是先来后到的顺序来进行响应

以进程为出发点,保证大家尽量公平,分配等量的带宽,适合于桌面多任务及多媒体应用

NOOP

最简单的FIFO队列,所有I/O请求大致按照先来后到的顺序进行操作

最适合于固态硬盘


SSD 经过 I/O 调度层吗?

SSD有多种接口和类型

  • SATA/SAS

  • PCIe

NVMe、SATAe、SCSIe

  • DIMM

SSD为SATA或SAS 接口,使用时,要接在SAS或RAID控制器下。这种情况下,Linux内核看到的仍是SCSI设备,SSD读写时,仍然要经过I/O调度层

非SATA/SAS接口的SSD,都不使用I/O调度层

NVMe SSD 驱动架构,可以看出NVMe SSD I/O路径并不经传统的I/O调度层