IO性能篇(一):文件系统是怎么工作的
###磁盘和文件系统
- 磁盘为操作系统提供了最基本的持久化存储
- 文件系统在磁盘的基础上,提供了一个用来管理文件的树状结构
###文件系统
- 文件系统:本身是对存储设备上的文件进行组织管理的机制,组织方式不同,就会形成不同的文件系统
- linux系统一切皆文件,不仅普通的文件和目录,块设备、套接字、管道等,都要通过统一的文件系统来管理
- 为了方便管理,linux文件系统为每一个文件都分配两个数据结构
a. 索引节点 index node
b. 目录项 directory entry
###索引节点 index node
- 索引节点,也叫 inode,用来记录文件的元数据:
a. inode 编号
b. 文件大小
c. 访问权限
d. 修改日期
e. 数据的位置
索引节点和文件一一对应,他和文件内容一样,都会被持久化存储到磁盘中,索引节点同样占用磁盘空间
###目录项 direct entry
目录项,也叫 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系,多个关联的目录项,就构成了文件系统的目录结构。不同于索引节点,目录项是由内核维护的一个内存数据结构,索引通常也被叫做目录项缓存
###文件存储与磁盘格式化
- 磁盘读写的最小单位是扇区,单个扇区只有512B大小
- 文件系统把连续的扇区组成了逻辑块,以逻辑块为最小单元,来管理数据。常见逻辑块大小为4KB,也就是连续的8个扇区组成
- 目录项本身就是一个内存缓存,而索引节点则是存储在磁盘中的数据。在前面的 Buffer 和 Cache 原理中,我曾经提到过,为了协调慢速磁盘与快速 CPU 的性能差异,文件内容会缓存到页缓存 Cache 中
- 磁盘在执行文件系统格式化时,会被分成三个存储区域
a. 超级块 存储整个文件系统的状态
b. 索引节点区 用来存储索引节点
c. 数据块区 用来存储文件数据
###虚拟文件系统 VFS
VFS Virtual File System:索引节点、目录项、逻辑块、超级块构成了linux文件系统的四大基本要素,但是为了支持各种不同的文件系统,linux内核在用户进程和文件系统的中间,引入了抽象层,也就是虚拟文件文件系统VFS
按照存储位置的不同,VFS可以分为三类:
- 基于磁盘文件的文件系统,也就是把数据直接存储在计算机本地挂载的磁盘中。常见的有
a. Ext4
b. XFS
c. OverlayFS - 基于内存的文件系统,这类文件系统不占用磁盘空间,但是会占用内存。常见的有
a. /proc 文件系统
b. /sys 文件系统 - 网络文件系统,用来访问其他计算机数据的文件系统。常见的有
a. NFS
b. SMB
c. iSCSI
这些文件系统,要先挂载到VFS目录树中的某个子目录(也成为挂载点),然后才能访问其中的文件
###文件系统IO
- VFS提供一组标准的文件访问接口,这些接口以系统调用的方式,提供给应用程序使用。
a. open()
b. read()
c. write() - 文件读写方式的差异,导致IO的分类多种多样
a. 缓冲与非缓冲IO
b. 直接与非直接IO
c. 阻塞与非阻塞IO
d. 同步与异步IO
###容量查看
wuyang@master-1:~$ df /dev/sda3
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 19946096 11136844 7770712 59% /
wuyang@master-1:~$ df -h /dev/sda3
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 11G 7.5G 59% /
wuyang@master-1:~$ df -i /dev/sda3
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 1277952 220443 1057509 18% /
wuyang@master-1:~$ df -hiT /dev/sda3
Filesystem Type Inodes IUsed IFree IUse% Mounted on
/dev/sda3 ext4 1.3M 216K 1.1M 18% /
###缓存
#查看/proc/meminfo中的Cache和Slab大小
cat /proc/meminfo | grep -E 'SReclaimable|Cached'#查看索引节点、文件系统索引节点和目录项的缓存情况
cat /proc/slabinfo | grep -E '^#|dentry|inode'#查看占用内存最多的缓存类型 slabtop 按c表示按照缓存大小排序 按a表示按照活跃对象排序
slabtop