Linux性能优化实战 23:文件系统

一、索引节点和目录项

Linux 文件系统为每个文件都分配两个数据结构,索引节点目录项

1. 索引节点:简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。

                      索引节点同样占用磁盘空间。

2. 目录项:记录文件的名字、索引节点指针以及与其他目录项的关联关系。

                   多个关联的目录项,就构成了文件系统的目录结构。

                   由内核维护的一个内存数据结构,也被叫做目录项缓存。

3. 每个文件只有一个索引节点,但可以有多个目录项。(例如硬链接)

4. 索引节点是存储在磁盘中的数据,目录项是一个内存缓存,加速文件的访问。

5. 磁盘在执行格式化时,会被分成三个存储区域,超级块索引节点区数据块区

6. 图示:

Linux性能优化实战 23:文件系统

二、虚拟文件系统

1. 为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,引入了一个抽象层,也就是虚拟文件系统 VFS

2. 示意图:

Linux性能优化实战 23:文件系统

三、文件系统 I/O

1.  VFS 提供了标准的文件访问接口,提供给应用程序使用。

     就cat命令来说,它依次调用了open(),read(),write() 三个接口。 (write把文件内容输出到标准输出中)

2. 文件读写方式 分四类:

(1) 缓冲与非缓冲 I/O:

     标准库内部实现的缓存。程序遇到换行时才真正输出,而换行前的内容被标准库缓存了起来。

(2) 直接与非直接 I/O:

     直接 I/O:跳过操作系统的页缓存,直接跟文件系统交互来访问文件。

     非直接 I/O:先经过系统的页缓存,然后再由内核或额外的系统调用,真正写入磁盘。

(3) 阻塞与非阻塞 I/O:

     阻塞 I/O:应用程序执行 I/O 操作后,如果没有获得响应,就会阻塞当前进程。

     非阻塞 I/O:不会阻塞。随后再通过轮询或者事件通知的形式,获取调用的结果。

     注意:描述的主体是应用程序

(4) 同步与异步 I/O:

     同步 I/O:应用程序执行 I/O 操作后,要一直等到整个 I/O 完成后,才能获得 I/O 响应。(系统给它响应)

     异步 I/O,应用程序执行 I/O 操作后,不用等待整个 I/O 完成,可以继续执行下面的程序。等到这次 I/O 完成后,响应会用事                      件通知的方式,告诉应用程序。(系统给它响应)

     注意:描述的主体是系统

 

四、磁盘容量和索引节点容量

1. 查看磁盘容量  df -h

Linux性能优化实战 23:文件系统

2. 查看索引节点容量  df -i

Linux性能优化实战 23:文件系统

3. 当发现索引节点空间不足,但磁盘空间充足时,很可能就是过多小文件导致的。

    删除这些小文件,或者移动到索引节点充足的其他磁盘中,就可以解决这个问题。

 

原文地址:https://time.geekbang.org/column/140