首页 > 代码库 > 浅谈inode和block与磁盘性能的初级优化

浅谈inode和block与磁盘性能的初级优化

什么是inode和block?

所谓的inode就是索引节点(index node)的意思,在每一个存储设备被格式化创建文件系统后,所有的文件大致被分为了两部分,分别是inode和block。

其中inode用来存储文件属性信息,其中包括了文件大小,文件的归属者,文件的归属组,权限,类型,修改时间,以及指向文件实体数据(block)的指针。

block中存储的就是文件的实际数据,比如说,照片,视频,音频等等,但是有一点需要注意!就是inode当中不包含文件名!一个文件的文件名,存储在上级目录的block中!


其实inode和block之间的关系就像是一本书一样,inode是一本书的目录,一本书会有很多内容,一个知识点或者一个故事会占很多页,一个block就相当于书中的一页内容。

所以说一般情况下一个inode会对应一个或多个block。


inode和block的大小是可以手动去指定的,并且在不同的操作系统和文件系统下inode和block的大小是不一样的,下面就以centos6为例,如果想查看指定分区的inode大小和block大小可以使用dumpe2fs命令去查看。

例如:

dumpe2fs /dev/sda1 | grep -i "Inode size"

查看inode大小。


dumpe2fs /dev/sda1| grep -i "block size"

查看block大小。


如果,在centos6系统下查看本机磁盘的inode使用情况可以使用df -i 命令去查看。

df命令的-i参数可以查看本机分区中一共生成了多少inode,以及使用了多少inode,还剩余多少inode可用。



简单了解了inode和block后,下面说一个关于block与磁盘I/O性能的基础调优。

磁盘在读取数据的时候,是按照block为单位来读取的。

其实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做一些调整,可以提高磁盘的利用率和读取性能。


inode和block的大小在创建文件系统(格式化分区)时就可以指定了。下面是示例~

mkfs.ext4 -b 4096 -I 1024 /dev/sdb1

(-b参数用来指定这个分区每个block的大小,单位为byte)

(-i 参数用来指定每个inode的大小,单位同样为byte)



最后做几点补充:

一个文件的文件名,存放于上级目录的block中。

多个文件可以占用同一个inode(linux的硬链接就是这个原理)

但是一个block只能属于一个文件。




本文出自 “reBiRTH” 博客,请务必保留此出处http://suhaozhi.blog.51cto.com/7272298/1904590

浅谈inode和block与磁盘性能的初级优化