您的位置:首页 > 其它

文件系统那些事-第3篇 影响文件系统性能的关键因素:存储块分配和布局策略

2012-03-04 10:25 309 查看
文件系统的分配和布局策略直接影响到文件系统访问的性能。为此,现代的文件系统都采用各种优化手段。

3.1 块的再分配

为了让设计简单,而且对最差情况下产生的文件系统碎片进行限制,传统的文件系统将磁盘分成大小相等的磁盘块。由于磁盘扇区的大小一般为512,块的大小一般也为512的整数倍字节。在传统的文件系统中,整个磁盘块只能分配给单独的一个文件。但是由于文件大小并不总是文件系统块大小的整数倍,所以这种设计使得最后的那个磁盘块(称为尾部)只被部分利用,这就产生了内部碎片。块的再分配(block suballocation)就是将尾部块再次分块,使得它可以被用来存储其它文件的片段。

一些块的再分配方案能够实现字节级的分配,但是大多数方案只是将磁盘块分成更小的磁盘块(通常分成2的整数次幂个)。

3.2 尾部打包

一些文件系统为了利用上面描述的那些未使用的空间,将若干不同的文件的尾部打包放在单一的共享尾块中。这种方法称为尾部打包(tail packing)。虽然这种方法似乎会明显地增加文件系统的碎片,但是可以通过现代操作系统的预读特性来减轻这个副作用,因为对于小文件,几个存储在不同块的文件尾部可能非常靠近,因而可以同时读入,这样就不会引入额外的寻道时间。这种文件系统一般会使用启发式来决定在给定情形下否是值得进行尾部打包,碎片整理软件也许需要引入更多启发式。

在大部分文件都小于块大小的一半的情形下,例如一文件夹的源代码小文件或者小点阵图,相比于不使用尾部打包的文件系统,使用尾部打包的文件系统能够获得双重的效率。这种情况下,引入尾部打包不仅能够节省磁盘空间,而且由于更好的局部性,需要读取数据的数据更少,页缓存的效率更高。但是,实现复杂度的增加有可能消除了上述优点。

3.3 可变的文件块大小

在支持可变的文件块大小的文件系统中,每个文件都可以有不同的块大小。

3.4 片区

在基于片区(extent)的文件系统,片区是为一个文件所保留的连续的存储空间。当开始写入一个文件时,则为文件分配一整个片区。当再次写入这个文件时,即使是在中间夹杂了其他的写操作,数据仍能存储在紧接在文件上次写入的地方。这种方法消除或减少了文件碎块。

许多文件系统支持片区,包括NTFS、HFS、XFS、Reiser4、Universal Disk Format (UDF)、ext4、HPFS、OpenVMSFiles-11、JFS、BFS、SINTRAN III、 Oracle的Automatic Storage Management和VERITAS文件系统等。

3.5 刷新时分配

刷新时分配 (allocate-on-flush,或者称为延迟分配,delayed allocation) 是一种在HFS+、XFS、Reiser4、ZFS、Btrfs、ext4等文件系统上实现的文件系统特性。在具有延迟分配特性的文件系统中,当磁盘块要分配给待写操作时,从空闲空间计数中减去附加数据的磁盘空间大小,但是实际上并不在空闲空间位图中分配空间。相反,附加数据一直保存在内存中,直到内核由于内存的压力而决定刷新脏缓冲,或者应用程序执行类似Unix的“sync”系统调用,才将空间分配出去。

这种方法可以起到将多个磁盘块分配批量地合并为的大的操作。这种延迟处理降低了CPU的使用率,而且往往减少了磁盘碎片,尤其是对于那些缓慢增长的文件来说。在有多个文件同时增长时,它还能保持磁盘块的连续分配。当和写时复制(copy on write)结合使用时,它能将低速的随机写入转化为快速的连续写入。

3.6 稀疏文件

当分配给一个文件的大多数块实际上都是空的时,就可以使用稀疏文件(sparsefile)来更加高效地使用文件系统空间。实现稀疏文件的方法是向磁盘写入简要信息(元数据)来表示空块,而不是用实际的空的空间来构成空块,从而减少了对磁盘空间的使用。只有在块包含真实(非空)数据时,整个块的大小才作为实际的大小,从而写入磁盘。

当读取稀疏文件时,文件系统在运行时透明地将表示空块的元数据转换成写满零字节的真实块。应用程序不会意识到这种转换。

大多数现代文件系统都支持稀疏文件。稀疏文件一般使用在磁盘镜像、数据库快照、日志文件和科学应用中。

本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: