linux 磁盘IO是怎么工作的

linux将VFS作为中间层来连接应用程序和文件系统。
对应用程序来说,只需要与VFS的标准文件接口交互,不需要关注文件的具体实现
对文件系统来说,只需要按照VFS的标准,就可以无缝对接各种应用程序

VFS内部通过目录项dentry,索引节点inode、逻辑块以及超级块等数据结构来管理文件
目录项dentry 记录了文件名,以及与其他目录项的关系,这部分数据存在内存缓存中
索引节点inode,记录了文件的元数据
逻辑块,是由8块连续扇区构成的最小读写单元,用来存储文件数据
超级块,用来记录文件系统的整体状态,如索引节点和逻辑块的使用状况
以上三种数据存放在磁盘中

磁盘是可以持久化数据的设备,根据存储介质的不同可以分为机械硬盘HDD和固态磁盘SDD,
无论是HDD还是SDD,顺序IO都比随机IO要快
对HDD来说,因为读数据需要挪动磁头和盘片旋转,随机IO需要更多的磁头寻道和盘片旋转,因此顺序IO更快。
对SDD来说,存在先擦除后写入的限制,随机读写会产生更多的垃圾回收。
HDD的最小读写单位是一个扇区,512字节,但我们通常都是使用8个连续扇区组成一个逻辑块来使用。
SDD的最小读写单位一般是4KB。

根据接口的不同可以分为IDE,SATA ,SAS,SCSI等,不同的接口往往分配不同的设备名,IDE设备会分配hd前缀的设备名,SATA接口设备会分配sd前缀的设备名

在Linux中,磁盘实际上作为块设备来管理的,以块为单位读写数据,支持随机读写。

通用块层 与VFS类似,是介于文件系统和磁盘设备之间,两个功能:
1.向上为文件系统和应用程序提供访问块设备的标准接口
2.通用块层会给文件系统和应用程序发来的IO请求排队,通过重新排序、请求合并等方式提高磁盘的IO效率

IO栈
linux存储系统的IO栈,由上到下三层:文件系统层、通用块层、设备层

image.png

存储系统的IO,通常是系统中最慢的一环,一般会通过各种缓存方式来优化IO效率。

磁盘的性能指标
五个常见指标,使用率、饱和度、IOPS、吞吐率、响应时间。
使用率,磁盘处理IO的时间百分比,>80%意味着磁盘瓶颈
饱和度,磁盘处理IO的繁忙程度,过高的饱和度也意味着磁盘瓶颈,打到100%时,磁盘无法接受新的IO请求。
IOPS,每秒IO请求数
吞吐量,每秒的IO请求大小
响应时间,IO从发出请求到收到响应的时间
在数据库、大量小文件的大量随机读写的应用场景中IOPS更能反映系统的整体性能,而对于多媒体顺序读写比较多的场景中,吞吐量则更能反映系统的整体性能
磁盘的性能读写测试工具使用fio

观测磁盘的性能指标
iostat是最常用的磁盘性能观测工具

[root@ocbot-1 ~]# iostat -d -x 1
Linux 3.10.0-957.12.1.el7.x86_64 (ocbot-1)      11/03/2021      _x86_64_        (8 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.94    0.57    0.94    11.74   190.65   267.95     0.01    9.19    2.14   13.45   0.65   0.10

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00    45.00    0.00  230.00     0.00  3680.00    32.00     1.52    6.62    0.00    6.62   1.13  25.90

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

各指标含义如下图


image.png

其中%util 就是磁盘使用率
r/s+w/s 就是IOPS
rkb/s+wkb/s就是磁盘的吞吐量
r_wait+w_wait 就是磁盘响应时间

进程IO观测
使用pidstat

[root@ocbot-1 ~]# pidstat -d 1
Linux 3.10.0-957.12.1.el7.x86_64 (ocbot-1)      11/03/2021      _x86_64_        (8 CPU)
10:42:46 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command

kB_rd/s 是进程每秒读取的数据大小
kB_wr/s,每秒发出的写请求大小
kB_ccwr/s 每秒取消的写请求大小

然后iotop 是类似于top的工具,可以看到当前io比较大的程序

你可能感兴趣的:(linux 磁盘IO是怎么工作的)