virtio-net rx/tx 队列大小的支持

https://blueprints.launchpad.net/nova/+spec/libvirt-virtio-set-queue-sizes

目前的多队列 virtio-net 方法中,网络性能随着 CPU 数量的增加而扩展。持续进行大量工作以提高网络性能(通常是 DPDK 应用程序),以便充分利用每个 vCPU 的全部容量。

问题描述

即使在强大的分区(isolcpus、tuned)到位的情况下,vCPU 也可能被 hypervisor 内核线程抢占。抢占并不频繁,每秒几次,但对于每个 virtio 队列 256 个描述符的情况,仅一次 vCPU 的抢占就可能导致数据包丢失,因为在抢占期间 256 个槽位已被填满:这对于 NFV VM 来说是常见情况,其中每个队列的数据包速率高于 1 Mpps(每秒 100 万个数据包)。

用例

更大的队列大小允许摊销 vCPU 抢占,并避免数据包丢失,这是 NFV 的主要要求之一:零数据包丢失。对于今天的 NFV VM,1k 队列允许在没有任何数据包丢失的情况下实现高性能,因此能够将默认队列大小增加到 1k 将解决今天的问题。使其可配置,由运营商选择,也将有助于解决未来的 NFV 用例(我们现在正从 10Gbps NIC 转向 25Gbps NIC)。

提议的变更

在 QEMU 2.7.0 和 libvirt 2.3.0 中,引入了一个新的可调参数来配置 RX 队列大小。在 QEMU 2.10.0 和 libvirt 3.7.0 中,引入了一个新的可调参数来更新 virtio NIC 的 TX 队列大小。

建议的更改是在“nova.conf”的“libvirt”部分添加新的选项,以更新在主机上启动的 guest XML 的默认值。因此,所有使用 vif 类型模型 virtio 后端为 vhost (VIF_TYPE_BRIDGE, VIF_TYPE_OVS) 或后端为 vhostuser (VIF_TYPE_VHOSTUSER) 的 guest 都将使用这些新值启动。

  • ‘tx_queue_size’

  • ‘rx_queue_size’

对于这两个选项,None 将是默认值,这意味着 libvirt 驱动程序不会在 guest 的域 XML 中包含任何队列大小值。

当前实现允许大小在 256 到 1024 之间,并且该数字应该是 2 的幂。如果未满足先前的约束,将为每个启动的 guest 打印警告消息。

如果更新了值,而 guest 在主机上运行时,只有新启动的 guest 才会利用这些新值。这意味着“旧”运行的 guest 将保留以前的值。

注意:在硬重启和冷迁移期间,有两个特殊情况,guest 的域 XML 会被重新生成,这意味着它们将利用在“nova.conf”中配置的新值。

注意:尝试迁移配置了队列大小的 guest 到不支持此类配置的 libvirt 或 QEMU 版本的 host 将无法工作。迁移过程将回滚,让调度器找到新的 host。

备选方案

运营商可以通过手动更新 guest 的域 XML 来实现这一点。

在 Nova 中,可以通过更新为实例创建的端口的绑定配置文件来配置 tx/rx 队列。但已经注意到 tx/rx 队列选项与 Networking 无关,而是特定于 virtio 框架,因此允许用户更新这些值是不希望的,因为要正确配置它们,硬件应该知道。

在 Nova 中,还可以通过引入 flavor extra-specs 来配置 tx/rx 队列大小,这将为运营商提供限制该功能到特定租户、灵活更新值以及使用 aggregates 管理 host 的能力。能够为不同的 flavor 配置不同的尺寸。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

我们假设配置了新值的计算节点将隔离在特定的 aggregates 中。想要利用该网络改进的用户将使用配置为在这些特定 aggregates 上启动的 flavor。

性能影响

其他部署者影响

运营商必须通过“nova.conf”配置 tx_queue_size 和/或 rx_queue_size,然后将 host 隔离到特定的 host aggregates,并配置与该 aggregate 的属性匹配的 flavor 属性。

或者,运营商可以避免隔离 host。

开发人员影响

升级影响

实现

负责人

主要负责人

Sahid Orentino Ferdjaoui <sahid-ferdjaoui>

工作项

  • 在 nova.conf 中引入新的选项

  • 更新 config xml 以在启动时处理新的选项

依赖项

测试

将添加单元测试以确保在“nova.conf”中更新的 tx_queue_size 和/或 rx_queue_size 的值将被在 host 上启动的 guest 考虑。

文档影响

支持此功能的 VIF 的文档以及在“nova.conf”中引入的 config 选项也应更新。

参考资料

历史

修订版

发布名称

描述

Rocky

引入