最近这三周时间一直因为工作的需要在研究SPDK移植到RISCV平台上,在编译通过的时候,也顺带把SPDK的代码粗粗过了一遍,顺便做了一点笔记。

SPDK (Storage Performance Development Kit)其实就是在用户空间,采用轮询的方式无锁的NVMe的驱动,提供从用户空间应用程序到SSD的零拷贝。

整体的代码结构框图,大家可以从网上搜搜,有很多的文章讲这部分,笔者这里从代码细节的角度来逐个分析它的一些功能。

  1. SPDK系统的建立,通过如下函数的调用,SPDK主要做了如下几个步骤:
  • 为每个logical-core建立一个对应的reactor的线程,其线程的入口函数为eal_thread_loop()
  • 同时将reactor_run()注册到每cpu的变量lcore_config[].f中
  • 当前线程分别通过pipe发送消息给其他logic-core上运行thread,此时由于其他logic-core上的线程会等待各自pipe上的消息,当前core上发送的pipe消息一旦被对端的线程所受到,则分别注册reactor run函数就可以分别运行在各自的线程中了

2. 以下函数调用栈是整个SPDK架构的关键所在。

  • 在reactor的run函数中是个死循环
  • 它分别运行在各自的logic-core的线程上
  • 每个线程上的reactor可以互相通过ring-buffer进行通信,收到消息的一方,如果监测到有回调函数,则会处理相应的回调函数
  • reactor->threads链表上也链接了多个thread的实例,他是一个个结构体
  • 每个thread实例也管理着多个poller实例的链表,如:active_pollers, paused_pollers, timed_pollers等链表。分别表示一次性的poller,暂停的poller以及定时poller。每个poller也可能有回调函数,通过poller->fn()位置进行回调函数的处理。

整个reactor中链表的拓扑结构如下所示:

3. 对于SPDK中最重要的I/O数据的交互,就是通过每个poller的回调函数层层调用实现的。

先构造一个poller,参看如下的调用stack,截图中可以看到,这个过程注册了多个poller,但我们目前只关心nvme_ctrlr_create()函数所注册的那个poller函数:bdev_nvme_poll_adminq().

此处是进行注册的收发消息的API,可以看到cuse_ns_ioctl()就是真正的收发消息的API。消息其实是通过spdk_ring_enqueue()放入了ring-buffer中的。在后续的poller挂在的函数中对ring-buffer中的消息进行处理。

下面是NVMe协议通过RDMA的I/O传送的调用栈,从一个poller->fn的回调开始,可以看到在poller的处理中,通过从消息队列中取出request的消息,再从收到的消息所包含的回调函数io->fn中,才真正实现通过RDMA的写操作。

这是上面的io->fn()调用:

写操作的处理

读操作的处理

可以通过以上调用栈,看到有三种类型的接口:pcie/rdma/tcp

下面是这三种类型接口的调用栈:

PCIe

RDMA

TCP

原文链接:https://zhuanlan.zhihu.com/p/423779832

SPDK代码结构浅析相关推荐

  1. OpenOCD刷写FLASH代码结构浅析(基于RISCV)

    1.配置文件中对应命令的分析 我们一般在使能OpenOCD的刷写功能的时候,需要在OpenOCD的cfg文件中添加如下两条语句: (1) $_TARGETNAME configure -work-ar ...

  2. 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构

    版权声明:本文为博主原创文章,转载时麻烦注明源文章链接,谢谢合作 https://blog.csdn.net/u013088062/article/details/50353202 1.什么是UML ...

  3. 微服务实战之春云与刀客(三)—— 面向接口调用代码结构实例

    2019独角兽企业重金招聘Python工程师标准>>> 概述 在上一篇中提到了spring cloud 面向接口调用的开发风格,这一篇会举一个简单的但完整的例子来说明整个代码结构. ...

  4. Python外壳:代码结构!(IF WHILE FOR RANGE...)

    #:octothorpe 书中说它是八脚怪物!哈哈! 注释就要在前面加上一个#符号! 在print语句里,恢复正常的符号功能! \连接符号: 这个样子就不会一行输入很多的东西,读起来不舒服!功能也是一 ...

  5. [转]VSTO Office二次开发RibbonX代码结构

    前段时间,碰到对于PPT中控制一些命令的问题,也是很是查找了不少的资料,最后使用的是RibbonX的形式解决的,发现RibbonX也是如此的高效. 文章来自:<细品RibbonX(9):层次分明 ...

  6. 解读eXtremeComponents代码结构--转载

    原文地址:http://blog.csdn.net/lark3/article/details/1937466 大致整理了去年写的东西,罗列如下: ec是一系列提供高级显示的开源JSP定制标签,当前的 ...

  7. storm源码之storm代码结构【译】

    说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...

  8. c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型

    c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型 MySQL 问题 Redis Asio iocp TrinityCore代码 ...

  9. spring cloud云服务架构 - particle云架构代码结构讲解

    上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构,简单的按照几个大的部分去构建代码模块,让我们来回顾一下: 第一部分: 针对于普通服务的基础框架封装(entity ...

最新文章

  1. .NET Core SignalR Redis底板详解(二)
  2. PHP中的Trait方法
  3. Spring Security3源码分析-http标签解析(转)
  4. 【CodeForces - 988C 】Equal Sums (思维,STLmap,STLset,tricks)
  5. RNN-GRU-LSTM变体详解
  6. Web MIDI API W3C
  7. $bzoj1079-SCOI2008$ 着色方案 $dp$
  8. BZOJ1812: [Ioi2005]riv(树形dp)
  9. cognos数据源的配置
  10. python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
  11. 在ROS中使用tensorflow进行人体姿态识别
  12. 做程序界中的死神,继续提升灵力上限
  13. Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化
  14. 解决matplotlib绘制图片时plt.savefig()后图片全黑的问题
  15. vue 浏览器调试 样式如何定位样式_Vue项目骨架屏注入实践和方法总结
  16. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
  17. 2020-02-22
  18. 融合黄金正弦和曲线自适应的多策略麻雀搜索算法
  19. OSChina 周日乱弹 —— 红领巾聚会
  20. 【122期分享】工作计划PPT模板免费下载

热门文章

  1. 通过Waterdrop 进行hdfs导入ck测试踩坑
  2. 恢复照片的免费软件,好用!
  3. cad幕墙下料lisp_幕墙小工具集合:XY
  4. poi导出excel添加数据验证
  5. Bentley Systems 收购 Plaxis 以及为业务提供补充的 SoilVision,将岩土工程整合到基础设施项目的数字化工作流中
  6. 历时八个月的uniapp微信小程序上传手机内部文件
  7. heic图片转换成jpg格式工具
  8. 设置 SSH 保持连接不中断
  9. python pad_图文并茂的Python教程-numpy.pad
  10. 1508-张晨曦总结《2016年-11月-27日》【连续37天总结】