os 5 io
ddatsh
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调度层