文件系统和磁盘IO性能优化

引言

磁盘为系统提供了最基本的持久化存储.
文件系统在磁盘基础上,使用树状结构管理文件.

索引节点和目录项

文件系统,本身是对存储设备上的文件,进行组织管理的机制. 组织方式不同,形成不同文件系统.
linux中一切皆文件,包括文件和目录,套接字,管道,块设备.

文件系统为每个文件分配两个数据结构:

  • 索引节点(inode)

    a) 记录文件元信息,比如inode编号、文件大小、访问权限、修改日期、数据位置等.
    b) inode和文件一一对应,会被持久化到磁盘中. 因此inode也会占用磁盘空间.

  • 目录项(directory entry)

    a) 记录文件名字、索引节点指针、其他目录项的关联关系. 多个关联的目录项,构成了文件系统的目录结构.
    b) 不同于索引节点,目录项是由内核维护的一个内存数据结构,通常被叫做目录项缓存.

索引节点是每个文件唯一标识,目录项维护文件系统的树状结构(文件名存在于目录项中). 目录项和索引节点关系是多对一,一个文件可以有多个别名(比如硬链接就是给文件创建别名,inode一致).

文件数据是怎么存储的呢?

磁盘(机械磁盘)读写的最小单位是扇区,文件系统以逻辑块基本单元管理数据 连续8个扇区(4KB)构成一个逻辑块

目录项、索引节点示意图:
在这里插入图片描述
注意点:
a) 索引节点也会缓存到内存,加速文件访问(类似于文件内容缓存到cache)
b) 磁盘在执行文件系统格式化时会划分为3个区域:1. 超级块区:存储整个文件系统的状态;2. 索引节点区 3. 数据块区

虚拟文件系统(VFS)

为了兼容底层不同的文件系统,linux在用户进程和文件系统间引入VFS抽象层.

文件系统需要挂载到VFS目录树的子目录(称为挂载点),才可以访问其中的文件.
在这里插入图片描述
文件系统I/O

VFS提供了一组标准的文件访问接口. 这些接口以系统调用的方式,提供给应用程序使用.

  • I/O分类
  1. 是否使用标准库缓存

    数据流走向:
    非缓冲I/O:数据——内核缓存区——磁盘
    缓冲I/O:数据——流缓存区(位于用户层)——内核缓存区——磁盘 # 减少系统调用次数

    所谓不带缓冲,并不是指内核不提供缓冲,只是单纯的系统调用,不经过库函数处理. 系统内核对文件的读写都会提供一个块缓存(内核高速缓存). 当块缓冲达到一定的量时,才会把数据写入磁盘。因此所谓的不带缓冲的I/O是指进程不提供缓冲功能(但内核还是提供缓冲的).

  2. 是否使用页缓存 都是和文件系统交互

    直接I/O:跳过操作系统页缓存,直接和文件系统交互访问文件.
    非直接I/O:文件读写,先经过系统的页缓存,然后再由内核或额外的系统调用写入磁盘.

  3. 应用程序是否阻塞自身运行 阻塞体现在线程层面,不能执行其他任务

    阻塞I/O:应用程序执行I/O操作,阻塞当前线程,不能执行其他任务.
    非阻I/O:应用程序执行I/O操作,不阻塞当前I/O线程,继续执行其他任务. 通过轮询或事件通知获取调用结果:异步

  4. 应用程序是否等待响应结果 异步体现在是否等待响应结果

    同步I/O:应用程序执行io操作,需要等待整个io结束,才能获得io响应.
    异步I/O:应用程序执行io操作,不用等待io结束,通过轮询或事件通知获取调用结果.

性能观测

  • 查看磁盘空间
    df -h / df -i

  • 缓存

    cache是由页缓存和slab缓存组成.
    内核使用slab管理目录项缓存和索引节点缓存.

    查看:
    总slab大小
    /proc/meminfo

    具体slab大小
    /proc/slabinfo
    在这里插入图片描述
    slabtop查看:slab缓存占用排序
    在这里插入图片描述

思考题

  • find / -name file-name命令会引起系统缓存升高么? 会,引起slab缓存升高,主要是inode和denty缓存升高.
  • 排查思路
    对于磁盘问题,大多数是读写文件引起,可以使用starce查找系统调用;lsof查看进程打开那些文件,定位问题.
    strace -f -p # 跟踪进程内部系统调用关系 -f 避免漏掉线程
    lsof -i pid # 查看进程打开了那些文件 这里需要注意,只能是进程号

------------------------------------------------------------------------------------------

磁盘I/O

  • 磁盘性能指标

    指标说明
    使用率磁盘处理I/O请求的时间百分比.
    饱和度磁盘处理I/O的繁忙程度
    IOPS每秒的I/O请求数
    吞吐量每秒I/O请求大小
    响应时间I/O请求从发出到收到响应的间隔时间
  • 磁盘IO观测

  1. 总体I/O指标观测

    %util:使用率
    r/s + w/s:IOPS
    rkb/s + wkb/s:吞吐量
    r_await + w_await:响应时间
    饱和度要根据响应时间、请求队列大小等来推测

    rrqm/s:每秒合并读次数
    wrqm/s:每秒合并写次数
    avgrq-sz:平均每次I/O操作的数据大小(扇区)
    avgqu-sz:平均I/O队列长度
    await:平均每次设备I/O操作的等待时间(ms)
    svctm:平均每次设备I/O操作的服务时间(ms)
    util:1s中用于I/O操作的时间百分比,即被I/O操作消耗的cpu百分比

    备注:1. 如果%util接近100,说明产生的I/O请求太多,I/O系统已经满负载,该磁盘可能存在瓶颈.
    2.如果svctm接近await,说明I/O几乎没有等待时间.
    3.如果await远大于svctm,说明I/O队列太长,I/O响应太慢.
    4.如果avgqu-sz较大,表示有I/O在等待.

    在这里插入图片描述

  2. 进程I/O指标观测
    在这里插入图片描述
    根据I/O大小对进程排序:iotop
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值