DPDK对于Queue的配置

作者简介: 颜智润,Intel软件工程师,主要从事DPDK开发与虚拟化方面的工作。

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

DPDK 通过全局变量nb_rx_qnb_tx_q标记txq和rxq的数量。该值可通过—rxq和—txq参数传入,也可以在运行过程中修改。DPDK 19.02 增加支持动态修改queue数量,可以通过原有的queue-num-per-vf 参数预分配,也可以使用新feature的特性动态增加。Testpmd 中可以使用configport port_id rxq queue_number调整queue数量。在默认情况下都会有一个最大值的限制。并且调整queue数量后,需要重新配置queue。

使用

方法一:预分配

方法二:动态、运行过程中再申请

配置Queue的主要代码简介

1.配置前,通过rte_eth_dev_info_get() 获取可分配的queue数量以及可以支持的最大可分配queue数量max_rx_queues和 max_tx_queues。

2.如果应用程序未指定rxq txq数量,则以默认值分配,通常为1。值得注意的一点是,VF调整queue数量需要和PF进行协商,在满足一定条件的情况下,才会同意VF调整queue数量的操作。以i40evf为例:默认VF可以使用最大queue为4。理论上来说,该值可以调整到网卡可分配最大的queue数量,但是由于软硬件各方面的限制,在目前来说,该值不可能也不需要无限大。根据目前的需求,后续版本可能会加入对queue数量在一定范围内动态调整的功能。

3.在通常情况下,i40e 驱动会预分配4个queue给VF,并且限定最大queue数量为4。并且默认使用一个queue。此时可以通过重新config来调整queue的数目为1~4之间的值。Kerneldriver已经支持动态调整,并且i40evf最大可以支持到16个queues。

4.配置queue会使用rte_eth_dev_rx_queue_config()和rte_eth_dev_tx_queue_config()在此处会dev->data->rx_queues= rte_zmalloc(“ethdev->rx_queues”, sizeof(dev->data->rx_queues[0])* nb_queues, RTE_CACHE_LINE_SIZE); 分配相应数量的指针指向由驱动分配的queue结构体。在i40e中的结构为i40e_tx_queue和i40e_rx_queue。

5.如果queue数量向下调整(如4->1)会释放多余的3个queue资源。如果queue数量向上调整(如2->3)则会在原有基础上,新分配queue资源。rte_eth_tx_queue_setup()和rte_eth_rx_queue_setup()则调用具体driver的处理函数分配queue资源。

一些相同与不同点

1.在kernel中,i40evf重新分配queue数量通过发送VIRTCHNL_OP_REQUEST_QUEUES 消息给pf来协商queue数量。当pf有能力提供更多数量queue的时候会通过VIRTCHNL_EVENT_RESET_IMPENDING事件通知VF需要执行reset。

2.DPDK中queue-num-per-vf是预分配若干个queue,随后根据用户需求进行使用。动态申请则是和kernel driver基本相同,在运行过程中申请,在动态申请的过程中需要执行对VF的reset操作。

一个简单的测试

在testpmd中可以通过增加—rss-udp 参数来开启rss。此时会利用哈希分桶的原理分发到不同的queue上。停止收发包后可以在testpmd上清楚的看到多个queue的使用情况。


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

登录后才可以评论

SDNLAB君 发表于19-04-04
0