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打开操作(如表一所示)。

  1. Rados_cluster object (数据结构:rados_t)的创建。

  2. Rados_cluster object的配置和连接。可以采用rados_conf_set 函数来进行相应的配置,或者使用rados_conf_read_file读取相应的配置文件,然后调用rados_connect 进行连接。

  3. Rados cluster context的(数据结构:rados_ioctx_t)创建。调用rados_ioctx_create 函数。根据rados cluster object 以及rbd pool的名字。

  4. 打开一个RBD image 文件(打开的image的handler数据结构: rbd_image_t)。调用函数rbd_open, 需要使用rados_ioctx_t 这个对象以及rbd image 的名字。

表1 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所示)。

  1. Rbd 文件的关闭(rbd_image_t) 。调用 rbd_close函数。

  2. Rados context 的销毁(rados_ioctx_t) 。调用 rados_ioctx_destroy函数。

  3. Rados cluster 的销毁 (rados_t) 。调用rados_shutdown函数。

表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[3]。那么对于每打开一个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的网关服务给前端应用提供块设备存储。此外对SPDK RBD bdev的使用或者性能有问题的客户,可以在SPDK的mailing list,Slack或者SPDK github[4]的相关页面联系我们,以进行相关的讨论。

原文链接:https://mp.weixin.qq.com/s/3qhpLX5eCXwzc5UEgnYmhA

学习更多dpdk视频
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 上课地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 君羊909332607备注(XMG) 获取

管中窥豹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. win7系统控制面板下的打开或关闭windows功能需要打开哪些功能
  2. 为什么比尔盖茨,马斯克、霍金都提醒你:要警惕人工智能?(上)
  3. 简单粗暴的入门机器学习
  4. 国产木乃伊走进CTO编辑部
  5. 设计干货素材模板|常见的UI设计手法
  6. 12月第一周.COM增9.5万 .ASIA和.XXX现负增长
  7. git学习笔记-(5-树对象)
  8. 重置winsock目录
  9. [读书笔记]编程之美(一)
  10. 从零开始编译LEDE固件 默认中文material主题_php_sir_新浪博客
  11. hualinux 编程概念 3.15:天下武功,唯快不破—新时代敏捷项目管理之道
  12. R语言在逻辑回归中求R square R方
  13. 推荐一个 Github 上最全的C语言教学
  14. 2017,知识与财富
  15. 开源软件库TensorFlow最全教程和项目列表
  16. 随记1 MySQL之特殊字符(表情)的存储以及读取乱码问题
  17. realtek没有禁用前面板_教你win7系统realtek禁用前面板插孔检测的具体步骤
  18. vue判断在安卓app、IOSapp、微信浏览器、安卓浏览器、IOS浏览器、PC浏览器下作不同处理
  19. word在试图打开文件时遇到错误的解决办法
  20. 2013 数字与智能油气田(国际)会议暨展会征文

热门文章

  1. 高冷一字id_一字网名男生高冷霸气
  2. Ubuntu 下查看图片
  3. string.class是什么意思?
  4. 使用Audacity软件分析浊音、清音、爆破音的时域及频域特性。
  5. 2.10 MapReduce文件合并
  6. Ubuntu下配置FreeRadius+L2TP+MySQL,实现限制用户流量和登录人数
  7. User-Agent for Chrome浏览器模拟微信功能
  8. Codeforces-1682B: AND Sorting 【构造、排序、位运算】
  9. 回顾 2021,展望 2022
  10. Codeforces 686D. Kay and Snowflake