首页 > 解决方案 > DPDK l2fwd 在 KVM 中具有多个 RX/TX 队列

问题描述

我想在 KVM (Guest: CentOS) 中尝试多个 RX/TX 队列。我已经编译了 DPDK(版本:18.05.1)并插入了 igb_uio 驱动程序(绑定了两个接口)。

我正在尝试客户端到服务器的连接(私有)。

客户端 (eth1: 10.10.10.2/24) <--> (eth1) CentOS VM (DPDK: 18.05.1) (eth2) <--> 服务器 (eth1: 10.10.10.10/24)

VM 在直通模式下直接管理这两个接口(macvtap - passthrough)。

<interface type='direct' trustGuestRxFilters='yes'>
<source dev='ens1' mode='passthrough'/>
<model type='virtio'/>
<driver name='vhost' queues='2'/>
</interface>

当 l2fwd 应用程序以单个 RX 和 TX 队列(默认更改)和无 MAC 更新启动时。客户端和服务器连接完美。

我进行了一些更改以使用 l2fwd 应用程序尝试多个 RX/TX 队列。我可以看到 ARP 在任何一端都没有得到解决。VM 之后没有收到任何数据包。

有人可以将我指向文档以使用多个 RX/TX 队列来验证我的更改吗?多个 RX/TX 队列是否在 VM 环境中工作?我看到其他人也抱怨它。

我是 DPDK 世界的新手。任何帮助都会很有用。谢谢你。

已编辑(添加更多详细信息): 我在 l2fwd 示例中配置具有 1 个 RX 队列和 2 个 TX 队列的以太网设备。

uint16_t q = 0;
uint16_t no_of_tx_queues = 2;

// Configuring Ethernet Device
rte_eth_dev_configure(portid, 1, no_of_tx_queues, &local_port_conf);

// Configuring Rx Queue
ret = rte_eth_rx_queue_setup(portid, 0, nb_rxd, rte_eth_dev_socket_id(portid), &rxq_conf, l2fwd_pktmbuf_pool);

// Configuring 2 TX Queue
for(q = 0; q < no_of_tx_queues; q++) {
    ret = rte_eth_tx_queue_setup(portid, q, nb_txd, rte_eth_dev_socket_id(portid), &txq_conf);
}

我正在从单个 RX 队列中读取数据包:Queue-id: 0(如前面的设置)。

nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, MAX_PKT_BURST);

我看到一些数据包正在到来并转发到其他接口,但有些不是。对于 ICMP(ping),我可以看到 ARP 已转发,但 l2fwd 未读取 ICMP 回显请求。

我发现的解决方案: 我在 l2fwd 中配置了 2 个 RX 和 2 个 TX 队列。我可以从第二个 RX 队列(队列 ID:1)读取 ICMP 请求并转发。这样,客户端到服务器的连接按预期工作。

这里的问题是: 即使我已经配置了 1 个 RX 队列和 2 个 TX 队列。为什么很少有数据包出现在 Queue-id: 1(未配置且未由 l2fwd 应用程序读取)。在 KVM(在 CentOS 上运行)环境中观察到。我在 ESXI 上也检查过,我可以看到所有数据包都是从单个队列(队列 ID:0)读取并转发的。

为什么??请解释。有什么办法可以关闭 KVM 中的负载平衡(在两个 RX 队列上传输的数据包),以便我可以接收单个队列上的所有数据包?

标签: networkingqemukvmdpdk

解决方案


这是 DPDK 的 Vhost 多队列测试计划,其中使用了所有命令行参数: https ://doc.dpdk.org/dts/test_plans/vhost_multi_queue_qemu_test_plan.html

问题中没有太多细节,所以我唯一的建议是确保多个队列首先工作,然后l2fwd在其之上运行。如果来宾操作系统不能与多个队列一起工作,DPDK 将无法解决该问题。


推荐阅读