DPDK——REORDER LIBRARY 排序库
一. 缘由
排序,不要与tcp流重组排序混淆,而且下文踢桃序列号和tcp序列号不是同一个。此库为非线程安全的。
二. 介绍
1.引言
Reorder Library 提供一种机制依据序列号对mbuf进行排序。
2.操作
Reorder Library实质上是一个mbuf有序buffer。使用者将乱序的mbuf插入到有序的buffer中,然后从中有序的取出。
在给定时间内,这个重排buffer包含序列号在序列窗口内的mbufs。序列窗口由最小序列数和重排序buffer配置的持有条目数决定。例如,给一个有200条目的重排序buffer和350的最小序列,这个序列窗口最小值和最大值分别为350,550。
当插入mbufs时,Reorder Library依赖插入在mbuf中序列号来区分先后的有效性:
vaild: 序列号在窗口内。
late: 序列号在窗口外,小于最小序列号。
early:序列号在窗口外,大于最大序列号。
重排buffer直接返回late mbufs,然后尝试容纳early mbufs。
3.实现细节
Reorder Library 实现一对缓冲区,称为Oder buffer 和Ready buffer。
调用一个插入方法,vaild mbufs是直接插入到Oder buffer,而late mbufs是直接返回一个错误信息。
对于early mbufs这种情况下,重新排序buffer将尝试移动窗口(递增最小序列号),以使mbuf变为有效的。为此,在Oder buffer中mbufs被移到Ready buffer中。任何mbufs没有及时到达的将被忽略,因此将变为late mbufs。这意味着只要Ready buffer中有多余的空间,窗口就会移动来容纳early mbufs,否则就会在重排窗口之外。
例如,假设有一个200条目和最小序列为350的重排buffer,然后我们需要差异个序号为565的early mbuf。这说明我们至少需要移动窗口15个位置去容纳这个mbuf。这个重排buffer尝试移动mbufs在Order buffer中15个槽到Ready buffer中,只要Ready buffer中有足够的空间。在这个点的Order buffer的任何空隙将调过,当后面到来的包将被当做late包。将数据包移动Ready buffer过程持续到最小值知道一个空隙,如在Order buffer 遇到丢包。
当处理mbufs过程时,这个重排buffer将先把Ready buffer中的mbuf返回,然后Order buffer中的直到遇到丢包。
三. 应用
案例:包分发器
使用DPDK实现一个包分发器的应用,利用到Reorder Library库按包接收的顺序去转发数据包。
一个基本的包分发器由一个分发器和多个worker线程组成。这个worker线程无法保证包有序的,因此一个重排序缓存能够尽可能的讲包排序处理。
在这种场景下,在将mbufs派送到works前,包分发器分配一个序列号到mbuf。当works完成包处理时,这个包分发器插入这个mbufs到重排序buffer,然后最后转发到处理mbufs。
四. DPDK example
[root@dev packet_ordering]# ls
build main.c Makefile
[root@dev packet_ordering]# make clean
[root@dev packet_ordering]# makeCC main.oLD packet_orderingINSTALL-APP packet_orderingINSTALL-MAP packet_ordering.map
/* Create rings for inter core communication */rx_to_workers = rte_ring_create("rx_to_workers", RING_SIZE, rte_socket_id(),RING_F_SP_ENQ);if (rx_to_workers == NULL)rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));workers_to_tx = rte_ring_create("workers_to_tx", RING_SIZE, rte_socket_id(),RING_F_SC_DEQ);if (workers_to_tx == NULL)rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));if (!disable_reorder) {send_args.buffer = rte_reorder_create("PKT_RO", rte_socket_id(),REORDER_BUFFER_SIZE);if (send_args.buffer == NULL)rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));}last_lcore_id = get_last_lcore_id();master_lcore_id = rte_get_master_lcore();worker_args.ring_in = rx_to_workers;worker_args.ring_out = workers_to_tx;/* Start worker_thread() on all the available slave cores but the last 1 */for (lcore_id = 0; lcore_id <= get_previous_lcore_id(last_lcore_id); lcore_id++)if (rte_lcore_is_enabled(lcore_id) && lcore_id != master_lcore_id)rte_eal_remote_launch(worker_thread, (void *)&worker_args,lcore_id);if (disable_reorder) {/* Start tx_thread() on the last slave core */rte_eal_remote_launch((lcore_function_t *)tx_thread, workers_to_tx,last_lcore_id);} else {send_args.ring_in = workers_to_tx;/* Start send_thread() on the last slave core */rte_eal_remote_launch((lcore_function_t *)send_thread,(void *)&send_args, last_lcore_id);}/* Start rx_thread() on the master core */rx_thread(rx_to_workers);
原文链接:http://t.csdn.cn/jJQZw
更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!
学习地址:http://ke.qq.com/course/5066203?flowToken=1043717
DPDK——REORDER LIBRARY 排序库相关推荐
- DPDK reorder库
前言:对于有些任务比较重的工作,我们通常都会采用负载均衡的方法用以提高任务效率.然而有些应用报文对于报文顺序要求比较严格,这就要求在报文在经过负载均衡处理后,进一步处理前,重新调整报文的顺序,保证和进 ...
- C++library Sort库排序的实现算法(附完整源码)
C++library Sort库排序的实现算法 C++library Sort库排序的实现算法完整源码(定义,实现,main函数测试) C++library Sort库排序的实现算法完整源码(定义,实 ...
- vue.js 拖拽排序_快速轻巧的Vue.js拖放可排序库
vue.js 拖拽排序 vue-smooth-dnd (vue-smooth-dnd) A fast and lightweight drag&drop, sortable library f ...
- DPDK — 扩展私有函数库
目录 文章目录 目录 DPDK 扩展第三方函数库 扩展一个新的 libfoo 库 添加扩展库的启用配置 实现扩展库 添加扩展库的 Makefile 重新编译安装 DPDK 的目标环境 在自己的 DPD ...
- library Interpositioning 库(内插)干预技术
library Interpositioning 库(内插)干预技术: linux 链接器支持库内插干预技术,它允许使用者截获对共享库函数的调用取而代之执行自己的代码,使用库干预机制,可以追踪感兴趣库 ...
- C++函数库的理解:写一个C++程序库(排序库)然后调用自己写的库(附带程序)
1.自己写一个库:和建工程是一样的,但是建的项目是DLL文件,然后再其工程下添加源文件和头文件,源文件正常写,头文件是有要求的,__declspec(dllexport)的加入,程序在下面是给出的,所 ...
- Enterprise Library 企业库 V4.1
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework ...
- 最新版 Enterprise Library 企业库 V4.1 中文学习手册
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework ...
- Xcode9之后打开Object Library组件库
Xcode9之前 在Xcode9及之前的版本,打开storyboard后,Object library会出现在inspectors底部. Xcode9之后 从Xcode10开始,Object Libr ...
最新文章
- rstudio怎么安装ggplot2_如何基于ggplot2构建相关系数矩阵热图
- Zabbix如何实现Server和Agent的通信加密
- set,存放不重复数据的集合类型
- NUnit.Framework在VS2015中如何进行单元测试
- linux ftp 查找文件,Linux shell ftp命令根据文件日期下载文件的方法
- 机器学习-吴恩达-笔记-5-神经网络学习
- Java 工程师成神之路!
- 使用Python Seaborn和Pandas进行数据可视化
- 如何检查Mac的电池健康状况
- 拓端tecdat|R语言GARCH模型对股市sp500收益率bootstrap、滚动估计预测VaR、拟合诊断和蒙特卡罗模拟可视化
- oppok3如何刷机_OPPO K3刷机教程?
- 丁磊推荐《你的灯亮着吗》为三大管理必读书
- ActiveMQ 反序列化漏洞 (CVE-2015-5254)
- Windows7电脑自动断网的解决方法
- WORD无法复制文件:无法读源文件或磁盘
- 自然语言处理NLP中的N-gram模型
- compare的数组升序和降序
- 云服务器搭建个人站点-之-站点搭建
- android 微软桌面,Mirosoft Launcher微软桌面
- app开发对于企业及商家来说为什么越来越重要?
热门文章
- 测试需要掌握的数据库sql知识(一):基本语句操作
- Linux server quick cheat sheet
- 《文献管理与信息分析》慕课学习心得
- 【阿里云镜像】OpenSUSE全新安装并更改阿里OpenSUSE镜像源
- 应届生考编上岸选岗、备考经验
- 2021-08-08ctf中的上传upload题目.user.ini绕过后缀黑名单过滤(同文件夹下有php文件突破口)
- Seata实战-分布式事务简介及demo上手
- 关于android中PendingIntent.getBroadcase的注册广播VSAlarmManager .cancle(PendingIntent)如何区分PendingIntent
- Win10《芒果TV》商店版更新v3.2.2:新增对Win10产品专用会员兑换码支持,全新的最具价值用户纪念奖励...
- 【论文阅读】Causal Imitative Model for Autonomous Driving