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

相关文章

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

rust 中的 EBNF简介举例

《rust中的EBNF简介举例》:本文主要介绍rust中的EBNF简介举例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 什么是 EBNF?2. 核心概念3. EBNF 语法符号详解4. 如何阅读 EBNF 规则5. 示例示例 1:简单的电子邮件地址

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指