SPDK线程模型

news/2024/10/25 9:30:50/

一、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.ppmy.cn/news/5792.html

相关文章

【代码随想录】数组-golang

数组 from 代码随想录 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], …

二叉树10:二叉树的最小深度

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:111. 二叉树的最小深度 题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近…

Jenkins + Jmeter + Ant 持续集成

搭建提前安装好:ant Jenkins 环境 一、Jenkins 安装 Ant 插件: 进入Jenkins 配置插件页面,安装ant 插件: 打开插件配置页面,如下图: 点击“Available” 在输入框搜索 ant 安装即可: 二、安装…

一、线程相关概念

文章目录相关概念程序(program)进程线程单线程与多线程并发与并行相关概念 程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码。 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程&#xff0c…

-防火墙-

数据来源 一、防火墙的基本概念 防火墙的定义:是一款具备安全防护功能网络设备 ◆ 隔离网络 将需要保护的网络与不可信任网络进行隔离,隐藏信息并进行安全防护 防火墙基本功能: ◆ 访问控制 - ACL ◆ 攻击防护 ◆ 冗余设计 ◆ 路由、交…

redis 大key 防坑指南

目录 一、大key危害 二、为什么会引入大key问题 三、举例 四、如何防控 五、发生了大key问题怎么办 六、如何测试阶段暴露大key问题 一、大key危害 redis大key导致redis负载比较高,影响redis的性能 二、为什么会引入大key问题 存入redis数量不可控&#x…

校园文件发布系统|基于Springboot实现校园文章发布系统

作者主页:编程千纸鹤 作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享 收藏点赞不迷路 关注作者有好处 文末获得源码 …

基于事件触发的二阶多智能体领导跟随一致性

【无限嚣张(菜菜)】:hello您好,我是菜菜,很高兴您能来访我的博客,我是一名爱好编程学习研究的菜菜,每天分享自己的学习,想法,博客来源与自己的学习项目以及编程中遇到问题…