当前位置: 首页 > news >正文

DPDK18.08上对VIRTIO IN ORDER 功能所做的优化

众所周知,虚拟队列数据传输的基本流程是——virtio驱动向available队列添加buffer描述符并且触发驱动事件来通知后端device。Device执行前端的request,当结束时标记已经被使用的buffer,然后向驱动发送中断。在device处理过程中,并不一定要求按照virtio device加入avaible队列的顺序来使用buffer。这就造成virtio驱动必须一个一个描述符来处理数据。

然而,一些硬件vhost device可以保证按照avaiblering的顺序使用buffer,这时就可以提供VIRTIO_F_IN_ORDER feature。如果feature被协商成功,就可以使用优化过的驱动程序。

在未正式发布的Virtio spec对IN_ORDER的实现有如下要求:

当VIRTIO_F_IN_ORDER协商成功之后,virtio驱动要按照ring的顺序使用描述符,从table 0开始并且在table 结束的位置做回滚。当virtio device添加available ring描述符时, 如果其中一个位置为x的描述符中VRING_DESC_F_NEXT被设置到flag上,描述符中next的值必须为x+1或者是0(如果x是最末位)。如果是使用INDIRECT描述符时,indirect描述符队列中的索引数值也需要连续,从0开始然后按顺序1,2,以此类推。

作为对应的实现,18.08中virtio user pmd中加入了两个新的收发函数:virtio_recv_mergeable_pkts_inorder和virtio_xmit_pkts_inorder。为了配置in order和Rx_mrg这个对virtio pmd Rx/Tx path选择上非常重要的feature, 加入了两个新的virtio vdev参数。一个是mrg_rxbuf 用来配置virtio user device支持VIRTIO_NET_F_MRG_RXBUF feature,默认配置是打开;还有一个是in_order用来配置VIRTIO_F_IN_ORDERfeature,默认配置也是打开。所以现在如果在dpdk生成一个virtio虚拟设备,它的默认参数会是“queues=1,queue_size=256,server=0,mrg_rxbuf=1,in_order=1”。

随着新的收发路径和device参数加入到了virtio user pmd以及对 卸载选项的整理。virtio user pmd的收发路径的选择也发生了变化。

18.05下Virtio RX path的选择逻辑:

如果RX_MRG的feature协商成功, RX会选择merge path。如果virtio pmd rxmode中的hw_ip_chksum打开的话,会选择normal Rx path。其他情况下,Rx会选择simple Rx。

18.05下Virtio Txpath的选择逻辑:

如果RX_MRG的feature协商成功,TX会选择normal xmit path。其他情况下, Tx会选择Simple Tx。

18.08下Virtio RX path的选择逻辑变更为:

如果in_order feature协商成功,同时Rx_MRG feature也被协商成功,Rx会选择in_order Rx。如果Rx_MRG没有协商,并且chksum, LRO, Vlan strip卸载关闭,会选择simple Rx。除此之外都会选择mergable Rx。

18.08下Virtio Tx path的选择逻辑变更为:

如果in_order feature协商成功,Tx会选择 in_order tx,否则会选择normal tx.

IN_ORDER可以简化virtio 驱动的运行逻辑,也可以减少一些无用的数据更新。有些流程如virtio driver填充available ring或者xmit ring时可以采用批量地处理和更新。并且由于前后端都已经约定好描述符的排布是按顺序的,virtio驱动访问描述符时Cache miss的数量也会减少。由于这些优化的引入,可以看到在数据吞吐量较大时,in_order实现可以带来显著的性能提升。

以下是在Intel Purely平台下的测试数据:

Platform: Purely

CPU: Intel(R) Xeon(R) Platinum 8160 CPU @ 2.10GHz

DPDK baseline: 18.05

Setup: testpmd with vhost vdev + testpmd with virtio vdev

原文链接:https://blog.csdn.net/weixin_37097605/article/details/101514594

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

相关文章:

  • java毕业设计软件S2SH人力资源管理系统|人事薪资招聘oa人力请假考勤工资[包运行成功]
  • 关于C/C++中const关键字作用的一些想法
  • STC15单片机-通过PWM调整灯亮度
  • 9.3DDD之集成事件
  • 抖音获取商品原数据API接口展示
  • C++ 删除链表的倒数第N个结点
  • Pinia的使用
  • java — 认识String类的常用方法(上)
  • 高速专线不打烊 DPDK Hotplug助你实现设备动态管理
  • 【数据结构 二叉树 递归与非递归遍历】
  • 微信公众号消息推送教程
  • MiddleWare ❀ Zookeeper基础概述
  • 多任务学习算法在推荐系统中的应用
  • webpack5入门教程
  • Python解决多个服务线程/进程重复运行定时任务的问题
  • 【EOS】Cleos基础
  • LeetCode29.两数相除 JavaScript
  • Making An Indicator With Pure CSS
  • Median of Two Sorted Arrays
  • Object.assign方法不能实现深复制
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue 2.3、2.4 知识点小结
  • vuex 笔记整理
  • vuex 学习笔记 01
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 对JS继承的一点思考
  • 如何学习JavaEE,项目又该如何做?
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​VRRP 虚拟路由冗余协议(华为)
  • # Java NIO(一)FileChannel
  • #define
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (1)常见O(n^2)排序算法解析
  • (5)STL算法之复制
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .bat批处理(一):@echo off
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Reactor简单使用教程
  • .net 按比例显示图片的缩略图
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • ::什么意思
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Autowired和@Resource的区别
  • @RequestMapping 的作用是什么?
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)