Linux文件系统

linux中一切皆文件,不仅普通的文件和目录。就连块设备、套接字、管道等都是通过统一的文件系统来管理的
linux文件系统为每个文件都分配了两个数据结构:1.索引节点 2.目录项
它们主要用来记录文件的元信息和目录结构
索引节点简称inode,用来记录文件的元数据。比如 inode 编号、文件大小、访问
权限、修改日期、数据的位置等。索引节点同样会被持久化存储到磁盘中的,所以索引节点同样会占用磁盘空间
目录项用来记录文件的名字,索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。目录项是由内核维护的一个内存数据结构,所以通常叫做目录项缓存。
磁盘读写的最小单元是扇区,而扇区只有512B大小,如果每次都读写这么小的单元,效率一定很低。所以文件系统游把连续的扇区组成了逻辑块,常见的逻辑块4KB。由8个连续的扇区组成。在这里插入图片描述超级块:存储整个文件系统的状态
索引节点区:用来存储索引节点
逻辑块:用来存储文件数据的
为了支持各种的文件系统,Linux内核又在用户进程和文件系统中间加了一层抽象层,叫做虚拟文件系统VFS
在这里插入图片描述
第一类基于磁盘的文件系统,也就是直接把数据写入到计算机本地挂载的磁盘中。
第二类基于内存的文件系统,也就是虚拟文件系统。这类文件系统不需要任何磁盘分配存储空间但会占用内存。
我们经常用到的 /proc 文件系统,其实就是一种最常见的虚拟文件系统。
第三类网络文件系统,也就是用来访问其他计算机数据的文件系统。
这些文件系统要先挂载到VFS目录树中的某个子目录(称为挂载点),才能访问其中的文件。拿第一类,也就是基于磁盘的文件系统为例,在安装系统时,要先挂载一个根目录(/),在根目录下再把其他文件系统(比如其他的磁盘分区、/proc 文件系统、/sys文件系统、NFS 等)挂载进来。

I/O的四种分类
1.缓冲和非缓冲io:指是否用标准库来加速文件的访问
这里的缓冲是指标准库内部实现的缓存,比方说,你可能见到很多程序遇到换行符才输出,而换行前的内容,其实就是被标准库暂时缓存了起来。

2.直接io和非直接io:否利用操作系统的页缓存
直接io:跳过操作系统的页缓存,直接跟文件系统交互来访问文件
非直接io:先经过操作系统的页缓存,然后由内核或者额外的系统调用真正写入磁盘
如果想要指定直接io需要在系统调用中指定 O_DIRECT 标志,如果没有则默认非直接io
裸io:直接跳过文件系统写磁盘
3.阻塞和非阻塞io
4.同步和异步io : linux中read是同步读,而aio_read是异步读。

df -i: 查看索引节点的占用情况

连续i/o:i/o请求刚好连续,不需要磁道寻址。连续io可以通过预读的方式来减小io的请求次数
随机i/o:需要不断移动磁头来定位数据的位置

linux中磁盘实际上是作为一个块设备来管理的,也就是以块为单位来读写数据的,并且支持随机读写。每个块设备都被赋予两个设备号,。主设备号用在驱动程序中,用来区分设备类型;而次设备号则是用来给多个同类设备编号。

通用块层

为了减小不同块设备差异带来的影响,linux通过统一的通用块层,来管理不同的块设备
通用块层其实就是文件系统和磁盘驱动中间的一个块设备抽象层,它有两个功能:
1.向上,为文件系统和应用程序,提供访问块设
备的标准接口;向下,把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来
管理这些设备的驱动程序。
2.通用块层还给文件系统和应用程序发来的io请求排队,并通过重新排序、请求合并等方式,提高磁盘的读写效率。

磁盘性能指标
使用率:是指磁盘处理io的时间百分比。过高的使用率代表磁盘io存在性能瓶颈
饱和度:磁盘处理io的饱和程度
IOPS:每秒的io请求数
吞吐量:每秒io请求的大小
响应时间:io请求发出到响应的时间

在数据库、大量小文件这类随机读写比较多的场景下,IOPS更能反映系统的整体性能;
在多媒体等顺序读写比较多的场景下,吞吐量才能反映系统的整体性能

查看磁盘io的使用情况; iostat -d -x 1
在这里插入图片描述
在这里插入图片描述
观察进程的io情况: pidstat -d 1
iotop:在这里插入图片描述
前两行为磁盘读写大小总数和磁盘真实读写大小总数
由于缓存、缓冲区、io合并等影响,所以这两个值可能不相同

lsof -p pid:查看该进程打开的文件
opensnoop:bcc包下,可以动态跟踪内核中open系统调用
在这里插入图片描述在这里插入图片描述
排查思路:
1.先用iostat发现磁盘io性能瓶颈
2.再借助pidstat定位导致瓶颈的进程
3.随后分析进程的io行为(strace、lsof)
4.最后根据应用程序的原理,分析这些io的来源
在这里插入图片描述

io优化

1.通过fio工具进行基准测试
2.应用程序优化:
1.追加写代替随机写,减少寻址开销,加快io写的速度
2.可以借助缓存io,充分利用系统缓存,降低实际io次数
3.在应用程序内部构建自己的缓存,或者用redis这类外部缓存系统。这样,一方面可以在应用程序内部控制缓存的数据和生命周期。另一方面,也降低了其他应用程序使用缓存会自身的影响。
4.在需要频繁读写同一块磁盘空间时,可以用mmap代替read/write,
5.在需要同步写场景中,尽量将请求合并,而不是让每个请求都写入到磁盘,即可以使用sync()取代O_SYNC
6.在多个应用共享相同的磁盘的时候,为了保证io不被某个应用完全占有,推荐你使用 cgroups 的 I/O 子系统,来限制进程 / 进程组的 IOPS 以及吞吐量。
7.在使用 CFQ 调度器时,可以用 ionice 来调整进程的 I/O 调度优先级,特别是提高核心应用的 I/O 优先级。

3.文件系统优化
1.你可以根据实际负载场景的不同,选择最适合的文件系统
2.在选好文件系统之后,可以进一步优化文件系统的配置选项,包括文件系统的特性(如 ext_attr、dir_index)、日志模式(如 journal、ordered、writeback)、挂载选项(如 noatime)等等。
3.可以优化文件系统的缓存。
4.在不需要持久化时,你可以用内存文件系统tmpfs,以获得更好的io性能。tmpfs把数据保存在内存中,而不是磁盘中。

4.磁盘优化
1.换更好的磁盘
2.使用RAID,把多块磁盘组成一个逻辑磁盘,构成冗余独立磁盘阵列。
3.针对磁盘和应用程序io模式的特征,可以选择最合适的io调度算法。
4.我们可以对应用程序的数据,进行磁盘级别的隔离。例如,我们可以把日志,数据库等io比较重的应用,配置单独的磁盘。
5.在顺序读比较多的场景中,我们可以增大磁盘的预读数据。
6.我们可以优化内核块设备io的选项。比如,可以调整磁盘队列的长度 /sys/block/sdb/queue/nr_requests,适当增大队列长度,可以提升磁盘的吞吐量(当然也会导致 I/O 延迟增大)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值