52

DPDK对于Queue的配置

 5 years ago
source link: https://www.sdnlab.com/23099.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者简介: 颜智润,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。

使用

方法一:预分配

Java
./testpmd -c f -n 4 -w05:00.0,queue-num-per-vf=8 \ --file-prefix=test1 --socket-mem 1024,1024 ---i
1
2
./testpmd-cf-n4-w05:00.0,queue-num-per-vf=8\
--file-prefix=test1--socket-mem1024,1024---i

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

Java
testpmd> port stop all testpmd> port config all rxq 8 testpmd> port config all txq 8 testpmd> port start all
1
2
3
4
testpmd>port stop all
testpmd>port config all rxq8
testpmd>port config all txq8
testpmd>port start all

配置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的使用情况。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK