01
简介
在之前的文章《SPDK简述和概览》中我们描述了SPDK应用编程框架的部分内容,基于文中提到的线程模型,SPDK实现了各类子系统、应用服务在调用spdk_app_start方法启动时,除了会按模型初始化线程外,还会对注册的各个子系统进行初始化。
如上图是SPDK支持的子系统以及子系统间的依赖关系,在SPDK框架中bdev也是作为一个子系统存在,用于提供通用的用户态块存储抽象,和内核的通用块层类似,它会屏蔽底层模块(Module)具体的实现,对外提供统一的接口,当然,对底层模块要求也是需要实现对应的API。
02
SPDK BDEV模型
2.1 g_bdev_mgr
如图,SPDK使用了一个全局结构g_bdev_mgr对内部得块设备进行管理,并将其注册到全局设备,服务启动调用方法spdk_bdev_initialize进行bdev子系统初始化时,会对g_bdev_mgr的全局资源进行分配;
bdev_io_pool: spdk_bdev_io结构得全局缓冲池,默认缓存池大小64k,每个线程局部缓存256个,当对bdev进行操作时,SPDK需要将io封装成spdk_bdev_io结构,就会从线程缓冲区或全局缓冲区中获取;
buf_small_pool: 小于8k数据的全局数据缓冲池,当数据大小小于8k时,会从该缓存池中获取buf,默认池大小为8191;
buf_large_pool: 小于64k数据的全局数据缓冲池,当数据大小小于64k时,会从该缓冲池获取buf,默认池大小为1023;
zero_buffer: 使用该缓冲区对设备进行填充补零操作;
bdev_modules: 保存bdev模块的链式结构,如下图,是SPDK目前支持的模块;