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

作者简介:刘勇,系统软件测试及开发工程师,主要从事DPDK自动化测试框架的设计与维护、虚拟化数据通道新功能开发等工作。

文章转载自DPDK与SPDK开源社区公众号

众所周知,虚拟队列数据传输的基本流程是——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上https://github.com/oasis-tcs/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的收发路径的选择也发生了变化。

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

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


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/22963.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于19-02-19
0