networking - 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 队列上传输的数据包),以便我可以接收单个队列上的所有数据包?
解决方案
这是 DPDK 的 Vhost 多队列测试计划,其中使用了所有命令行参数: https ://doc.dpdk.org/dts/test_plans/vhost_multi_queue_qemu_test_plan.html
问题中没有太多细节,所以我唯一的建议是确保多个队列首先工作,然后l2fwd
在其之上运行。如果来宾操作系统不能与多个队列一起工作,DPDK 将无法解决该问题。
推荐阅读
- php - 在 OpenSuse 上使用 Nginx 和 PHP-FPM 提供内联 PHP
- google-cloud-storage - 在 python 客户端中批量删除对象的指数退避
- python - 使用 pexpect 自动化 IP 验证
- .net - 部署到 IIS 时无法运行 CrystalReports
- r - 使用带有“From”变量的 sqldf 时,result_create 出错
- batch-file - 用于复制 txt 文档中列出的文件并保留重复文件的批处理脚本
- python - 尝试使用 datetime 让 Python 程序在特定时间执行任务但它不工作,没有错误输出
- c++ - 通用 lambdas 和二进制大小/代码膨胀
- ios - 无效的 WatchKit 支持 - Xcode 10 - iOS 12
- python - 匹配和删除文件中的字符串