为什么ext4卷中的这些文件会碎片化?


19

ext4在(磁性)硬盘驱动器上有一个900GB的分区,没有缺陷,也没有坏扇区。除空lost+found目录外,该分区完全为空。该分区是使用默认参数格式化的,除了将保留的文件系统块的数量设置为1%。

我使用下载了〜900MB文件xubuntu-15.04-desktop-amd64.iso到分区的安装点目录wget。下载完成后,我发现文件分为四个片段:

filefrag -v /media/emma/red/xubuntu-15.04-desktop-amd64.iso
Filesystem type is: ef53
File size of /media/emma/red/xubuntu-15.04-desktop-amd64.iso is 1009778688 (246528 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:
   3:    96256..  126975:     133120..    163839:  30720:            
   4:   126976..  159743:     165888..    198655:  32768:     163840:
   5:   159744..  190463:     198656..    229375:  30720:            
   6:   190464..  223231:     231424..    264191:  32768:     229376:
   7:   223232..  246527:     264192..    287487:  23296:             eof
/media/emma/red/xubuntu-15.04-desktop-amd64.iso: 4 extents found

考虑到这可能会以wget某种方式释放出来,我从分区中删除了ISO文件,使其再次为空,然后使用将〜700MB文件复制v1.mp4到了分区cp。该文件也被碎片化了。它分为三个片段:

filefrag -v /media/emma/red/v1.mp4
Filesystem type is: ef53
File size of /media/emma/red/v1.mp4 is 737904458 (180153 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:
   3:    96256..  126975:     133120..    163839:  30720:            
   4:   126976..  159743:     165888..    198655:  32768:     163840:
   5:   159744..  180152:     198656..    219064:  20409:             eof
/media/emma/red/v1.mp4: 3 extents found

为什么会这样呢?有办法防止它发生吗?我以为ext4可以抵抗碎片。取而代之的是,我发现当卷的其余所有部分都未使用时,它会立即将单个文件分割成碎片。这似乎比FAT32和都糟NTFS


4
我试图想象在什么情况下这可能很重要,而我却空虚了。
格雷格·休吉尔

4
@GregHewgill:这很重要,因为我认为这是异常的。现在我知道这很正常,没关系。
EmmaV 2015年

Answers:


17

在900MB文件3点或4的片段很不错的。当该大小的文件具有超过100个以上的碎片时,碎片就会成为问题。fat或ntfs将这样的文件分成几百个并不少见。

通常,至少在较旧的ext4文件系统上,您不会看到比这更好的效果,因为块组的最大大小为128 MB,因此,每128 MB的连续空间会被几个块(用于分配位图和inode表)破坏。下一个块组。ext4的最新功能flex_bg允许将大量(通常为16个)块组的这些表打包在一起,从而保留更长的可分配块运行时间,但是取决于您的发行版以及使用什么版本的e2fsprogs对其进行格式化,此选项可能尚未使用。

您可以tune2fs -l用来检查格式化文件系统时启用的功能。


很有意思。我假设所有inode表等都在卷的开头。
EmmaV

1
@EmmaV他们分布在磁盘,比较接近,他们指的是数据,结果在较短的寻求和更快的磁盘访问:)
霍布斯

10

我无法真正回答,但我认为这可能会有所帮助:

请注意,每个片段的大小最多为32768个块(2的幂),这将引发一个标志,表明正在发生某些事情,并且还为您提供了寻找内容的提示。

同样值得注意的是,范围之间的物理偏移非常接近。

来自:Ext4磁盘布局

ext4文件系统分为一系列块组。为了减少由于碎片导致的性能困难,块分配器会尽力将每个文件的块保留在同一组中,从而减少查找时间。块组的大小在中指定sb.s_blocks_per_group blocks,尽管也可以计算为8 * block_size_in_bytes。默认块大小为4KiB,每个组将包含32,768个块,长度为128MiB

再往下走:

ext4用来对抗碎片的第一个工具是多块分配器。首次创建文件时,块分配器将磁盘空间的8KiB推测性地分配给文件。ext4使用的第二个相关技巧是延迟分配。在这种方案下,当文件需要更多块来吸收文件写入时,文件系统将推迟确定磁盘上的确切位置,直到所有脏缓冲区都写出到磁盘上为止。通过在绝对必要之前不提交特定的位置(达到提交超时或调用sync()或内核耗尽内存),希望文件系统可以做出更好的位置决策。

因此,我想说分配器只关心块组(那些32K块)中的数据局部性,而不关心块组彼此相邻。


您给的第一句话回答了我的问题。
EmmaV

1
每个程度具有最大的32K块,因为这是在一定程度上描述符可覆盖的最大长度。范围不是碎片。如果您发现多个扩展区的物理块紧随先前扩展区的物理块,则不要构成一个碎片(6个扩展区对3个碎片)。
psusi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.