本作品采用知识共享署名 3.0 未移植许可协议授权。

http://creativecommons.org/licenses/by/3.0/legalcode

向 Tripleo 添加 SR-IOV

蓝图 URL

https://blueprints.launchpad.net/tripleo/+spec/tripleo-sriov

SR-IOV 是一种扩展 PCI Express 规范的规范,它允许 PCIe 设备表现为多个独立的物理 PCIe 设备。

SR-IOV 提供一个或多个虚拟功能 (VF) 和一个物理功能 (PF)

  • 虚拟功能 (VF) 是“轻量级”PCIe 功能,包含必要的数据移动资源,但具有经过仔细最小化的配置资源集。

  • 物理功能 (PF) 是完整的 PCIe 功能,包含 SR-IOV 扩展功能。该功能用于配置和管理 SR-IOV 功能。

VF 可以像专用 PCIe 设备一样附加到虚拟机,从而大大提高 SR-IOV 网卡的网络性能。

问题描述

  • 目前,SR-IOV 功能的安装和配置是在 Overcloud 部署后手动完成的。它应该通过 tripleo 实现自动化。

  • 目前,SR-IOV 的硬件能力识别都是手动完成的,并且应该在自检期间实现自动化。硬件检测还为操作员提供配置 Heat 模板所需的数据。

提议的变更

概述

  • Ironic Python Agent 将发现以下硬件详细信息并将其存储在 swift blob 中 -

    • 支持 SR-IOV 的网卡:应读取 /sys/bus/pci/devices/…/sriov_totalvfs 并检查其是否非零,以便确定网卡是否支持 SR-IOV

    • BIOS 中的 VT-d 或 IOMMU 支持:应读取 CPU 标志以识别支持情况。

  • DIB 默认应包含该软件包 - openstack-neutron-sriov-nic-agent。

  • 不具备上述任何功能的节点不能用于具有 SR-IOV 的 COMPUTE 角色

  • SR-IOV 驱动程序应通过持久模块加载脚本在启动时加载。这些持久模块加载脚本应由 Puppet 清单创建。

  • T-H-T 应提供以下详细信息

    • supported_pci_vendor_devs - 配置在运行 neutron-server 的节点中的 vendor-id/product-id 对

    • vf 的最大数量 - 跨重启持久化

    • 物理设备映射 - 在计算节点中添加物理设备映射 ml2_conf_sriov.ini 文件

  • 在运行 Neutron 服务器的节点上,Puppet 应

    • 在 /etc/neutron/plugin.ini 文件中启用 sriovnicswitch mechanism_drivers = openvswitch,sriovnicswitch 此配置在 OpenvSwitch 旁边启用 SR-IOV 机制驱动程序。

    • 在 /etc/neutron/plugin.ini 文件中设置 SR-IOV 的 VLAN 范围,该文件位于网络节点 network_vlan_ranges = <物理网络名称 SR-IOV 接口>:<VLAN 最小值> :<VLAN 最大值> 例如:network_vlan_ranges = fabric0:15:20

    • 如果与 /etc/neutron/plugins/ml2/ml2_conf_sriov.ini 中的“15b3:1004,8086:10ca”不同,则配置 vendor-id/product-id 对 supported_pci_vendor_devs = 15b3:1004,8086:10ca,<vendor-id:product-id>

    • 配置 neutron-server.service 以使用 ml2_conf_sriov.ini 文件 [Service] Type=notify User=neutron ExecStart=/usr/bin/neutron-server –config-file /usr/share/neutron/neutron-dist.conf –config-file /etc/neutron/neutron.conf –config-file /etc/neutron/plugin.ini –config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini –log-file /var/log/neutron/server.log

  • 在运行 nova scheduler 的节点上,Puppet 应

    • 将 PciPassthroughFilter 过滤器添加到 scheduler_default_filters 列表中。这需要完成才能允许正确调度 SR-IOV 设备

  • 在每个 COMPUTE+SRIOV 节点上,Puppet 应配置 /etc/nova/nova.conf

    • 将可用的 VF 与每个物理网络关联起来 例如:pci_passthrough_whitelist={“devname”: “enp5s0f1”, “physical_network”:”fabric0”}

      PCI passthrough 允许列表条目使用以下语法:[“device_id”: “<id>”,] [“product_id”: “<id>”,] [“address”: “[[[[<domain>]:]<bus>]:][<slot>][.[<function>]]” | “devname”: “以太网接口名称”,] “physical_network”:”网络标签字符串”

      需要从代理配置中排除的 VF 应添加到 [sriov_nic]/exclude_devices 中。T-H-T 应配置此项。

      每个主机支持多个允许列表条目。

  • Puppet 应

    • 设置操作员配置的 VF 最大数量 echo required_max_vfs > /sys/bus/pci/devices/…/sriov_numvfs Puppet 还会验证 required_max_vfs,以确保它不超过设备上支持的最大值。

    • 在 ‘/etc/neutron/plugins/ml2/sriov_agent.ini’ 文件中启用 NoopFirewallDriver。

      [securitygroup] firewall_driver = neutron.agent.firewall.NoopFirewallDriver

    • 将映射添加到 /etc/neutron/plugins/ml2/sriov_agent.ini 文件。例如:physical_device_mappings = fabric0:enp4s0f1 在此示例中,fabric0 是物理网络,而 enp4s0f1 是物理功能

  • Puppet 应在 Compute 上启动 SR-IOV 代理

    • systemctl enable neutron-sriov-nic-agent.service

    • systemctl start neutron-sriov-nic-agent.service

替代方案

安全影响

  • 目前我们没有支持 SR-IOV 的防火墙驱动程序。安全组将仅在计算主机的 SR-IOV 端口上禁用。

其他最终用户影响

性能影响

  • SR-IOV 为物理服务器上的每个虚拟机提供接近原生 I/O 性能。参考 - http://goo.gl/HxZvXX

其他部署者影响

  • 操作员应确保 BIOS 支持计算节点上的 VT-d/IOMMU 虚拟化技术。

  • 需要在 Compute+SRIOV 节点中启用 IOMMU。启动参数 (intel_iommu=on 或 amd_iommu=pt) 应使用第一个启动脚本 (THT) 添加到 grub.conf 中。

  • 部署后,操作员应

    • 在创建 VM (nova boot) 之前创建 neutron 端口 neutron port-create fabric0_0 –name sr-iov –binding:vnic-type direct

    • 使用所需的 flavor 和 SR-IOV 端口 ID 创建 VM 例如:nova boot –flavor m1.small –image <image id> –nic port-id=<port id> vnf0

开发人员影响

实现

负责人

主要负责人

  • karthiks

  • sanjayu

工作项

  • 如上述“Proposed changes”中所述

依赖项

测试

  • 由于 SR-IOV 需要特定的硬件支持,因此无法在 CI 下测试此功能。我们需要第三方 CI 来验证它。

文档影响

  • 操作员需要执行的手动步骤应记录下来。例如:配置 VT-d、IOMMU 的 BIOS,以及部署后配置。

参考文献