DPDK简介及相关资料整理

2024-09-03 01:36
文章标签 整理 相关 资料 简介 dpdk

本文主要是介绍DPDK简介及相关资料整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:

1) 轮询:在包处理时避免中断上下文切换的开销,

2) 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化

3) 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中

4) 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽

5) 软件调优:cache行对齐,预取数据,多元数据批量操作

DPDK架构

DPDK收发包相关

一台服务器可能有多个网卡,接入到PCIe通道,每个网卡可能有一个或多个物理网口,即port,这些网口共用网卡的处理芯片。对于Intel E810 100Gbps网卡为例,单个port的接收和发送速率为100Gbps,但是两个网卡的速率最多为160Gbps左右。一个port可以有多个接收/发送队列,例如 E810 100Gbps网卡,一个port最多可以支持256个接收队列,当网卡接收到数据包时会将数据包按照RSS负载均衡算法分配给这些队列,不同的线程可以从这些队列中获取数据并处理,这样的目的是可以充分发挥多核CPU的性能。一个接收/发送队列可以设置一定数量的队列描述符,用于存放数据包的metadata。例如,E810 100Gbps网卡,最多支持4096个Rx描述符,即可以同时允许4096个数据包在网卡中等待应用程序处理,如果此时还有新的数据包到达网口,这些数据包只能被drop,就是丢包的意思。描述符中存放的是数据包在内存中的地址,而不是数据包本身。

以DPDK收包为例,首先会调用rte_pktmbuf_pool_create函数为不同的port创建内存池,内存池中可以存放mbuf对象,即数据包对象,
struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create(
            strbuf, NUM_MBUFS_DEFAULT, MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, socket_id);
            
然后调用rte_eth_dev_configure设置队列数量,
ret_val = rte_eth_dev_configure(port_id, rx_queues, 0, &port_conf);

接着设置每个队列的描述符数量以及关联mbuf_pool,
for (uint16_t i = 0; i < rx_queues; i++) {
    ret_val = rte_eth_rx_queue_setup(port_id, i, rx_descs, rte_eth_dev_socket_id(port_id), NULL,
                                     mbuf_pool);
    if (ret_val) {
        RTE_LOG(ERR, NTR,
                "Failed to configure descriptors for port %d with rx queue %d, error: %s\n",
                port_id, i, rte_strerror(-ret_val));
        return ret_val;
    }
}
最后启动port,
ret_val = rte_eth_dev_start(port_id);

启动port后,可以调用rte_eth_rx_burst来轮询(PMD)获取一定数量的数据包,
rx_pkt_nb = rte_eth_rx_burst(config->port, config->queue, bufs, WORKER_RTE_MBUF_SIZE);
数据包以这个结构struct rte_mbuf *bufs[WORKER_RTE_MBUF_SIZE];来存放。

处理完数据包以后,调用函数rte_pktmbuf_free_bulk来释放相关资源,应该包含清空rx queue中的描述符,清空mbuf_pool中的数据等,
rte_pktmbuf_free_bulk(bufs, rx_pkt_nb);

参考:

wangxiaohui2015/dpdk_engineer_manual

这篇关于DPDK简介及相关资料整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131653

相关文章

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

StarRocks索引详解(最新整理)

《StarRocks索引详解(最新整理)》StarRocks支持多种索引类型,包括主键索引、前缀索引、Bitmap索引和Bloomfilter索引,这些索引类型适用于不同场景,如唯一性约束、减少索引空... 目录1. 主键索引(Primary Key Index)2. 前缀索引(Prefix Index /

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j