Bigalloc¶
目前,块的默认大小是 4KiB,这是大多数支持 MMU 的硬件上普遍支持的页大小。这是幸运的,因为 ext4 代码尚未准备好处理块大小超过页大小的情况。然而,对于主要由大文件组成的 文件系统,希望能够以多个块为单位分配磁盘块,以减少碎片和元数据开销。bigalloc 功能正是提供了这种能力。
bigalloc 功能 (EXT4_FEATURE_RO_COMPAT_BIGALLOC) 将 ext4 更改为使用集群分配,使得 ext4 块分配位图中的每个位都寻址 2 的幂次个块。例如,如果文件系统主要存储 4-32 兆字节范围的大文件,那么将集群大小设置为 1 兆字节可能是有意义的。这意味着块分配位图中的每个位现在寻址 256 个 4k 块。这将一个 2T 文件系统的块分配位图总大小从 64 兆字节缩小到 256 千字节。这也意味着一个块组寻址 32 千兆字节而不是 128 兆字节,同样减少了文件系统元数据的开销。
管理员可以在 mkfs 时设置块集群大小(存储在超级块中的 s_log_cluster_size 字段);此后,块位图跟踪集群而不是单个块。这意味着块组可以达到数千兆字节的大小(而不仅仅是 128MiB);然而,最小分配单位变成了集群,而不是块,即使是对于目录也是如此。淘宝有一个补丁集,用于将“使用集群单位而非块单位”扩展到范围树,尽管不清楚这些补丁去了哪里——它们最终演变为“extent tree v2”,但截至 2015 年 5 月,该代码尚未落地。