11
3
2014
0

EXT4-特性介绍一

本文为https://ext4.wiki.kernel.org/index.php/Ext4_Howto的翻译。粗略介绍ext4的特性。

 

EXT4 特性:

 

兼容性:

         Ext3文件系统可以以ext4的形式挂载,且不需要改变磁盘的布局格式。但是可以通过在只读模式下运行一些命令让ext3文件系统具备ext4文件系统的一些优势。

 

文件系统、文件更大:

下面是ext3、ext4文件系统总大小和单个文件大小的最大值

Ext3 16Tb  2Tb

Ext4 1Eb   16Tb

若要支持块数目大于2^32个块的文件,文件系统必须具备extents。因为block map只知道32bit的block号。在e2fsprogs1.42.9中,这个功能由mke2fs使能控制。

 

子目录扩展

在Ext3中,单个目录下的文件及其目录数目不超过32000个。EXT4将这个限制增大了倍数

 

Extents

         传统的如ext3,管理一个文件的不同块使用的是block机制,这对于大文件来说是效率很低的,比如大文件的截断、删除操作。Extent就是一系列的连续的block。它的含义是说:数据在接下来连续的n个blocks中,这样就避免了一个一个block的描述。例如:一个100M的文件在传统ext3的方式下需要存放在256000个block中,terrible。现在ext4就可以由几个extents来管理。Extents不仅提高了性能,而且可以改善碎片的情况(extents优先考虑磁盘上连续的布局方式)。

 

多blocks的分配(主要说malloc

         当ext3需要将数据写入磁盘时,块分配器会决定分配那个空闲块给要写入的数据。当时ext3的块分配器一次性只会分配一个块,也就是说如果一个100M的文件要写入磁盘,那么快分配器要调用25600次。这不仅十分低效,更可怕的是,由于分配器无法知道一共要分配多少个块,而只是机械的一个个块的分配,所以说无法从磁盘的角度实现磁盘优化分配利用。EXT4使用multiblock allocator(malloc),这个功能能实现调用一次而分配多个块,从而减小了开销。这提高了性能。尤其是在结合extents和delay allocation策略。这个特性不会影响磁盘的格式特性。此外,ext4的block、inode分配器有其他的优化。

 

延迟分配

         延迟分配是在XFS,ZFS,btrfs、Reiser 4文件系统中的特性。该策略就是尽可能晚地分配blocks,这点与传统的文件系统(如ext3)相反,ext3的策略是,尽可能早地分配blocks。举一个例子:调用write(),文件系统会立马分配好数据要写如磁盘的地点,即便数据当前在cache中,没有写入磁盘。这种方式有缺陷:比如说,一个进程连续写一个文件,文件缓慢增大,故系统会不断地的给数据分配空间,因为块分配器不知道到底多少够用,所以由于write函数催使而不断分配。而延迟分配机制会延时数据块的分配,在数据从cache被替换出来时,块分配器才会真正分配块写在磁盘中的位置。这样就在预置要分配块的总数的前提下,就能最优化地分配块,使磁盘空间得到最好的利用。延迟分配与前面两种机制结合使用有很好的效果,因为许多文件最终从cache写入磁盘时,会以extents方式,而该方式的blocks是通过malloc,即多blocks分配机制申请得到的。

 

快速的fsck

         Fsck是一个很慢的操作,尤其在第一步:检查文件系统中所有的节点。在ext4中,在每个group的inode 表后会存储一个未使用inode节点的清单(该清单为了保证安全,有校验信息),所以fsck操作不会去检查inodes,fsck的实验结果表明,根据inode使用数目的不同,fsck时间提高了2到20倍。这里不许注意的是,是fsck,而非ext4,建立的未使用inode节点清单。这就意味着必须运行fsck来建立未使用inode节点清单,下一次运行fsck才会变快(需要运行fsck完成ext3到ext4的转变)。“flexible block groups (灵活的块分组)”也与加速fsck有关系

 

日志校验和

         日志是磁盘最常用的一部分,所以这一块更容易出现故障。而且一个从损坏日志的恢复行为会导致文件系统的更大损坏。Ext4为日志块的数据做了校验,从而可以知道日志块是否损坏。日志校验还有一个附加好处:它使得ext3这种两阶段的日志提交系统,变成了单阶段提交,在一些情况下加速了文件系统的操作,性能提高了20%,所以可靠性和性能都提升。(注意:提高性能的部分:异步log,在缺省默认状态下是关闭的,在稳定性改善后,之后的版本会支持该功能)

 

“无日志”模式

日志模式虽然提高了文件系统的可靠性,但是存在开销。在ext4中,可以关闭日志模式,性能可以得到一定提升

 

在线碎片整理

(这个功能正在开发,之后的版本会支持该功能)。虽然延迟分配、extents、多块分配能减少碎片,但是碎片仍然会有。举一个例子:在一个目录里写   了三个文件,这三个文件连续的放在磁盘上。某天,你需要对中间的文件追加写,但中间文件空间不够了,这是,中间文件追加部分就只好碎片化地存在磁盘另一个位置了。(作实验)这样会引起一个seek操作,或者需要把中间文件全部内容再连续的存放在一个空间足够的磁盘位置(这样导致了若一个操作需要读取该目录下三个文件,就需要又一次seek操作)。另外,文件系统只关心特定的碎片,比如说boot相关的的需要连续

 

Inode相关特征

更大的inode节点:ext3支持可配置的inode节点大小(通过mkfs的 -I 参数),但是inode大小的缺省值128bytes。Ext4文件系统inode大小的缺省值是256bytes。Inode扩展的空间用于存储一些额外的域,如纳秒级时间戳、inode版本等,剩下的空间用来存储ext4的一些扩展属性。这会使得对这些属性的访问变快,对于一些需要用到拓展属性的应用,访问速度会增大3至7倍。

 

当一个目录创建的时候,inode预留空间会预留几个inode,估计inode会在短时间内被用到,即在目录中创建文件时要用到。这个措施能提高性能,因为在目录中创建新文件时可以直接使用预留的inode。文件的创建、删除都会效率更高

 

纳秒级的时间戳意味着inode中记录“更改时间”的数据可以使用到纳米级别,而在ext3中问秒级别

 

持久预分配

这个特征,在ext4最近的版本中实现,由glibc在不支持它的文件系统中仿真,她允许应用预分配磁盘的空间:应用告诉文件系统预分配空间,文件系统预分配必须的blocks以及相关数据结构,但是在应用真正写数据之前磁盘对应区域是没有数据的。对于P2P应用来说,他们需要有他们自己的“预分配机制”,分配的区域用于长达数小时甚至数天的下载,但是如果文件系统本身提供这个接口,那么预分配机制就会更加有效率。这个机制有几个用途:第一:避免P2P应用类程序自己进行低效的预分配,即用zeros来填充一个文件。第二:改善碎片问题,由于块一次性分配,所以会尽可能连续。第三:保证应用一直有其所需的空间,这点对应RT-ish类的应用很重要,若没有预分配,文件系统可能在操作的一般就使用完毕了(full)。这个特点在libc的posix_fallocage()中实现。

 

缺省状态有Barriers

这是在保证文件系统健全性和提高文件系统性能的权衡(你可以通过mount –o barrier=0,如果你在做benchmarking建议你试试)。LWN的一篇文章所说:文件系统的代码必须保证在写操作提交前,所有事物的信息都被写到了日志中。只是有顺序地进行写操作是不够的。中间层的cache中会有一些驱动器为了提高性能,重新定向IO操作的顺序。所以,文件系统必须在写提交前明确地告诉磁盘拿到所有的日志数据。如果提交请求先写,日志崩溃了,内核的I/O子系统通过barriers使其能恢复正常。Barrier禁止barrie后的写,除非该barrier之前的操作已经提交了。通过barrier,文件系统可以确保磁盘上的结构保持一致性。

 

 

转化ext3文件系统到ext4形式

 

可以将ext3的文件系统mount为ext4的形式,使用ext4的文件系统驱动。这样文件系统就可以使用延时分配,多块分配等。

 

下面指令从ext2文件系统转化为ext3文件系统(支持日志了)

tune2fs –j /dev/DEV

 

下面指令使ext3文件系统支持ext4文件系统特征

tune2fs –O extents,uninit_bg,dir_index /dev/DEV

注意的是,该指令一旦运行,文件系统就不能再被mount为ext3的文件系统了

 

运行上述指令后,必须运行fsck来修整一下磁盘上的结构

e2fsck –Fdc0 /dev/DEV

 

注意:

运行fsck可能会提示“一个或者多个组描述校验无效”,这个现象时可预见的,这也是为什么tune2fs需要fsck。

通过extents的特性,之后的新文件会以extents形式存在,但是老的文件不会变成extents形式。

如果将跟文件系统转化成ext4形式,你徐璈安装一些ext4可以运行的GRUB版本,启动项可能一开始可以启动,但是内核升级后,就可能不能启动了(按Alt+F+F来检查文件系统)

不建议使用e2fsprogs中的resize2fs来改变inode的大小

如果你在tunefs中去掉omit,你可以跳过fsck步骤。

Category: 未分类 | Tags: | Read Count: 2071

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com