SPDK代码结构浅析
最近这三周时间一直因为工作的需要在研究SPDK移植到RISCV平台上,在编译通过的时候,也顺带把SPDK的代码粗粗过了一遍,顺便做了一点笔记。
SPDK (Storage Performance Development Kit)其实就是在用户空间,采用轮询的方式无锁的NVMe的驱动,提供从用户空间应用程序到SSD的零拷贝。
整体的代码结构框图,大家可以从网上搜搜,有很多的文章讲这部分,笔者这里从代码细节的角度来逐个分析它的一些功能。
- 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代码结构浅析相关推荐
- OpenOCD刷写FLASH代码结构浅析(基于RISCV)
1.配置文件中对应命令的分析 我们一般在使能OpenOCD的刷写功能的时候,需要在OpenOCD的cfg文件中添加如下两条语句: (1) $_TARGETNAME configure -work-ar ...
- 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构
版权声明:本文为博主原创文章,转载时麻烦注明源文章链接,谢谢合作 https://blog.csdn.net/u013088062/article/details/50353202 1.什么是UML ...
- 微服务实战之春云与刀客(三)—— 面向接口调用代码结构实例
2019独角兽企业重金招聘Python工程师标准>>> 概述 在上一篇中提到了spring cloud 面向接口调用的开发风格,这一篇会举一个简单的但完整的例子来说明整个代码结构. ...
- Python外壳:代码结构!(IF WHILE FOR RANGE...)
#:octothorpe 书中说它是八脚怪物!哈哈! 注释就要在前面加上一个#符号! 在print语句里,恢复正常的符号功能! \连接符号: 这个样子就不会一行输入很多的东西,读起来不舒服!功能也是一 ...
- [转]VSTO Office二次开发RibbonX代码结构
前段时间,碰到对于PPT中控制一些命令的问题,也是很是查找了不少的资料,最后使用的是RibbonX的形式解决的,发现RibbonX也是如此的高效. 文章来自:<细品RibbonX(9):层次分明 ...
- 解读eXtremeComponents代码结构--转载
原文地址:http://blog.csdn.net/lark3/article/details/1937466 大致整理了去年写的东西,罗列如下: ec是一系列提供高级显示的开源JSP定制标签,当前的 ...
- storm源码之storm代码结构【译】
说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...
- c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型 MySQL 问题 Redis Asio iocp TrinityCore代码 ...
- spring cloud云服务架构 - particle云架构代码结构讲解
上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构,简单的按照几个大的部分去构建代码模块,让我们来回顾一下: 第一部分: 针对于普通服务的基础框架封装(entity ...
最新文章
- .NET Core SignalR Redis底板详解(二)
- PHP中的Trait方法
- Spring Security3源码分析-http标签解析(转)
- 【CodeForces - 988C 】Equal Sums (思维,STLmap,STLset,tricks)
- RNN-GRU-LSTM变体详解
- Web MIDI API W3C
- $bzoj1079-SCOI2008$ 着色方案 $dp$
- BZOJ1812: [Ioi2005]riv(树形dp)
- cognos数据源的配置
- python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
- 在ROS中使用tensorflow进行人体姿态识别
- 做程序界中的死神,继续提升灵力上限
- Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化
- 解决matplotlib绘制图片时plt.savefig()后图片全黑的问题
- vue 浏览器调试 样式如何定位样式_Vue项目骨架屏注入实践和方法总结
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
- 2020-02-22
- 融合黄金正弦和曲线自适应的多策略麻雀搜索算法
- OSChina 周日乱弹 —— 红领巾聚会
- 【122期分享】工作计划PPT模板免费下载
热门文章
- 通过Waterdrop 进行hdfs导入ck测试踩坑
- 恢复照片的免费软件,好用!
- cad幕墙下料lisp_幕墙小工具集合:XY
- poi导出excel添加数据验证
- Bentley Systems 收购 Plaxis 以及为业务提供补充的 SoilVision,将岩土工程整合到基础设施项目的数字化工作流中
- 历时八个月的uniapp微信小程序上传手机内部文件
- heic图片转换成jpg格式工具
- 设置 SSH 保持连接不中断
- python pad_图文并茂的Python教程-numpy.pad
- 1508-张晨曦总结《2016年-11月-27日》【连续37天总结】