Ceph作为一个开源很久的分布式文件系统,至今依然被广泛使用。各种Linux发行版本也都集成了Ceph相关的软件包, 用户可以非常方便地安装、配置以及搭建Ceph集群,从而对外提供各种存储相关的服务。目前在Ceph社区也有很多工作在继续优化Ceph这个开源的解决方案。在这篇文章中, 我们的重点不是介绍怎么优化Ceph,而是介绍SPDK项目中的RBD bdev(RBD块设备模块)。这个模块主要是利用Ceph的librados/librbd的客户端软件库,把Ceph集群的RBD pool中的image file (镜像文件),转化为SPDK定义的块设备。最终这个块设备可以被各类SPDK的target程序使用(诸如SPDK NVMe-oF target, Vhost target, iSCSI target),充当Ceph的存储网关服务,对真正的客户端应用提供块设备服务。

一. SDPK RBD bdev module介绍

SPDK RBD bdev模块属于SPDK的bdev这个系统(SPDK bdev subsystem),需要根据SPDK bdev相关头文件定义的接口实现需要的功能,比如对于块设备READ/WRITE/FLUSH等操作的支持。图1给出了RBD模块的典型使用场景。作为SPDK BDEV模块的一员,它可以被SPDK iSCSI/vhost-scsi/NVMe-oF target使用。另外这个模块负责连接到Ceph集群中,主要依赖于Ceph的librbd/librados软件库。

图 1 SPDK Ceph RBD bdev桥接Ceph和各类SPDK target程序

在SPDK RBD bdev模块中,我们采用了和其他应用程序一样的4个调用步骤来进行一个Ceph的rbd image打开操作(如表一所示)

RBD image的打开

然后把打开的image_t的handler绑定在一个file descriptor上,调用rbd_set_image_notification函数实现。接着对image file的读写,可以采用rbd_aio_read(v)/rbd_aio_write(v)/rbd_aio_flush提交请求, 在SPDK RBD bdev module中采用rbd_poll_io_events来收割请求。

对于RBD image以及cluster的关闭采用以下1-3的操作(如表2所示)。

RBD image的关闭

似乎SPDK RBD bdev模块中的实现和其他应用程序相比没有特别的地方,但这里有两个注意点:

SPDK thread和librados/rbd thread之间的竞争

使用SPDK application framework的应用程序,都需要用CPU的亲和性(CPU Affinity)绑定某几个CPU。但是对于librados/rbd这个库,可能需要创建一些后台的线程,比如在创建Rados的cluster_t或者rados_ioctx_t对象的时候,这就在实际运行过程中造成了SPDK的线程和librados/rbd线程之间的竞争。为了解决这一个问题,我们引入了spdk_call_unaffinitized函数。这个函数的作用主要是:

  1. 首先得到当前SPDK绑定了哪几个CPU核(比如CPU 0到3)
  2. 然后重新调用亲和性绑定函数,设定绑定为除了SPDK绑定的CPU核(比如CPU 0到3)以外的其他CPU核心,然后执行完相应的函数(比如rados_create)。
  3. 再重新调用亲和性绑定函数,恢复原来SPDK APP应用的CPU核心的设置(比如刚才例子中的CPU 0到3)。

这样就可以把librados/rbd相关的函数执行产生的线程放到SPDK thread占据的CPU核以外的CPU核之上,并且不影响原来SPDK应用程序对CPU的设定。当然对于这个问题的发现和解决,我们最初也是收到了使用SPDK RBD bdev module客户的反馈。在最开始的时候, 我们只是隔离了rbd image以及rados_context创建的函数。随着librados库的改进,我们发现对于Rados cluster的创建也要放到另外的线程上。

共享Rados cluster对象, 提高扩展性

从表1我们可以看到,一个RBD image文件的打开,可以分为4个步骤。其中第一步和第二步是rados_t对象的创建。于是客户有Rados cluster共享的需求:

针对同一个Ceph的集群的RBD的使用,一般有两种用法,他们分别是“连接不同的rbd pool中的不同rbd文件”和“连接同一个rbd pool中的不同rbd文件”。我们看到对于使用librados/librbd库的通常的做法都是创建单独的Rados cluster object,例如FIO库中的RBD Engine。那么对于每打开一个RBD image文件,就会增加一个额外的线程(因为我们又打开了一个新的Ceph cluster对象)。如果可以共享cluster,那么就可以减少很多额外的librados/librbd所产生的后台线程,最终就可以增加SPDK RBD bdev模块的可扩展性。减少了额外的线程,可以提高整个系统的利用率。这个是一个非常好的建议,于是我们目前也在改造这个模块。使得可以满足可扩展性的需求。这个共享Rados cluster的特性会在SPDK 21.07甚至以后的版本中出现。

二. SPDK RBD bdev module的主要应用场景

SPDK BDEV RBD module主要应用场景,就是采用SPDK的块设备服务作为Ceph集群的块设备网关服务(Block Gateway Service)。当然用户依然可以采用其他的方式提供类似的服务,比如使用LIO(Linux I/O target),那么所涉及到的RBD客户端的模块,就是KRBD;比如客户也可以使用QEMU+LIBRBD来连接Ceph集群。

使用SPDK BDEV module的解决方案还是有以下的好处,比如:

  • 完善SPDK vhost解决方案从而提高通用性。SPDK vhost应用主要是加速虚拟机中的I/O。如果SPDK vhost可以利用SPDK RBD bdev模块+SPDK NVMe Bdev模块,就可以既使用本地盘以及Ceph集群提供的远端盘。也就是有了这个模块以后,可以使得SPDK vhost的解决方案做到通用,完全替换原来的QEMU+kernel vhost的解决方案。
  • 使得基于SPDK的智能网卡可以卸载Ceph相关的客户端请求。有了这个模块以后,我们可以把在主机上采用librados/librbd连接Ceph cluster的服务,完全卸载到智能网卡中,这个毫无疑问卸载了主机上对Ceph服务的CPU资源消耗。

三. 总结和后续

这篇文章主要介绍了SPDK中的RBD bdev module的实现细节以及使用场景。对于采用Ceph集群的存储服务商或者用户,我们可以采用SPDK的vhost/iSCSI/NVMe-oF target作为中间件服务。得益于SPDK RBD bdev模块,这些SPDK服务可作为Ceph的网关服务给前端应用提供块设备存储。

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

原文链接:https://blog.csdn.net/weixin_37097605/article/details/117490227

管中窥豹SPDK RBD bdev模块相关推荐

  1. SPDK RBD bdev性能调优

    前言    在前文[1]中,我们简述了SPDK中RBD bdev模块以及所依赖的librbd接口的调用方法.本文就SPDK RBD bdev结合Ceph RBD的使用进行更为深入的探讨,并结合实际的应 ...

  2. SPDK Delay Bdev 介绍及应用实例

    温馨提示 ✦ 由于英文函数名较长,为了获得更佳的阅读体验,建议在手机横屏或电脑网页阅读~ ✦ ✦ 一.背景介绍 2019年3月,SPDK社区首次实现了Delay Bdev,如这个Bdev的名称,主要用 ...

  3. SPDK: Block Device Layer Programming Guide 块设备层编程指南

    文章目录 前言 Target Audience 目标受众 Introduction 简介 Basic Primitives 基本原语 Initializing The Library Library初 ...

  4. 【SPDK文件系统-Blob FS】

    文章目录 前言 一.Blobstore设计框架 二.Cache机制 三.Blob FS I/O操作 1. spdk_file_read 2. spdk_file_write 四.SPDK FUSE ( ...

  5. 增加内核的ceph模块的日志打印

    本文主要是在梳理cephfs内核方式挂载的内核代码逻辑所做的准备 环境:Centos 7.5 内核源码版本:3.10.0-862.el7.x86_64 打开ceph模块的debug信息 单独编译cep ...

  6. 什么是SPDK,以及什么场景需要它

    什么是SPDK,以及什么场景需要它 1. 前言 2. 什么是spdk 3. spdk的设计理念 3. 使用spdk加速NVMe存储 4. spdk bdev 5. spdk应用场景 6. 总结 7. ...

  7. linux提升nvme性能,基于SPDK的NVMe SSD性能评估指南

    原标题:基于SPDK的NVMe SSD性能评估指南 一 通过fio工具测试磁盘性能 SPDK采用异步I/O(Asynchronous I/O)加轮询(Polling)的工作模式,通常与Kernel的异 ...

  8. SPDK+NVMe SSD对接Virtio支撑红包场景性能

    原文链接:http://mp.weixin.qq.com/s/nP62NpX0NAo4BZhpkAWaQg 本文转载自云栖社区,原文标题<红包场景下,高性能本地存储技术将硬件性能发挥到极致> ...

  9. ceph(2)--Ceph RBD 接口和工具

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  10. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

最新文章

  1. 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、深度学习、语法分析、文本处理...
  2. 关于亿级账户数据迁移,你应该试试这种方法...
  3. echarts 设置仪表盘数字的位置_一个 ECharts 做的猜数小游戏
  4. int和Integer区别
  5. 关闭windows窗口时操作
  6. 浅谈format格式化输出
  7. .c/.cpp文件形成.exe文件的过程
  8. html中表格的页眉页脚,有一个标准的页眉页脚布局HTML网页,而无需使用table标签...
  9. 深入浅出计算机组成原理学习笔记:总线-计算机内部的高速公路(第42讲)
  10. springboot 注解动态赋值_java springboot动态给注解属性参数赋值
  11. python爬虫怎么下载图片到手机_Python爬虫获取图片并下载保存至本地
  12. 128位计算机 ps2,64位就是最强电脑?难道就没有128位的电脑吗
  13. [ZJOI2015]幻想乡 Wi-Fi 搭建计划(dp + 结论)
  14. 外设驱动库开发笔记0:EPD总体设计
  15. C语言 实现登录注册功能
  16. C++实现MD5加密
  17. 大数据架构师指南 pdf_ZTE十年大数据架构师教你:高效搭建企业IT系统架构,超越CTO...
  18. PHP学习总结(10)——PHP入门篇之自定义网站根目录
  19. 关于VS输出[ INFO:0] global C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\....
  20. elasticsearch-carrot2插件打包

热门文章

  1. 云锁和悬镜服务器哪个好,安全狗、悬镜、云锁、云帮手建议用哪个比较好?
  2. 生鲜行业数字化采购管理系统:助力生鲜企业解决采购难题,全程线上化采购执行
  3. CentOS7安装字体库 (java环境使用)
  4. 怎么样才算是精通 C++?
  5. 通过内容关键词查找文件
  6. DeepinXP Lite 完美精简版 |5.2|5.3|5.4|5.5|5.6|5.7|5.8|5.9|5.10||6.1New| 迅雷下载
  7. android nmea 工具,android – 如何从nmea句子信息计算以米为单位的gps准确度
  8. 教你使用GitHub搭建个人网站
  9. lucas–kanade_Lucas–Kanade光流算法学习
  10. 智能和弦生成工具-Plugin Boutique Scaler 2 v2.3.1 WiN-MAC