SPDK代码结构浅析

news2025/2/4 3:49:27

最近这三周时间一直因为工作的需要在研究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    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信下单接口获取指数成份股的步骤分享

通达信下单接口获取指数成份股的步骤分享: ContextInfo.get_sector() 接口:https://gitee.com/metatradeapi 用法: ContextInfo.get_sector(sector, realtime) 释义: 获取板块成份股,只支持取指数成份股 参数&…

DOM学习笔记(坚持~~~~)

1.DOM简介 1.1什么是DOM 文档对象模型简称DOM,W3C组织推荐的处理可扩展标记语言的标准编程接口,通过这些DOM接口可以改变网页的内容,结构和样式。 1.2 DOM树 文档:一个页面就是一个文档,DOM中使用document表示 元素&…

Python+Qt身体特征识别人数统计源码窗体程序

程序示例精选 PythonQt身体特征识别人数统计 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对《PPythonQt身体特征识别人数统计》编写代码,功能包括了相片,摄像头身体识别…

Javaweb中的Request(请求)和Response(响应)

目录 一、概念 二、请求(Request) 1.例子简介 2.Request继承体系 3.Request获取请求数据 (1)请求行 (2)请求头 (3)请求体 4.优化请求体参数的获取 5.解决请求参数乱码问…

POSIX Timer

一、特点: 1、使用 POSIX Timer,一个进程可以创建任意多个 Timer。 2、setitmer 计时器时间到达时,可以有多种通知方式,比如信号,或者启动线程。 3、POSIX Timer 则可以使用实时信号。 4、POSIX Timer 是针对有实时要…

leetcode98. 验证二叉搜索树关于递归实现中遇到的global和nonlocal(各种报错分析)

leetcode98. 验证二叉搜索树 题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二…

前端基础(十三)_定位position、定位层级z-index

一、定位position Css的定位机制:普通文档流、浮动、定位 这里主要介绍CSS的定位属性:position: 1、定位原理:允许元素相对于正常位置、或者相对于父元素、浏览器窗口本上的位置 2、元素位置的调整: left|right属性、…

Spring Boot项目使用RabbitMQ队列

Spring Boot项目使用RabbitMQ队列 一、Rabbitmq的安装 RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写,**即需要先安装部署Erlang环境再安装RabbitMQ环境。 erlang的安装在windows中直接点击安装即可。 安装完erlang后设置erlang的环境变量ERLANG…

CSM32RV20 是 32位低功耗MCU芯片 RISC-V RV32IMAC 内核

CSM32RV20 是 32位低功耗MCU芯片 RISC-V RV32IMAC 内核 CSM32RV20 是基于RISC-V RV32IMAC 内核(2.6 CoreMark/MHz)的32位低功耗MCU芯片,最高主频32MHz,最大支持 40KB 嵌入式FlASH、4KB SRAM和512B NVM,集成ADC和UART、…

如何使用FastReport .NET 从 JetBrains Rider 中创建PDF报告?

Fastreport是目前世界上主流的图表控件,具有超高性价比,以更具成本优势的价格,便能提供功能齐全的报表解决方案,连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载(qun&#x…

了解什么是架构基本概念和架构本质

什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础&…

Note that you can also install from a tarball 处理

近期使用 npm publish 发布依赖包时,始终遇到 npm 404 报错,错误信息是 “Note that you can also install from a tarball”,尝试更换网络,更换代理服务器等操作,都无效,npm 报错如下 问题原因&#xff1a…

python通过字典来替代if..else

在应对多策略的场景下,大量使用if...else...不仅提高了后期的维护成本,还降低了运行效率。通过字典做映射就可以更好的优化代码。 比如这样一个模拟场景,根据用户的VIP等级,发放奖励。在大量使用if...else...时就会变成如下状态&…

nodejs篇 内置模块http 常用api

文章目录前提创建一个最基本的http服务器req有哪些值得关注的信息res常用的apihttp.request(options[, callback])server事件监听checkContinuecheckExpectationcloseconnect前提 如果你觉得nodejs官方文档给的api太多,不知道哪些重要,请看下去&#xf…

TensorRT全方位概览笔记

TensorRT (基于8.2.3)1.简介1.export1.1 使用tensorrt API 搭建1.2 使用parser1.3 使用框架内 tensorrt 接口1.4 注意事项2.开发辅助工具2.1 trtexec2.2 Netron2.3 onnx-graphsurgeon2.4 polygraphy2.5 Nsight Systems3. plugin3.1 plugin3.2 使用3.3 类…

就离谱!使用机器学习预测2022世界杯:小组赛挺准,但冠亚季军都错了 ⛵

💡 作者:韩信子ShowMeAI 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41 📘 本文地址:https://www.sho…

C2. Potions (Hard Version)(可以后悔的选取 + 一种新奇的优先队列用法)

Problem - 1526C2 - Codeforces 这是该问题的困难版本。唯一不同的是,在这个版本中,n≤200000。只有当两个版本的问题都解决了,你才能进行黑客攻击。 有n个药水排成一行,最左边是药水1,最右边是药水n。每种药水在喝下…

Eclipse安装和环境的基本配置

Eclipse安装 安装包 链接:https://pan.baidu.com/s/13LXiyGmgdAQ2MYXhim1WMg 提取码:WADS 不会安装的可以参考这篇文章 链接: 安装教程文章 eclipse怎么更改存储位置 1.1 file-> Switch Workspace ->Other 打开后可以看到保存文件的路径也可以…

疫情之下连锁餐饮行业积极求变,集团采购协同管理系统重构企业采购数字化

2019年底至今,新冠肺炎疫情已进入了第三个年头。作为接触性、聚集性行业,国内餐饮业持续承压,经历了一系列的波折。尤其2022年以来,国内多地出现了此起彼伏的疫情,给餐企带来了较大冲击,餐饮行业整体营收收…

【推荐】安全访问服务边缘(SASE)资料汇总合集24篇

Secure Access Service Edge (SASE) 是Gartner推出的一个新的技术理念。SASE将 SD-WAN和网络安全解决方案(FWaaS、CASB、SWG 和ZTNA)融合到统一的云原生服务中。SASE是Gartner最新提出的一个技术理念,SASE用于从分布式云服务交付聚合的企业网…