深入浅出dpdk读书笔记----dpdk的轮询模式

讲dpdk轮询模式之前,首先需要知道传统内核转发的模式,通过对比能够让我们清晰的知道内核 异步中断模式和dpdk的轮询模式有哪些区别,dpdk这种方式有哪些优化。

1、异步中断

当网卡收包队列收到包之后,会触发一个CPU中断,通知CPU网卡上有包需要处理,CPU产生一个中断服务例程,在中断服务的下半部来完成收包处理。这样不断进行中断处理。中断过程会带来中断处理、线程上下文切换这些操作的开销。当cpu的处理速度大于收包的速度时,这些花销可能就没有什么影响;当收包的速度大于CPU或者和cpu处理报文的速度相当时,这些花销就会被充分放大。

有包需要发送时,基于异步中断信号的驱动进程会准备好要发送的发包描述符,网卡完成发包时,会发一个中断,告知CPU报文已经发送完成,这时候cpu会把发包描述占有的内存释放掉。

2、dpdk轮询模式

2.1 dpdk纯轮询模式

dpdk的轮询模式是网卡和cpu之间通信是完全没有中断的,也就是说dpdk在初始化就会把收发包的中断关闭掉,没有中断,那dpdk怎么知道什么时候有包收到,什么时候包已经发送完成,接下来我们一起探究一下流程。这个流程借用之前将收发包探讨过程的一张图,对着图更好理解

 

收包流程:dpdk轮询驱动程序负责初始化好每一个收包描述符,将缓存区物理地址填充到描述符对应的位置,以及将接收成功的标志复位。然后队列管理器通过寄存器通知网卡有哪些队列已经准备好了,等待接收报文。网卡收到消息后,读取空闲收包描述符得知缓存区地址,将报文内容填充到缓存区中,如果一个缓存不能存下报文内容就会用多个缓存来存。重点来了,填充完成之后一定要设置一个标记收包成功的标志。这个标记是干什么呢,这个标记是用来告诉cpu,我的活干完了,已经根据你的要求把报文内容放到指定位置了,剩下就该你进行表演了。cpu为了能够及时处理到这个成功收包的标记,使用一个线程去轮询收包队列中的描述符是否已经收包成功。

dpdk驱动程序检查到收包成功的标志之后,这时候驱动程序会解析相应的收包描述符,提取各种有用的信息,然后填充对应的缓冲内存块头部。这个内存块也就是mbuf。然后把mbuf存到发包函数数组中,接着再分配一个mbuf以备下一个报文使用。

总结:收包过程:dpdk驱动程序准备好接收报文的缓存之后-->通知网卡-->网卡填充缓存-->设置成功收包标记-->cpu解析内容将信息填充到mbuf

发包流程:每一个发包队列都有一个单独的线程去设 置需要发出去的包。dpdk的驱动根据缓存中的内容提取有用的信息,比如报文的长度,地址,校验和等,然后初始化给一个发包队列中的描述符。这里边涉及两个重要的标记位,EOP和RS.。dpdk驱动程序检查到收包成功的标志之后,这时候驱动程序会解析相应的收包描述符,提取各种有用的信息,然后填充对应的缓冲内存块头部。每当驱动程序设置好相应的发包描述符,硬件就可以开始根据发包描述符的内容来发包,那么驱动程序可能会需要知道什么时候发包完成,然后回收占用的发包描述符和内存缓冲块。RS就是用来由驱动程序来告诉网卡硬件什么时候需要报告发送结果的一个标志。发包的轮询就是轮询发包结束的硬件标志位。DPDK驱动程序根据需要发送的包的信息和内容,设置好相应的发包描述符,包含设置对应的RS标志,然后会在发包线程里不断查询发包是否结束。只有设置了RS标志的发包描述符,网卡硬件才会在发包完成时以写回的形式告诉发包结束。

以下是这两个标记的主要区别:

EOP(End Of Packet)主要用于标记一个数据包在软件层面的处理完成情况,尤其是当一个数据包被分散到多个内存缓冲区(MBUF)中进行发送时,EOP标识的是最后一个缓冲区,表示这个缓冲区及其之前的缓冲区共同组成了一个完整的数据包。

而RS(Report Status,有时也被称作Completion Queue或Completion Event)通常是指硬件层面对数据包发送或接收操作完成的通知。在某些高性能网络设备或驱动中,硬件会在数据包发送完成后通过某种机制(如Completion Queue、中断或轮询)向软件报告发送结果,这时软件可以根据RS来获知硬件层面的数据包处理状态,并据此进行资源的释放和回收工作。

换言之,EOP更多关注的是数据包在软件层面的完整性,而RS侧重于硬件层面的处理结果反馈,两者结合确保了数据包从软件处理到硬件发送再到资源回收的全过程管理。

 讲了收发包轮询流程,不知道大家是不是存在这样一个疑问,收发包的缓存区是否是同一块?

在DPDK(Data Plane Development Kit)中,发包和收包使用的缓冲区(通常称为MBUFs)不一定是同一块缓存。DPDK在设计时采用了分离的内存池来管理接收和发送缓冲区。

  • 收包时,DPDK会从接收缓冲区内存池中分配MBUFs,网卡通过DMA(Direct Memory Access)将接收到的数据包内容填充到这些MBUFs中。

  • 发包时,应用软件会从发送缓冲区内存池中分配MBUFs,然后将要发送的数据包内容填充到这些MBUFs中,最后将它们提交给网卡进行发送。

当然,理论上说,如果在实际应用中,出于某种特殊需求或资源限制,设计者可以选择复用同一块内存区域作为接收和发送的缓冲区,但这不是DPDK标准实践中的常见做法。通常情况下,接收和发送缓冲区是分开管理的,以保证数据处理的高效性和一致性。

总结:收发包轮询模式的本质是轮询两个标记,针对收包,是收包完成标记,针对发包时发包结束标记。收包完成的标记是网卡用来告诉cpu,报文所有内容已经填充好了,cpu可以处理了;收包结束标记也是硬件告诉cpu的,cpu知道报文发送之后就会把收发包缓存以及描述符等资源都释放掉。

2.2 dpdk轮询混合模式

什么是dpdk轮询的混合模式呢,通俗的讲就是轮询中混有中断的情况。什么时候使用这种模式呢?网络中出现潮汐效应,某些情况出现收包数量很少甚至收不到包的情况,这个时候使用轮询模式就会造成资源的浪费,不节能。

dpdk提供了一种很有意思的机制,应用程序定义了一个简单的策略来决定是否以及什么时候让对应的收包线程进入休眠模式,并且在休眠之前使能收包中断。休眠之后对应的核的运算能力就被释放出来,完全可以用于其他任何运算,或者干脆进入省电模式,取决于内核怎么调度。当后续有任何包收到的时候,会产生一个收包中断,并且最终唤醒对应的应用程序收包线程。线程被唤醒后,就会关闭收包中断,再次轮询收包

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值