美文网首页
linux 磁盘IO是怎么工作的

linux 磁盘IO是怎么工作的

作者: 戈羽殇雪 | 来源:发表于2021-11-03 22:49 被阅读0次

    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是怎么工作的

          本文链接:https://www.haomeiwen.com/subject/ggzxpltx.html