SPDK线程模型

news2025/7/7 14:15:32

一、reactor线程

与传统的reactor线程模型相比,SPDK的reactor在功能实现上还是有很大区别的,线程不在基于流水线形式进行作业,而是采用Run-To-Complete来做运行处理。

如图所示,每个reactor线程会绑定一个cpu core,线程的主体函数通过reactor_run来封装,运行期间主要做以下处理。

(1) 充当事件轮询器对event无锁队列进行轮询 reactor线程采用RTC方式运行,线程运行期间不能有上下文切换的逻辑发生,线程之间如果想要做使用交互则可通过event无锁队列来做请求中转(相关功能函数可参考spdk_event_allocate、spdk_event_call),每个event事件会传递一个函数指针,reactor线程获取到事件对象后,会对其所指向的功能函数做调用处理。

(2) 轮询每个协程的poller函数 协程的定义决定了reactor的运行行为,我们可以根据自己的需要来编写相关的协程函数,并将其注入到reactor线程模型,去做周期性的轮询处理。需要注意的是,协程函数的编写不能引入额外的锁操作(防止reactor线程出现上下文切换),也不能是处理起来特别耗时的同步动作(阻碍后续操作的执行),需要遵循异步无锁编程原则来对函数的功能做定义实现。

(3) 处理协程间通信 SPDK的协程采用spdk_thread进行封装(可通过spdk_thread_create函数来创建),与reactor线程类似,其内部也有一个无锁队列来负责接收其他协程发送过来的请求,这些队列统一由reactor线程去做轮询处理。(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

二、RDMA集成到reactor

为了实现Server端整体链路run to complete改造,可考虑将RDMA组件也一并集成到reactor线程模型中去,以此来实现请求的异步接受和处理,大体的集成方案如图所示。

首先由Listener线程负责感知客户端的连接请求,并创建与之对应的QP来负责与客户端进行交互,每个QP会绑定一个CQ,完成有关上下文的初始化操作之后,需要触发一个event事件给reactor线程(提交到线程的无锁队列),事件所对应的操作函数主要是注册一个RDMA Poller,来对创建好的CQ进行轮询(借助ibv_poll_cq函数),以便对客户端的request请求进行感知。

接收到请求之后的处理逻辑比较关键,不同于传统的reactor线程模型,请求被接收后会采用独立的handler来对其进行处理,SPDK则全部交由reactor线程内部来完成,从而避免了线程的上下文切换。

因此针对请求的处理不可以是一个特别耗时的同步动作,因为这样便会阻塞后续的请求,从而出现比较大的长尾时延问题。为此可考虑将请求的执行尽量做成异步,比如针对硬盘的访问操作,可借助NVMe用户态驱动来实现IO的异步处理。

这样从请求接收到最后response返回,整个RPC处理链路全部在reactor线程内部完成,中间没有任何上下文切换,也不会有锁同步所带来的overhead开销。

三、内核参数调优

可通过改写/proc/irq/*/smp_affinity文件,来避免中断控制器向某些CPU核(spdk的reactor线程所绑定的core)发送中断,从而使reactor线程的运行不受外界干扰。

还可通过isolcpus系统启动选项将部分CPU核隔离出来,使它们只被reactor线程使用。

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

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

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

相关文章

力扣刷题笔记day7(数组中重复的数字+在排序数组中查找数字+0~n-1中缺失的数字)

文章目录数组中重复的数字题目思路代码在排序数组中查找数据题目思路代码0~n-1中缺失的数字题目思路代码数组中重复的数字 题目 思路 创建一个哈希表,将数组遍历,如果不存在则添加到哈希表中,如果存在则直接返回 代码 var fin…

电磁功率流和坡印廷矢量

回顾: 场源的影响周围的快慢取决于距离和传播速度 场源变化引起电磁波,电磁波传输能量 电磁能量的流动满足能量守恒定律 我们关心的是 体积V里面和体积外怎么交换能量,S是包围的闭合面 大家想一想,体积里面有场源 随着能量的…

Spring 中使用Nacos服务发现

引入依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId><version>${latest.version}</version> </dependency>本文使用的版本为&#xff1a;1.1.1&#xff08;与Spring 中…

微服务(二)——注册中心(Eureka、Nacos)

目录1. 概念2. Eureka1. 服务搭建1. 依赖导入2. 配置文件3. 启动项目2. 服务注册1. 依赖导入2. 配置文件3. 启动多个实例3. 服务发现1. 依赖导入2. 配置文件3. 服务拉取和负载均衡4. 小结3. Ribbon1. 负载均衡流程2. 负载均衡策略3. 加载策略4. Nacos1. 下载安装2. 注册中心1. …

css:隐藏input file标签并触发点击上传文件事件

目录方式一&#xff1a;将input标签覆盖到按钮的最上层方式二&#xff1a;通过label标签触发点击事件方式三&#xff1a;js触发文件上传的点击事件总结通用的按钮样式 /* button样式来自element-ui */ .button {color: #fff;background-color: #409eff;display: inline-block;…

【MQTT】mqtt + go + M5Stack + SSR 远程灯控程序

1. mqtt服务搭建 参考上一篇文章【MQTT】mqtt 服务器部署--go 生产和消费demo_平静不绝望的博客-CSDN博客 2. M5stack 烧录和编程 详细文档&#xff1a;m5-docs mac 需要安装USB驱动 和 m5burner 如下图 3. flow ui 编程 SSR 4. go web远程代码 s.Router.HandleFunc(&…

UE中的FString操作

此篇是指单纯记录&#xff0c;方便之后查阅。 目录 创建 转型到FString FString转型到其他类型 字符串中是否包含指定串 查找给定串在其中是什么位置 字符串比较 读文件 裁剪字符串 编码解决的是文字问题 稍微细致一些的可以看&#xff1a; UE4随笔&#xff1a;FStri…

TI 2640 Quick start

&#xff08;1&#xff09;下载ccs 并且安装 &#xff08;2&#xff09;下载对应版本的SDK&#xff0c;并且安装 SDK对应版本下载可以通过搜索的方式&#xff1a;simplelink_cc2640r2_sdk_5_30_00_03 &#xff08;3&#xff09;导入对应的工程文件 此篇文档可以作为参考&#x…

喜讯丨计讯物联荣获厦门软件园党群服务中心篮球赛亚军

蓄势待发迎“篮”上&#xff0c;齐心协力谱新篇。12月17日&#xff0c;厦门软件园党群服务中心篮球赛完美落幕。计讯物联一路过关斩将&#xff0c;荣获厦门软件园党群服务中心篮球赛亚军。 决胜雅马哈&#xff0c;强势晋级半决赛 随着一声哨响&#xff0c;比赛正式拉开帷幕&…

2个月备考通过系统架构设计师考试,把经验分享给孤军奋战的你

一、前言 本来于2022-08-29报考系统架构设计师&#xff0c;报考完成以后才开始了正式的学习&#xff0c;也就是9月初才开始系统学习&#xff0c;2022-11-05开始考试&#xff0c;中间准备了两个月的时间。 当时公司业务受疫情影响严重&#xff0c;领导叫我考一个证书吧&#xf…

Android制作简易的音乐播放器和视频播放器

文章目录制作简易的音乐播放器和视频播放器播放多媒体文件播放音频MediaPlayer的工作流程项目示例播放视频项目示例制作简易的音乐播放器和视频播放器 播放多媒体文件 Android在播放音频和视频方面做了非常不错的支持,它提供了一套非常完整的API,使得开发者可以轻松编写出一个…

JavaEE入门知识

1.为什么要学习框架&#xff1f; 1. 学习框架相当于从“⼩作坊”到“⼯⼚”的升级&#xff0c;⼩作坊什么都要⾃⼰做&#xff0c;⼯⼚是组件式装配&#xff0c;特点就是⾼效。 2. 框架更加易⽤、简单且⾼效。 2.创建一个Servlet项目&#xff08;我使用的是IDEA专业版&#…

USB TO SPI(上海同旺电子)调试器调试MCP6S92

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、MCP6S92 单端轨到轨输入/ 输出低增益PGA; 特性 • 复用输入&#xff1a;1 或2 个通道 • 8 种增益选择&#xff1a; - 1、2、4、5、8、10、16 或32 V/V • 串行外设接口&#xff08;SPI&#xff09; • 轨…

生成模型(三):基于流的生成模型(Flow-based model)

本文大纲如下&#xff1a; 到目前为止&#xff0c;已经介绍了[[生成模型-GAN]]和[[生成模型-VAE]]。它们都没有明确地学习真实数据的概率密度函数p(\mathbf{x})&#xff08;其中\mathbf{x}\in \mathcal{D}&#xff09;, 因为很难。以带有潜变量的生成模型为例&#xff0c;p(\ma…

Web前端105天day61-HTML5_CORE

HTML5CORE01 目录 前言 一、拖拽上传文件 1.1.文件上传 二、跨域 三、跨域解决方案 四、查看网站接口 五、文件上传服务 总结 前言 HTML5CORE01学习开始 HTML5 : 目前主流的 HTML 版本, 其中增加了很多新特性例如: 音视频, 网页存储技术 - webStorage一、拖拽上传文件…

TensorRT学习笔记 1 - 概述

TensorRT系列笔记是作者半年来学习和使用TensorRT(后称trt)积累笔记 整理和心得。包含trt的基本概念&#xff0c;相关资料&#xff0c;实践笔记&#xff0c;踩坑记录等等。 本篇博客希望可以初步说清楚 trt是什么&#xff1b;模型部署为什么使用trt&#xff0c;以及使用trt的…

渗透攻击MS08-067

学校课程关于Metasploit有基础的几个小实验&#xff0c;把它整理分享在这里。 实训目的&#xff1a; 熟悉Metasploit终端的使用方法&#xff0c;了解MS08-067漏洞&#xff0c;掌握对MS08-067漏洞攻击的方法。 场景描述&#xff1a; 在虚拟机环境下配置 “WinXP1”和“Kali …

华为机试_HJ63 DNA序列【中等】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 代码一 收藏点 描述 一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例&#xff08;定义为 GC-Ratio &#xff09;是序列中 G 和 C 两个字母的总的出现次数除以总的字…

公开竞价与封闭式竞价有什么不同?

电子竞价是电子采购的一种形式。电子采购是指通过信息和网络系统在线进行的招标采购过程。 电子竞价是指一种基于网络的系统&#xff0c;允许潜在供应商在网上实时竞争商品/服务的价格。电子竞价的使用方式类似于e-bay平台&#xff0c;出价最高者获胜。在建筑业&#xff0c;这…

前端_Vue_7.表单输入绑定

文章目录一、 表单输入绑定1.0. 表单&表单元素1.0.1. 表单1.0.2. 表单元素1.1. 基本用法1.1.1. 文本1.1.2. 多行文本1.1.3. 复选框1.1.4. 单选按钮1.1.5. 选择器1.2. 值绑定1.2.1. 复选框1.2.2. 单选按钮1.2.3. 选择器选项1.3. 修饰符1.3.1. .lazy1.3.2. .number1.3.3. .tr…