dpdk mbuf之概念理解

概念理解

为了高效访问数据,DPDK将内存封装在Mbuf(structrte_mbuf)结构体内。Mbuf主要用来封装网络帧缓存,也可用来封装通用控制信息缓存(ol_flags需要加上CTRL_MBUF_FLAG标志位)。Mbuf结构报头经过精心设计,原先仅占1个CacheLine。随着Mbuf头部携带的信息越来越多,现在Mbuf头部已经调整成两个CacheLine,原则上将基础性、频繁访问的数据放在第一个CacheLine字节,而将功能性扩展的数据放在第二个CacheLine字节。Mbuf报头包含包处理所需的所有数据,对于单个Mbuf存放不下的巨型帧(JumboFrame),Mbuf还有指向下一个Mbuf结构的指针来形成帧链表结构。所有应用都应使用Mbuf结构来传输网络帧。

对网络帧的封装及处理有两种方式:将网络帧元数据(metadata)和帧本身存放在固定大小的同一段缓存中;或将元数据和网络帧分开存放在两段缓存里。前者的好处是高效:对缓存的申请及释放均只需要一个指令,缺点是因为缓存长度固定而网络帧大小不一,大部分帧只能使用填0(padding)的方式填满整个缓存,较为耗费内存空间。后者的优点则是相对自由:帧数据的大小可以任意,同时对元数据和网络帧的缓存可以分开申请及释放;缺点是低效,因为无法保证数据存在于一个CacheLine中,可能造成HitMiss。

为保持包处理的效率,DPDK采用了前者。网络帧元数据的一部分内容由DPDK的网卡驱动写入。这些内容包括VLAN标签、RSS哈希值、网络帧入口端口号以及巨型帧所占的Mbuf个数等。对于巨型帧,网络帧元数据仅出现在第一个帧的Mbuf结构中,其他的帧该信息为空。
下图为单个mbuf的结构定义:
在这里插入图片描述
一个Mbuf的基本组成。其中,Mbuf头部的大小为两个CacheLine,之后的部分为缓存内容,其起始地址存储在Mbuf结构的
buffer_addr指针中。在Mbuf头部和实际包数据之间有一段控制头空间(headroom),用来存储和系统中其他实体交互的信息,如控制信息、帧内容、事件等。headroom的长度可由RTE_PKTMBUF_HEADROOM定义。
headroom的起始地址保存在Mbuf的buff_addr指针中,在lib/librte_port/rte_port.h中也有实用的宏,用来获得从buff_addr起始特定偏移量的指针和数据,详情请参考rte_port.h源码中RTE_MBUF_METADATA_UINT8_PTR以及RTE_MBUF_METADATA_UINT8等宏。数据帧的起始指针可通过调用rte_pktmbuf_mtod(Mbuf)获得。
数据帧的实际长度可通过调用rte_pktmbuf_pktlen(Mbuf)或rte_pktmbuf_datalen(Mbuf)获得,但这仅限于单帧Mbuf。巨型帧的单帧长度只由rte_pktmbuf_datalen(Mbuf)返回,而rte_pktmbuf_pktlen(Mbuf)用于访问巨型帧所有帧长度的总和。
下图为多个mbuf的分段保存
在这里插入图片描述
创建的函数为rte_pktmbuf_alloc()或rte_ctrlmbuf_alloc(),前者用来创建网络帧Mbuf,后者用来创建控制
信息Mbuf。初始化该Mbuf则由rte_pktmbuf_init()或rte_ctrlmbuf_init()函数完成。这两个函数用来初始化一些Mbuf的关键
信息,如Mbuf类型、所属内存池、缓存起始地址等。初始化函数被作为rte_mempool_create的回调函数。
释放一段Mbuf实际等于将其放回所属的内存池,其缓存内容在被重新创建前不会被初始化。
除了申请和释放外,对Mbuf可执行的操作包括:
获得帧数据长度——rte_pktmbuf_datalen()
获得指向数据的指针——rte_pktmbuf_mtod()
在帧数据前插入一段内容——rte_pktmbuf_prepend()
在帧数据后增加一段内容——rte_pktmbuf_append()
在帧数据前删除一段内容——rte_pktmbuf_adj()
将帧数据后截掉一段内容——rte_pktmbuf_trim()
连接两段缓存——rte_pktmbuf_attach() 此函数会连接两段属于不同缓存区的缓存,称为间接缓存(indirectbuffer)。对间接缓存的访问效率低于直接缓存(意为一段缓存包含完整Mbuf结构和帧数据),因此请仅将此函数用于网络帧的复制或分段。
分开两段缓存——rte_pktmbuf_detach()
克隆Mbuf——rte_pktmbuf_clone(),此函数作为rte_pktmbuf_attach的更高一级抽象,将正确设置连接后Mbuf的各个参数,相对rte_pktmbuf_attach更为安全。

猜你喜欢

转载自blog.csdn.net/yaochuh/article/details/88207553