libvirt: virtio-net 多队列

https://blueprints.launchpad.net/nova/+spec/libvirt-virtio-net-multiqueue

此蓝图旨在增强 libvirt 驱动程序以启用 virtio-net 多队列。这将允许客户机实例增加总网络吞吐量。

问题描述

如今的高端服务器拥有更多的处理器,在其上运行的客户机通常具有越来越多的 vCPU。在单个 virtio-net 队列中,客户机协议栈的规模受到限制,因为网络性能不会随着 vCPU 数量的增加而扩展。客户机无法并行传输或检索数据包,因为 virtio-net 只有一个 TX 和 RX 队列。

多队列 virtio-net 在以下情况下提供最大的性能优势

  • 流量数据包相对较大。

  • 客户机同时在许多连接上处于活动状态,流量在客户机之间、客户机到主机或客户机到外部系统之间运行。

  • 队列数量等于 vCPU 数量。这是因为多队列支持优化了 RX 中断亲和性和 TX 队列选择,以便使特定队列专用于特定 vCPU。

虽然 virtio-net 多队列功能提供性能优势,但它有一些限制,因此不应无条件启用

  • 客户机操作系统限制为约 200 个 MSI 向量。每个 NIC 队列都需要一个 MSI 向量,以及任何 virtio 设备或分配的 PCI 设备。定义具有多个 virtio NIC 和 vCPU 的实例可能会导致达到客户机 MSI 限制的可能性。

  • virtio-net 多队列对传入流量效果很好,但偶尔会导致传出流量性能下降。

  • 启用 virtio-net 多队列会增加总网络吞吐量,但同时也会增加 CPU 消耗。

  • 在主机 QEMU 配置中启用 virtio-net 多队列,并不能在客户机操作系统中启用该功能。客户机操作系统管理员需要手动为每个需要此功能的客户机 NIC 启用它,使用 ethtool。

  • 如果主机中启用了多队列,但管理员尚未在客户机操作系统中启用它,MSI 向量仍然会被消耗(浪费)。

  • 如果客户机实例中的 vNIC 数量与 vCPU 数量成比例,则启用多队列功能不太重要。

  • 每个 virtio-net 队列消耗 vhost 驱动程序 64 KB 的内核内存。

用例

客户机实例用户可以受益于更高的网络性能和吞吐量。

项目优先级

提议的变更

为了解决这个问题,管理员应该能够通过禁用某些工作负载的多队列支持来控制并行数据包处理,在这些工作负载中,此功能可能会导致性能下降。

在镜像属性中引入一个新的参数,供用户控制 virtio-net 多队列功能,并能够在需要时禁用它。

hw_vif_multiqueue_enabled=true|false (默认 false)

目前,队列数量将与为实例定义的 vCPU 数量匹配。

注意:virtio-net 多队列应在客户机操作系统中手动启用,使用 ethtool。例如

ethtool -L <NIC> combined #num_of_queues

备选方案

考虑到客户机中有限的 MSI 向量数量,用户可以通过控制多队列功能的使用,创建具有以各种流量速率运行的 vNIC 的实例。

例如,一个 NIC 可能仅用于管理流量,因此不需要启用多队列,而其他 NIC 可能用于高吞吐量流量,并且需要多个队列。

例如:nova boot -nic net_id=<id>,queues=#

但是,目前,对于用户指定每个 vNIC 的队列数量的接口,还没有达成一致意见。

另一种选择是将“queues=#”替换为“throughput=high|medium|low”,这将把队列数量设置为 vCPU 的 100%|50%|1。

需要后续的规范来确定正确的接口。

最后,管理员可以设置 flavor extra_specs 上的允许队列总数。但是,由于队列数量仅影响客户机资源,因此应该由用户控制每个 nic 的数量。

数据模型影响

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

其他部署者影响

开发人员影响

无。

实现

负责人

主要负责人:vromanso@redhat.com

工作项

  • 更新 vif 配置以设置 virtio-net 设备的正确 vCPU 数量

  • 更新 NetworkRequest 对象以添加每个端口的队列数量

依赖项

测试

单元测试 需要 Libvirt >= 1.0.5

文档影响

flavor extra specs 中的新参数以及 nova boot 命令中的新网络端口属性“queues”。还应提及一些有效的用法建议。

参考资料

http://www.linux-kvm.org/page/Multiqueue