ceph bluestore摒弃了传统的本地文件系统,而直接使用裸磁盘作为OSD的存储介质,因而需要自行管理磁盘空间的分配与回收
概述
一个设计良好的磁盘空间管理器,需要兼顾空间和时间效率;bluestore中提供了空间管理器FreelistManager
来支持空间管理,当前提供了一种基于位图的实现,包含:位图持久化以及内存分配器Allocator
两部分。其中,位图的持久化是指将空间分配(置1)和回收(置0)的位图状态持久化到磁盘中,基于rocksdb实现;内存分配器是磁盘位图的一致性视图,用来加速空间分配的速度,基于不同的内存组织形式,包括:stupid
,bitmap
, avl
,hybrid
四种。
位图持久化
bluestore中,当前基于bitmap来实现磁盘空间的分配管理,并将位图持久化到rocksdb中,如下图:
从下往上看:下层是磁盘,在逻辑上划分为多个固定大小的block(参数为:bdev_block_size, 默认为4KB);上面是空间管理器,最小分配单位为alloc-block(参数为:bluestore_min_alloc_size),需要为block的整数倍,在SSD磁盘上,默认是4KB,在HDD磁盘上,默认是64KB;一个key管理若干个alloc-block,其value记录这些alloc-block的位图状态(参数为:bluestore_freelist_blocks_per_key,默认为128) 。
举个例子,默认情况下:1TB的SSD磁盘, 包含的block数为:1TB/4KB = 256MB个,包含的alloc-block数为:1TB/4KB = 256MB个,包含的rocksdb的key数为:256MB/128 = 2MB个。
至于SSD和HDD采用不同的分配单位,与他们的物理特性有关:HDD由于自身的机械特性原因,在随机IO中性能比较差,所以bluestore会较大的分配块,然后会尝试将多个IO写到相同的块中,以减少随机io,提升性能;而SSD由于特殊的内部结构,随机性能不受类似HDD的机械特性影响,相反为减少写放大,带来空间浪费,应采用较小的块。
bluestore根据请求的<offset, len>以及bluestore_freelist_blocks_per_key,计算需要置位哪些key上的哪些bit,然后通过事务持久化到rocks