DPDK l2fwd,在 KVM 中具有多个 RX/TX 队列



我想在KVM中尝试多个RX/TX队列(来宾:CentOS(。我已经编译了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 - 直通(中管理这两个接口。

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

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

我做了一些更改以使用 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 队列读取数据包:队列 ID:0(如之前设置(。

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

我看到一些数据包正在传入并转发到其他接口,但有些则没有。对于 ICMP (ping(,我可以看到 ARP 被转发,但 ICMP 回显请求没有被 l2fwd 读取。

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

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

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

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

这个问题中没有太多细节,所以我唯一的建议是确保多个队列首先工作,然后在上面运行l2fwd。如果客户机操作系统不适用于多个队列,DPDK 将无法解决此问题。

最新更新