文件系统索引extent 和 bitmap区别

Extent 能有效地减少元数据开销。为了进一步理解这个问题,我们还是看看 ext2 中的反面例子。

ext2/3 以 block 为基本单位,将磁盘划分为多个 block 。为了管理磁盘空间,文件系统需要知道哪些 block 是空闲的。 Ext 使用 bitmap 来达到这个目的。 Bitmap 中的每一个 bit 对应磁盘上的一个 block,当相应 block 被分配后,bitmap 中的相应 bit 被设置为 1 。这是很经典也很清晰的一个设计,但不幸的是当磁盘容量变大时,bitmap 自身所占用的空间也将变大。这就导致了扩展性问题,随着存储设备容量的增加,bitmap 这个元数据所占用的空间也随之增加。而人们希望无论磁盘容量如何增加,元数据不应该随之线形增加,这样的设计才具有可扩展性。

下图比较了 block 和 extent 的区别:采用 extent 的 btrfs 和采用 bitmap 的 ext2/3

采用extent的btrfs和采用bitmap的ext2/3

在 ext2/3 中,10 个 block 需要 10 个 bit 来表示;在 btrfs 中则只需要一个元数据。对于大文件,extent 表现出了更加优异的管理性能。

Extent 是 btrfs 管理磁盘空间的最小单位,由 extent tree 管理。 Btrfs 分配 data 或 metadata 都需要查询 extent tree 以便获得空闲空间的信息。

注:EXT4文件系统也采用了基于extend的文件存储

extent 和 bitmap
extent 的定义为一段连续的空间,这段连续的空间由 offset/bytes 来描述,没有更细分的粒度;bitmap 则通过 bit 来描述一个 ctl->unit 大小的单元,最小的粒度是 unit,对于 bg 来说是 sectorsize 大小。

从一个 extent 中分配空间的时候,entry 的 offset 起始地址后移,bytes 减少,即从 entry 前面分配;extent 表项如果描述的范围临接,则可以合并,比如,对一个大的 extent 经过多次分配、释放后,会出现多个 extent 表项,每个表项只能描述一段连续区域,如果相邻则可以将这些表项合并。

对于 bitmap 的 free space,每次分配的时候,将 offset 开始对应的 bits 清 0(0 表示分配,1 表示空闲);由于 bitmap 有 sectorsize 大小的粒度,所以整个范围内的空闲空间可能是破碎的,即可能有比较大的总空闲空间,但是这些空间并不连续。搜索位图,按照两个 0 bit 之间的空间来看连续空闲空间是否可以满足分配的需求。对于 bitmap 表项来说,bytes 并不表示 offset -> offset + bytes - 1 这部分连续空间空闲,只是说明从 offset 起在位图表示的范围内能够找到总共 bytes 大小的空闲空间。

.bytes 表示当前范围中的空闲空间总大小,为 0 表示已经没有空闲空间了,对应的表项可以释放掉了。

extent/bitmap 空闲空间表项位于同一个 rbtree 中,它们可以有相同的起始地址,解决冲突的方式是将 extent 表项放在 bitmap表项之前:

* bitmap entry and extent entry may share same offset,
* in that case, bitmap entry comes after extent entry.

这样,如果没有特别的要求,会优先从 extent 表项分配空间:

* allocating from an extent is faster than allocating from a bitmap

什么时候使用 bitmap,什么时候使用 extent?

添加空闲空间记录的时候,对于小的空间,倾向于使用 extent;相对较大的空间 >= sectorsize * BITS_PER_BITMAP,则使用 bitmap 来记录。具体可以参考 use_bitmap 和 __btrfs_add_free_space。至于分配,则是两者都会尝试,以找到满足分配要求的空间,优先 extent 表示的空闲空间。至于 block group 中是先创建的 bitmap,还是 extent 表项,这要看 block group 的大小了;有了大小值,可以从 use_bitmap 推断出来。

    sectorsize * BITS_PER_BITMAP >= 512 * 8 * 4096 = 2^24 = 16M

对于 btrfs 来说,当前 sectorsize 为 4096,那么一个 bitmap 可以描述的范围是

2^3 * 2^12 * 2^12 = 2^27 = 128M。

多个 extent/bitmap 表项可以描述更多的空间。

对于 free space inode 来说,按照 crc area 的大小,以及每个页面对应一个 crc 表项来看,最大页面数量为:

    (4096 - sizeof(u64)*2) / sizeof(u32) = (4096 - 16) / 4 = 1024 - 4 = 1020

这样计算,一个 free space 文件的大小限制为 4K * 1020;因为每个表项可以描述不同大小范围的空间,所以 bg 的空间大小取值会有比较大的范围。

它们表示的空间会不会有重叠?
bitmap 和 extent 表项表示的空间应该没有重合:小的空间,直接由 extent 表项来表示;从 bitmap 大空间中分配出来的小空间,后面会添加到 extent 中去,而此时 bitmap 对应的位为 0 表示已分配。另外,如果有重叠区域,则 struct btrfs_free_space_ctl->free_space 这个值就不准确了

另外,从关于 free space cluster 的 commit 中可以看到

    Currently we either want to refill a cluster with
          1) All normal extent entries (those without bitmaps)
          2) A bitmap entry with enough space   

当前,对于一个 cluster 来说,要么有 extent,要么有 bitmap,不可两者共有.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352