dpdk
文章平均质量分 53
小勇者
记录在Linux开发过程中遇到的问题及解决方法,如有不足,欢迎指正~
展开
-
【DPDK学习路径】九、学习分支
DPDK 作为数据处理平面,功能主要集中在 pkt_process 部分,大致就是各层网络功能的具体实现,当然,就如同内核努力通过钩子向上层提供可配置的处理内容一样,DPDK 也需要提供配置接口,以便即时的策略修改,否则为何不使用硬件转发呢?但对于一个正常的项目来说,这并不是最优解,因为这会导致代码来回改动,因此后续我将先论述一下简单的软件架构,再添加一部分功能,最后继续深入学习DPDK,了解接口的实现,论述性能调优。最后,不断提高对DPDK的理解,不断优化系统性能。原创 2024-06-13 17:19:27 · 299 阅读 · 0 评论 -
【DPDK学习路径】八、轮询
下面直接给出一个实例,此实例使用核心1及核心2创建了两个线程用于报文处理,其中在核心1上运行的线程接收网卡0的消息,而在核心2上运行的线程接收网卡1的消息。在这里,从网卡上获取报文的方式为轮询,具体的接口为 rte_eth_rx_burst,而所谓的报文处理,就是简单地打印报文消息。前面我们已经了解了如何使用DPDK创建线程并绑定核心,以及如何申请内存池并创建 RX/TX 队列。接下来我们将了解DPDK的核心内容之一:以轮询的方式从网卡中收取报文。原创 2024-06-13 16:41:32 · 387 阅读 · 0 评论 -
【DPDK学习路径】七、创建RX/TX队列
在这里,我们仅为每个网卡开启一个RX队列及一个TX队列,因此都设置为1。在 DPDK 中提供了 rte_eth_rx_queue_setup 及 rte_eth_tx_queue_setup 这两个接口用于接收/发送队列的创建。对于每个网卡,首先配置,然后创建RX队列,然后创建TX队列,最后启动网卡,并开启混杂模式。上一节我们讲述了如何申请内存池缓冲区以便接下来创建 RX 队列,这一节我们将给出具体如何创建 RX/TX 队列。现在,我们已经成功为所有绑定在DPDK上的网卡创建了相应的 RX/TX 队列。原创 2024-06-13 15:59:02 · 647 阅读 · 0 评论 -
【DPDK学习路径】六、申请缓冲区内存池
队列的组织依赖于存储数据报文的结构体,在内核协议栈中,这一结构体是sk_buff,而在DPDK中,这一结构体是 mbuf。简单来说,内核使用 sk_buff 保存接收/发送的报文,通过多个 sk_buff 组合成为接收/发送队列,而在 DPDK 中,使用 mbuf替代 sk_buff。Linux 内核协议栈与网卡之间的工作是非常经典的生产者-消费者模型,在接收报文的情况下,网卡总是生产者,而协议栈总是消费者,发送的时候则是相反的。下一节我们将讲述如何使用内存池缓冲区创建网卡的 接收/发送队列。原创 2024-06-13 15:22:18 · 506 阅读 · 0 评论 -
【DPDK学习路径】五、线程创建及核心绑定
因此,最终的结果是,此函数会在核心1上运行,并且每间隔1s输出一次核心id及线程id,而运行在核心2、3上的线程迅速结束,核心0则等待核心1上运行线程结束返回。如下所示,该函数含有三个参数,第一个参数是线程处理函数指针,第二个参数是处理函数的入参,第三个参数用于甄别是否使用主核心创建线程,有效值为SKIP_MASTER 及 CALL_MASTER,前者表示使用除了主核心以外的全部核心创建线程,后者表示使用全部核心创建线程,以四核系统为例,前者创建3个线程,后者创建4线程。原创 2024-06-12 23:16:09 · 490 阅读 · 0 评论 -
【DPDK学习路径】四、输出hello world!
前面的打印展示了一些底层初始化的细节,包括核心数量和NUMA节点数量,数量为1表示我的机器实际不支持NUMA,另外,它还提示我操作系统不支持大页,并且有许多的网卡绑定错误NUMA socket的提示,不过无妨,NUMA及大页的支持并不是DPDK程序运行所必须的,因此rte_eal_init最终没有报错,程序也正常地打印出来了 “hello world!好吧,它实际上也就是个简单的c程序。展示它是为了说明,在引入dpdk库之前,它就是一个普通的c程序,因此调用dpdk库就如同调用stdio库一样便捷。原创 2024-06-12 18:17:21 · 203 阅读 · 0 评论 -
【DPDK学习路径】三、DPDK 环境搭建
此时应该有ethernet0、ethernet1及ethernet2,挑选你需要用于dpdk的两个网卡修改为vmxnet3类型即可。设置内存页,包括non-NUMA及NUMA,均输入512即可,代表设置为512*2MB,即1G大页。之后选择 x86_64-native-linux-gcc,进行编译。编译完成后,插入UIO、VFIO、KNI模块。绑定网卡到IGB UIO模式,此模式最通用。1、在VMware中安装ubuntu 18.04。2、为虚拟机添加两个网卡,设置网卡类型为桥接。3、设置虚拟机网卡类型。原创 2024-06-12 17:33:51 · 348 阅读 · 0 评论 -
【DPDK学习路径】二、DPDK简介
基于软件的解决方案也有不少,比较著名的如tc、xdp、dpdk,tc、xdp主要用于流量控制,它们类似于netfilter框架中的钩子,可以在比较靠前的位置处理报文,在面对DDoS攻击的情况下,二者可以通过丢包的方式避免报文进入内核,因此提高了DDoS防御能力,此外XDP可以通过选择性地让报文跳过部分内核处理,因此提高报文的处理效率。除此之外,I/O效率、内存访问效率,也是性能限制因素。使用DPDK构建自己的数据平面,必须依赖于DPDK提供的这些库,当然,对于不同的DPDK程序,所需要的库也是不同的。原创 2024-06-12 17:08:24 · 924 阅读 · 0 评论 -
【DPDK学习路径】一、前言及目录
虽然目前网络上已经有很多关于DPDK的帖子,DPDK官网也有自己的说明文档,但是这些现存的资料,要么不够系统、全面,要么入门门槛很高,需要非常精通操作系统及网络报文处理,甚至于要你本身已经对DPDK十分了解才能读懂。基于上述情况,我认为有必要写一系列文章,由浅至深,系统地介绍DPDK框架,辅以具体的DPDK应用程序说明,既方便初学者入门,也有利于对DPDK更深入地学习。此外,本系列文章正在撰写过程中,因此目录中的内容将随时间逐一展示,并且随着内容架构调整,一些内容可能被修改/增加/删除,盼理解。原创 2024-06-12 15:56:49 · 184 阅读 · 0 评论 -
【DPDK】DPDK实现NAT
我编写了一个十分简单的DPDK用户程序以实现NAT功能,它工作的环境略显苛刻,但正因此此程序足够简单明了,可以足够清晰地展示dpdk中是如何一层层剥开数据报文,并根据需求修改各个字段的值。原创 2024-04-07 20:34:27 · 1096 阅读 · 0 评论