DPDK Programmer’s Guide(28)Reorder库

官方文档查看地址:
http://doc.dpdk.org/guides/prog_guide/reorder_lib.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-programmers-guide.html

本篇难度系数:
翻译:☆☆☆☆☆
理解:★★☆☆☆

28.重新排序库
Reorder库提供了一种基于mbufs序列号重新排序的机制。

28.1. 操作
reorder库本质上是一个重新排序mbufs的缓冲区。用户将无序mbufs插入到重新排序缓冲区中,并从中提取有序mbufs。

在给定时间,reorder缓冲区包含序列号位于sequence窗口内的mbufs。序列窗口由最小序列号和缓冲区配置为容纳的条目数决定。例如,给定一个包含200个条目和最小序列号为350的重新排序缓冲区,序列窗口的上限分别为350和550。

当插入mbuf时,reorder库根据插入mbuf的序号区分有效的、早的和晚的mbuf:

  • 有效:序列号在窗口内。
  • 迟:序号在窗口外,小于下限。
  • 早:序号在窗口外,且大于上限。

reorder缓冲区直接返回晚期mbufs,并尝试容纳早期mbufs。

28.2实现细节
reorder库实现为一对缓冲区,称为Order缓冲区和Ready缓冲区。

在插入调用时,将有效的mbufs直接插入到Order缓冲区中,并将带有错误的晚期mbufs返回给用户。

在早期mbuf的情况下,reorder缓冲区将尝试移动窗口(增加最小序列号),以便mbuf成为一个有效的窗口。为此,Order缓冲区中的mbufs被移动到Ready缓冲区中。任何尚未到达的mbuf都将被忽略,因此将成为延迟的mbuf。这意味着,只要就绪缓冲区中还有空间,窗口就会被移动,以容纳在重新排序窗口之外的早期mbuf。

例如,假设我们有一个包含200个条目的缓冲区,其中包含350个最小序列号,并且我们需要插入一个包含565个序列号的早期mbuf。这意味着我们需要移动窗口至少15个位置来容纳mbuf。只要就绪缓冲区中还有空间,reorder缓冲区将尝试将mbufs从Order缓冲区中的至少15个插槽移动到就绪缓冲区。此时订单缓冲区中的任何空隙都将被跳过,这些包到达时将被报告为延迟包。将数据包移动到就绪缓冲区的过程将持续到所需的最小值之后,直到在顺序缓冲区中遇到一个缺口,即丢失mbuf。

在清空mbufs时,reorder缓冲区将首先在就绪缓冲区中返回mbufs,然后从Order缓冲区返回mbufs,直到找到一个缺口(尚未到达的mbufs)。

28.3用例:包分发器

使用DPDK包分发器的应用程序可以使用reorder库以接收包的相同顺序传输包

一个基本的包分发器用例将由一个具有多个worker内核的分发器组成。工作人员对包的处理不能保证是有序的,因此可以使用重新排序缓冲区来对尽可能多的包进行排序。

在这种情况下,分发服务器在将序列号交付给工作人员之前将序列号分配给mbufs。当工作人员处理完数据包时,分发服务器将这些mbuf插入到重新排序缓冲区中,并最终传输耗尽的mbuf。

注意:目前,重新排序缓冲区不是线程安全的,因此同一线程负责插入和排干mbufs。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章