文章目录
疑问1:为什么有了FreelistManager还需要Allocator
问题澄清
1、BlueFS不用FreelistManager管理块设备空间的使用情况,而是将其持久化记录在文件系统的日志文件中
2、BlueStore自己的slow空间(存放data),当写object文件的时候,先通过Allocator分配磁盘存储空间,仅仅在内存中将空间标记为已分配,并封装在写操作的事务中,待后续完成写操作的时候,才会更新FreelistManger的空闲空间,并将对象的磁盘空间信息记录在对象的metadata中。不同的写case(new/cow/overwrite),封装的事务也不同,目的是保证数据的一致性,所以磁盘空间的管理和写操作是密切相关的,不能简单的调用FreelistManager的接口完事。
综上:
Allocator只负责在内存中将空闲空间标记为已分配,最终磁盘空间使用情况的持久化操作,由Allocator的使用者负责,BlueFS将其记录在文件系统的日志中,BlueStore通过FreelistManager将其存储在k/v中,并在对象metadata中记录对象的磁盘空间信息。
目前系统中有StupidAllocator(基于extent)和BitMapAllocator两种实现,最开始用的Stupid,后来换成BitMap,但是最近因为性能问题又将默认的改回Stupid
疑问2:逻辑段和位图区别
1、当管理内存较大时,使用逻辑段可以节省内存空间
例如:位图每个位控制一个4K block,每个逻辑点的地址消耗为(64offset+64length)128位,,所以如果以最小逻辑块管理内存,位图消耗空间是逻辑段的128倍。
但是逻辑段指定地址可以动态设置,当物理内存特别大时,使用逻辑段可以用更小的内存,管理更大的物理空间。
2、位图查找速度快
1G空间需要消耗256kb内存管理,获取空闲地址时可以直接按位取反。