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栈,由上到下三层:文件系统层、通用块层、设备层
存储系统的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
各指标含义如下图
其中%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比较大的程序