软件性能测试(连载11)

3. 磁盘和文件

1)文件存储结构[29]

Linux的文件存储结构如图3-29所示。

图3-29 Linux的文件结构

索引节点(inode)是持久化存储到磁盘中的,而目录项(dentry)是由内核维护(目录项缓存)的。

在讨论文件存储结构之前需要了解一下扇区(Sector)和块(block),一个扇区为512B,操作系统读取硬盘的时候,不会一个个扇区地去读取,这样效率非常的低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。每8个扇区为一个块,块的大小为(512B×8=4098B,即4KB)。文件数据都存储在“块”中,必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件的元信息区域就叫做索引节点(inode)。

①inode的内容

inode包含文件的元信息,具体来说有以下内容。

•文件的字节数。

•文件拥有者的User ID。

•文件的Group ID。

•文件的读、写、执行权限。

•文件的时间戳。

时间戳共有三个。

Øctime指inode上一次变动的时间。

Ømtime指文件内容上一次变动的时间。

Øatime指文件上一次打开的时间。

•链接数,即有多少文件名指向当前inode。

•文件数据block的位置。

可以用stat命令,查看某个文件的inode信息。

# stat runserver.bat

File: runserver.bat

Size: 52 Blocks: 8 io Block:4096 regular file

Device: 801h/2049d Inode: 554863 Links: 1

Access: (0777/-rwxrwxrwx) stat runserver.bat

Access: 2019-12-06 01:38:13.895735646 -0800

Modify: 2019-01-30 01:40:25.009354932 -0800

Change: 2019-01-30 01:40:25.021354285 -0800

Birth: –

②inode的大小

由于inode也要消耗硬盘,所以硬盘格式化的时候,操作系统会自动把硬盘分成两个区域:数据区,用于存放文件数据inode区(inode table),用于存放inode信息。

作为一个单独的inode节点,一般是128个字节或者256个字节。inode节点的总数,在格式化的时就给定了,一般是每1KB或每2KB设置一个inode节点。假定2GB的硬盘中,每个inode节点的大小为128个字节,每1KB设置一个inode节点,这样inode table的大小就会达到256MB,占整块硬盘的12.8%。

可以通过df -i命令来查看每个硬盘分区的inode总数和已经使用的数量。

# df -i

Filesystem Inodes IUsed IFree IUse% Mounted on

udev 531381 493 530888 1% /dev

tmpfs 539081 1016 538065 1% /run

/dev/sda1 1310720 364285 946435 28% /

tmpfs 539081 1 539080 1% /dev/shm

tmpfs 539081 5 539076 1% /run/lock

tmpfs 539081 18 539063 1% /sys/fs/cgroup

/dev/loop0 354 354 0 100% /snap/gnome-logs/81

/dev/loop1 25385 25385 0 100% /snap/gtk-common-themes/1198

还可以利用df来查看某个Filesystem磁盘详细情况。

# df /dev/sda1

Filesystem 1K-blocks Used Available Use%Mounted on

udev 373728 124 373604 1% /dev

使用-h参数更便于阅读。

# df -h /dev/sda1

Filesystem Size Used Avail Use% Mounted on

udev 365M 124K 365M 1% /dev

df如果不加-i参数,不会统计inode大小的。有时候剩余空间很充足,但是系统提示磁盘空间不足,可以确定是否索引过大需要占的磁盘空间,需要通过df -i来查看。

③ 目录项

目录项(dentry)是用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。

2)虚拟文件系统 VFS(Virtual File System)

在Windows95、Windows98中使用的是FAT格式的文件系统,到WindowNT以后Window改用NTFS文件格式。在Linux中文件格式就多了,包括。

•基于磁盘的文件系统。Ext4、XFS、OverlayFS等。

•基于内存的文件系统(虚拟文件系统)。不需要任何磁盘分配存储空间,但会占用内存。比如:/proc 、/sys。

•基于网络文件系统。NFS、SMB、iSCSI 等。

为了兼容以上各种不同的文件格式,Linux提出虚拟文件系统 VFS的概念,Viritual Filesystem给用户空间程序提供统一的文件和文件系统访问接口的内核子系统。借助VFS,即使文件系统的类型不同,也可以实现文件系统之间的交互,比如:移动、复制等。VFS所处位置如图3-30所示。

图3-30 Viritual File system所处位置