inode、block块、superblock和磁盘性能的关系

1、什么是inode和block、superblock?

理解inode,要从文件储存说起。
  文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(即:Sector)。每个扇区储存512字节(相当于0.5KB)。
  操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。“块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
  block是文件存取的最小单位,文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点”。
  block中存储的就是文件的实际数据,比如说,照片,视频,音频等等,但是有一点需要注意!就是inode当中不包含文件名!一个文件的文件名,存储在上级目录的block中!
  
  其实inode和block之间的关系就像是一本书一样,inode是一本书的目录,一本书会有很多内容,一个知识点或者一个故事会占很多页,一个block就相当于书中的一页内容。

superblock:记录此filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关信息等;
  注意:扇区是对硬盘而言,块是对文件系统而言。

2、inode的内容

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

文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件数据block的位置
文件引用数,即有多少文件名指向这个inode
文件的时间戳,共有三个:ctime指inode创建时间,mtime指文件内容上一次修改的时间,atime指文件最后一次访问的时间。

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

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
  每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
  inode和block的大小是可以手动去指定的,并且在不同的操作系统和文件系统下inode和block的大小是不一样的。
  由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。但是可以通过更改inode大小来改变inode数量。

实际案例

情景:
在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
查找原因:
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
解决方案:
删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题。
先将该磁盘数据备份,人工更改inode大小,增加inode数量
磁盘性能

其实block的大小与业务与磁盘的I/O性能有着密不可分的关系。 block并非越大越好或者越小越好,还是要看业务,下面就举两个例子:

如果遇到这种单个文件特别小(小于一个block),而且这种小文件特别多,block设置的太大则对block是一种浪费!这是因为一个文件不管有多小,它都会占用一个inode和一整个block,假如说一个block的大小为4k,磁盘里有一个小文件是1k,那么这个小文件会把4k的一整个block全部占用,剩下的3k就白白浪费掉了。

如果单个文件很大的情况下,block设置的很小,就需要读取多个block,这对磁盘I/O是一种消耗(因为每读取一个block都会消耗磁盘I/O,磁盘每次读取都是以block为单位的)

如果单个文件很大,适当的加大block的大小则会提高磁盘的读取效率,减少了磁盘的I/O。

当block设置的太小,则会影响大文件的读取效率,如果block设置的太小,那么存储一个大文件就需要很多很多block,在读取数据的时候就需要到很多block中去读取内容,刚刚说过,磁盘每次读取内容都是以block为单位的,每读取一个block都会浪费一次磁盘I/O,所以,磁盘读取大文件的效率就回大大降低~

所以,综上所述,在进行磁盘格式化区时根据业务的不同对block做一些调整,可以提高磁盘的利用率和读取性能。

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/105833450