如何增加范围树的深度?应该分配多少空间?更准确地说,我只需要深度大于 1。
1 回答
在 ext4 中,一个 inode 默认使用 60 字节来寻址 4 个扩展区(12 字节用于标头 + 4*12 字节用于扩展区)。每个范围最多可以容纳 128MiB 的数据(默认情况下)。如果文件大于 4*128MiB (> 512MiB),则 ext4 正在为此构建一个扩展树。所以你会达到depth = 1。
现在的问题是你什么时候能达到depth=2。我尝试使用 ~700MiB 的文件并检查范围深度为 1。然后我打开由范围索引的 fs 块并分析标题。
0A F3 06 00 54 01 00 00 00 00 00 00 00
它具有 f30A 的典型幻数,接下来的两个字节应指示扩展区的数量。(在这种情况下=6,这是有道理的,因为 700/128 = 6)。接下来的 2 个字节 0154 应该指示最大范围数(根据标头信息),在我的情况下达到 340。
-> 那为什么是 340?如果我们查看 ext4 的实际 fs-block 大小,默认值为 4096 字节。每个索引由 12 个字节组成。340 * 12 = 4080 + 12 用于标头 = 4092,因此它是可以放入此 fs 块的最大范围信息数。
如果我解释正确,您可以在这个 fs 块中保存多达 340 个其他指针/叶/索引。这 340 个中的每一个都指一个范围(最多可容纳 128MiB)-> 所以它涉及:340*128MiB ~ 43,5 GiB
此外,每个 inode 最多可容纳 4 个扩展区。所以我猜这个数字需要乘以 4。
-> so I think your file should be > 4*340*128MiB ~ 174GiB to reach depth=2
我还没有测试过这个假设,但我会尽快尝试。同时,如果有人能证明我错了,我也很高兴。:)