【麦田任务源码】【姓名大战 源码】【leanote源码分析】spdk源码下载

时间:2024-12-22 22:52:14 编辑:arq协议源码 来源:wow源码

1.技术干货!源码DPDK新手入门到网络功能深入理解
2.用户态NVMe运维利器 -- SPDK NVMe 字符设备
3.OvS-vsctl与ovsdb交互源码分析
4.SPDK/NVMe存储技术分析之理解SGL
5.Intel高性能IO500分布式存储系统DAOS资源汇总-包含RDMA 网络 SPDK NVME TSE 任务调度 异步 事件队列等

spdk源码下载

技术干货!下载DPDK新手入门到网络功能深入理解

       DPDK新手入门

       一、源码安装

       1. 下载源码

       DPDK源文件由几个目录组成。下载

       2. 编译

       二、源码配置

       1. 预留大页

       2. 加载 UIO 驱动

       三、下载麦田任务源码运行 Demo

       DPDK在examples文件下预置了一系列示例代码,源码这里以Helloworld为例进行编译。下载

       编译完成后会在build目录下生成一个可执行文件,源码通过附加一些EAL参数可以运行起来。下载

       以下参数都是源码比较常用的

       四、核心组件

       DPDK整套架构是下载基于以下四个核心组件设计而成的

       1. 环形缓冲区管理(librte_ring)

       一个无锁的多生产者,多消费者的源码FIFO表处理接口,可用于不同核之间或是下载逻辑核上处理单元之间的通信。

       2. 内存池管理(librte_mempool)

       主要职责是源码在内存中分配用来存储对象的pool。 每个pool以名称来唯一标识,并且使用一个ring来存储空闲的对象节点。 它还提供了一些其他的服务,如针对每个处理器核心的缓存或者一个能通过添加padding来使对象均匀分散在所有内存通道的对齐辅助工具。

       3. 网络报文缓冲区管理(librte_mbuf)

       它提供了创建、释放报文缓存的能力,DPDK应用程序可能使用这些报文缓存来存储数据包。这个缓存通常在程序开始时通过DPDK的mempool库创建。这个库提供了创建和释放mbuf的API,能用来暂存数据包。

       4. 定时器管理(librte_timer)

       这个模块为DPDK的执行单元提供了异步执行函数的能力,也能够周期性的触发函数。它是通过环境抽象层EAL提供的能力来获取的精准时间。

       五、姓名大战 源码环境抽象层(EAL)

       EAL是用于为DPDK程序提供底层驱动能力抽象的,它使DPDK程序不需要关注下层具体的网卡或者操作系统,而只需要利用EAL提供的抽象接口即可,EAL会负责将其转换为对应的API。

       六、通用流rte_flow

       rte_flow提供了一种通用的方式来配置硬件以匹配特定的Ingress或Egress流量,根据用户的任何配置规则对其进行操作或查询相关计数器。

       这种通用的方式细化后就是一系列的流规则,每条流规则由多种匹配模式和动作列表组成。

       一个流规则可以具有几个不同的动作(如在将数据重定向到特定队列之前执行计数,封装,解封装等操作),而不是依靠几个规则来实现这些动作,应用程序操作具体的硬件实现细节来顺序执行。

       1. 属性rte_flow_attr

       a. 组group

       流规则可以通过为其分配一个公共的组号来分组,通过jump的流量将执行这一组的操作。较低的值具有较高的优先级。组0具有最高优先级,且只有组0的规则会被默认匹配到。

       b. 优先级priority

       可以将优先级分配给流规则。像Group一样,较低的值表示较高的优先级,0为最大值。

       组和优先级是任意的,取决于应用程序,它们不需要是连续的,也不需要从0开始,但是leanote源码分析最大数量因设备而异,并且可能受到现有流规则的影响。

       c. 流量方向ingress or egress

       流量规则可以应用于入站和/或出站流量(Ingress/Egress)。

       2. 模式条目rte_flow_item

       模式条目类似于一套正则匹配规则,用来匹配目标数据包,其结构如代码所示。

       首先模式条目rte_flow_item_type可以分成两类:

       同时每个条目可以最多设置三个相同类型的结构:

       a. ANY可以匹配任何协议,还可以一个条目匹配多层协议。

       b. ETH

       c. IPv4

       d. TCP

       3. 操作rte_flow_action

       操作用于对已经匹配到的数据包进行处理,同时多个操作也可以进行组合以实现一个流水线处理。

       首先操作类别可以分成三类:

       a. MARK对流量进行标记,会设置PKT_RX_FDIR和PKT_RX_FDIR_ID两个FLAG,具体的值可以通过hash.fdir.hi获得。

       b. QUEUE将流量上送到某个队列中

       c. DROP将数据包丢弃

       d. COUNT对数据包进行计数,如果同一个flow里有多个count操作,则每个都需要指定一个独立的id,shared标记的计数器可以用于统一端口的不同的flow一同进行计数。

       e. RAW_DECAP用来对匹配到的数据包进行拆包,一般用于隧道流量的剥离。在action定义的时候需要传入一个data用来指定匹配规则和需要移除的内容。

       f. RSS对流量进行负载均衡的操作,他将根据提供的数据包进行哈希操作,并将其移动到对应的队列中。

       其中的level属性用来指定使用第几层协议进行哈希:

       g. 拆包Decap

       h. One\Two Port Hairpin

       七、常用API

       1. 程序初始化

       2. 端口初始化

       3. 队列初始化

       DPDK-网络协议栈-vpp-ovs-DDoS-虚拟化技术

       DPDK技术路线视频教程地址立即学习

       一、DPDK网络

       1. 网络协议栈项目

       2.dpdk组件项目

       3.dpdk经典项目

       二、DPDK框架

       1. 可扩展的矢量数据包处理框架vpp(c/c++)

       2.DPDK的虚拟交换机框架OvS

       3.golang的网络开发框架nff-go(golang)

       4. 轻量级的switch框架snabb(lua)

       5. 高效磁盘io读写spdk(c)

       三、DPDK源码

       1. 内核驱动

       2. 内存

       3. 协议

       4. 虚拟化

       5. cpu

       6. 安全

       四、性能测试

       1. 性能指标

       2. 测试方法

       3. 测试工具DPDK相关学习资料分享:点击领取,辰龙打鱼源码备注DPDK

       DPDK新手入门原文链接:DPDK上手

用户态NVMe运维利器 -- SPDK NVMe 字符设备

       刘孝冬 Intel 高级软件工程师 专注于开源存储SPDK及ISA-L软件的开发。

       随着数据中心规模的不断扩大与延展,硬件设备的运行维护已成为信息技术企业与部门普遍重视的一环。随之而来,是庞大的IT运维工作量。实现硬件设备的可维护,需要灵活高效的监控与管理工具。

       在Linux中,有诸多监控与管理工具助力设备运维,如hdparm、ethtool、SmartCTL等;也有很多简单易用的系统工具,如lspci、lsblk、iostat。对于目前部署量越来越大的NVMe设备,最通用有效的工具莫过于Nvme-cli。

       通过Nvme-cli,使用者可以获取NVMe设备记录的各种LOG;查询当前设备状态;获取设备本身以及内部Namespace的配置信息;设置设备的各项功能;以及对设备做重启与格式化。

       Nvme-cli在监控管理NVMe设备的主要过程,即是组织相关命令信息,通过对NVMe设备文件(/dev/nvmeX,/dev/nvmeXnY)发起IOCTL系统调用,将命令传入内核继而发送请求到NVMe设备上;待NVMe设备响应命令请求,发回响应后,再提取有效响应信息出来。因此,Nvme-cli众多命令的普遍格式是:

       SPDK是一组用于编写高性能、可扩展的个股涨幅源码用户模式存储应用程序的工具和库。其基础是处在用户空间,轮询模式、异步、无锁的NVMe驱动程序。这为从用户空间应用程序直接访问NvmeSSD提供了零拷贝、高度并行的访问。在此基础上,SPDK还提供了完整的块堆栈作为用户空间库,该库能够执行与操作系统中块存储软件栈相同的许多操作,以及最上层的NVMe-oF、iSCSI和Vhost-user应用服务。

       伴随着SPDK日益广泛的应用,NVMe设备的监控管理成为一个必要的需求。即处在用户空间应用程序的NVMe设备,如何能被用户监控管理。尤其是要便捷、容易通用,那就要求Linux下常用的工具也能被SPDK所支持,尤其是Nvme-cli。

       之前,SPDK社区在Nvme-cli源码基础上,加入对特定于SPDK下NVMe设备的修改(github.com/spdk/nvme-cli...),使得Nvme-cli用在该类设备上。但该实现方式如同在Nvme-cli进程内启动了一个SPDK实例(如图1所示),难以被合并到Nvme-cli的主分支上。

       用户自己编译与使用的过程略显繁琐(spdk.io/doc/nvme-cli.html...):

       由于类似SPDK版的Nvme-cli使用上的诸多不便,社区在寻找更佳的实现方式,来支持Linux上相关工具。

       在SPDK v. Release (spdk.io/release//...)中增加的一个新功能叫做NVMe字符设备 (NVMe character device)。它基于CUSE实现,可以在Linux内核中为NvmeController和Nvme Namespace创建对应字符设备节点(即 /dev/spdk/nvmeX,/dev/spdk/nvmeXnY)。Nvme-cli等工具可以无修改,直接使用这些模拟出的字符设备来监控管理SPDK下的NVMe设备。

       由于此功能目前被认为是实验性的功能,所以需要在configure的时候,显式指定使能nvme-cuse,即在编译SPDK NVMe 驱动时,加入基于CUSE字符设备的支持。

       SPDK为NVMe字符设备功能加入了两个RPC命令bdev_nvme_cuse_register与bdev_nvme_cuse_unregister。它们分别用于指定为某NVMe设备创建CUSE字符设备,和注销CUSE字符设备。当使用bdev_nvme_cuse_register RPC命令后,SPDK会通过CUSE在路径/dev/spdk下,为NVMe controller创建 /dev/spdk/nvmeX,并为其下Namespace创建 /dev/spdk/nvmeXnY,如图2。

       之后,可见路径/dev/spdk下出现SPDK创建的NVMe字符设备:

       nvme-cli使用指定的SPDK NVMe字符设备。目前,大多数的nvme-cli命令可以通过这种方式执行。

       nvme /dev/spdk/nvme0 []

       SPDK社区期望能够无缝地将当前流行的监控管理工具应用在SPDK下的NVMe设备上。当前实现的SPDK NVMe字符设备朝着这个目标迈进了一大步——诸多采用对NVMe字符设备路径文件发起IOCTL调用的工具和命令可以直接运行操作。

       但它的依旧存在诸多局限性:

       通过CUSE创建的NVMeNamespace路径文件属性是字符设备。但从常理上,其文件属性应该为块设备,例如Linux内核驱动创建的NVMeNamespace路径文件属性是块设备。虽然与IO命令不同,监控与管理操作不需要区分设备类型,但在Nvme-cli中如果操作设备指定的是NVMeNamespace文件,代码是存在多处诸如S_ISBLK这样的设备类型检查。

       以下两图分别是SPDK通过CUSE创建的NVMe设备文件,和内核驱动创建的NVMe设备文件,对比可见NVMeNamespace路径文件属性的不同。

       /proc/diskstats信息的缺失。诸多性能监控工具采用定期查看/proc/diskstats文件来获取存储设备的IO流量和负载情况。SPDK目前还未实现一个通用的信息注入方法,来将SPDK块设备或NVMe设备的相关信息实时写入/proc/diskstats。

       SPDK当前的获取设备IO流量和负载信息的方法,是通过SPDK RPC 方法bdev_get_iostat。

       /sys/block/目录下相关文件的缺失。部分工具,如lsblk,是需要通过筛选读取/sys/block/目录下设备文件,来获取相关信息;对/sys/block/目录下设备相关的某些文件,写入内容,来操作设备。SPDK目前也没有实现简洁有效的方法,模拟导出自己的/sys/block/文件。

OvS-vsctl与ovsdb交互源码分析

       本文深入解析了ovs-vsctl与ovsdb交互的源码细节,旨在帮助初学者更好地理解配置过程。具体以ovs-vsctl add-port s1 vxlan为例,揭示了其在ovs基础命令框架下的执行流程。

       首先,处理命令行并更新事务。主体代码位于utilities/ovs-vsctl.c文件中,其主函数do_vsctl负责解析命令行,并将需要更新的信息同步到ovsdb。vsctl_cmd_init函数注册了vsctl的命令参数选项,并存储了各命令及回调函数等相关信息。例如,add-port命令的执行会调用cmd_add_port函数。

       在执行命令过程中,ovs利用生成的python代码(如ovsrec_port_set_name)对数据库事务(txn)进行封装。该过程涉及将datum的n、key、val信息存入row结构体中,以便后续更新。ovsrec_port_columns_init注册了column的解析和反解析函数,name字符串通过ovsdb_datum_clone调用parse函数解析到row->new中。最后,ovsdb_idl_txn_commit_block将更新后的txn同步到ovsdb。

       接着,ovs-vsctl通过默认的unix sock与ovsdb通信。Open vSwitch Database Interface Definition Language (OVSDB IDL) 描述了通信接口。stream_lookup_class用于检查stream的name为unix。stream在挂接了unix_stream_class后,进一步挂接stream_fd_class。

       对于深入学习和交流,相关资源和链接提供了一定的指导,如yuque.com/lishuhuakai/d...等,涵盖了dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/0vS/TRex/dpvs公开课程。此外,dpdk/spdk/网络协议栈的学习资料、教学视频和学习路线图可在特定学习交流群中找到,为开发者提供了丰富的学习资源和社区支持。

SPDK/NVMe存储技术分析之理解SGL

       在NVMe over PCIe环境中,I/O命令支持SGL(Scatter Gather List 分散聚合表)和PRP(Physical Region Page 物理(内存)区域页),管理命令仅支持PRP。与此相对,在NVMe over Fabrics环境中,无论是管理命令还是I/O命令都只支持SGL。NVMe over Fabrics网络既支持FC网络,又支持RDMA网络。在RDMA编程中,SGL是最基本的数据组织形式。SGL是由一个或多个SGE(Scatter/Gather Element)构成的数组。

       SGL的每一个SGE就是一个Data Segment(数据段)。在数据传输过程中,发送/接收使用的Verbs API为ibv_post_send(),该函数将以 wr 开头的工作请求 (WR) 链表发送到队列对 qp 的发送队列。在调用此函数之前,必须填充好数据结构wr。wr是一个链表,包含了一个sg_list(i.e. SGL),其长度为num_sge。

       一个SGL被至少一个MR(内存区域)保护,多个MR存在于同一个PD(物理地址域)中。一个SGL数组包含多个SGE,SGE的长度不一。在内存中,这些buffer并不连续,而是Scatter(分散)在各个地方。RDMA硬件读取到SGL后,进行Gather(聚合)操作,从而在RDMA硬件的Wire上看到的是连续的数据段。通过使用SGL,可以将分散在内存中的多个数据段(不连续)交给RDMA硬件去聚合成连续的数据段。

       在理解SGL的原理和实现后,可以参考相关学习资源,如Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家,获取更多DPDK学习资料。另外,推荐观看视频,如dpdk网卡数据的抓取(一)/协议栈/源码/netmap/柔性数组/udp协议/虚拟化/ICMP/NFV/网卡 dpdk为你的网络定义新功能(一)/NFV/协议栈/虚拟化/源码/网卡/ovs/vpp,以加深对SGL的实践理解。最后,提供一段代码示例,展示如何为调用ibv_post_send()准备SGL和WR。

Intel高性能IO分布式存储系统DAOS资源汇总-包含RDMA 网络 SPDK NVME TSE 任务调度 异步 事件队列等

       DAOS项目计划:详细规划和路线图,请访问、/developer/user//articles获取更多信息

搜索关键词:最新公会神兽源码