我想在 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 队列(默认更改)和 no-mac-updating 启动时。客户端和服务器连接完美。
我做了一些更改来尝试使用 l2fwd 应用程序的多个 RX/TX 队列。 我可以看到 ARP 在两端都没有得到解决。之后虚拟机没有收到任何数据包。
有人可以向我指出使用多个 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 已转发,但 l2fwd 未读取 ICMP 回显请求。
我发现的解决方案: 我在 l2fwd 中配置了 2 个 RX 和 2 个 TX 队列。我可以从第二个 RX 队列(队列 ID:1)读取 ICMP 请求并转发。这样,客户端到服务器的连接就可以按预期工作。您无法配置 1 个 RX 和 2 个 TX 队列。您需要配置相同数量的 RX 和 TX 队列(在 KVM 世界中)。
这里的问题是: 即使我配置了 1 个 RX 队列和 2 个 TX 队列。为什么 Queue-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 将无法解决该问题。