本节介绍了 NSX Advanced Load Balancer 在 OpenStack 无权访问模式(SE 的 DPDK)下的配置方面以及如何使用 OpenStack 中的 SR-IOV 和 VLAN 实现更好的性能。

SR-IOV 规范定义了虚拟化 PCIe 设备的标准化机制。该机制可将单个 PCIe 以太网控制器虚拟化为多个 PCIe 设备。每个设备都会直接分配给一个实例,从而绕过 Hypervisor 和虚拟交换机层。因此,您可以实现低延迟和近线线速。

  • PF-物理功能:支持 SR-IOV 的物理以太网控制器。

  • VF-虚拟功能:从物理以太网控制器创建的虚拟 PCIe 设备。

本节概述了针对支持以下网卡的 ixgbe-vf 驱动程序的步骤:

  • 82599

  • X520

  • X540

  • X550

  • X552

以下是 OpenStack 中的限制:

  • 要创建 SR-IOV 端口,不得使用 Horizon。

  • SR-IOV 未集成到 OpenStack 仪表板 (Horizon) 中。必须使用 CLI 或 API 来配置 SR-IOV 接口。

  • 当前不支持将 SR-IOV 端口连接到现有服务器。在这种情况下,NSX Advanced Load Balancer 云类型为 OpenStack 无权访问。

启用 SR-IOV

针对等效 OpenStack 节点的具体步骤如下所述:

  1. 创建虚拟功能(计算)

  2. 将 nova-compute 中的 PCI 设备列入允许列表(计算)

  3. 配置 neutron-server(控制器)

  4. 配置 nova-scheduler(控制器)

  5. 启用 neutron sriov-agent(计算)

创建虚拟功能(计算)

以下是创建虚拟功能的步骤:

  1. 确保在 BIOS 中启用了 SR-IOV 和 VT-d。

  2. 在 Linux 中启用 IOMMU,方法是向内核参数添加 intel_iommu=on,例如使用 GRUB

  3. 在每个计算节点上,通过 PCI SYS 接口创建 VF:

    echo '8' > /sys/class/net/eth3/device/sriov_numvfs
  4. 网络接口可用于 PCI 直通(使用 PF)和 SR-IOV(使用 VF)。如果使用 PF,存储在 sriov_numvfs 文件中的 VF 数量将丢失。如果 PF 再次连接到操作系统,则分配给此接口的 VF 数量将为零。要始终保持分配给此接口的 VF 数量,请通过添加 ifup 脚本命令来修改接口配置文件。

  5. PF 可以支持的最大 VF 数量:

    cat /sys/class/net/eth3/device/sriov_totalvfs63
  6. 在 Ubuntu 中,修改 /etc/network/interfaces 文件,如下所示:

     auto eth3
     iface eth3 inet dhcp
     pre-up echo '4' > /sys/class/net/eth3/device/sriov_numvfs    
  7. 在 Red Hat 中,修改 /sbin/ifup-local 文件,如下所示:

    #!/bin/sh
     if [[ "$1" == "eth3" ]]
     then
     echo '4' > /sys/class/net/eth3/device/sriov_numvfs
     fi    
  8. 验证是否已创建 VF:

    root@sriov:~# lspci | grep "Ethernet"
     03:10.1 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:10.3 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:10.5 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:10.7 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:11.1 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:11.3 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:11.5 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     03:11.7 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
  9. 重新引导时保留创建的 VF:

    echo "echo '7' > /sys/class/net/eth3/device/sriov_numvfs" >> /etc/rc.local

将 PCI 设备 nova-compute 列入允许列表(计算)

/etc/nova/nova.conf 文件中进行如下更改:

pci_passthrough_whitelist = { "devname": "ens1f1", "physical_network": "provider"}

这将通知计算服务属于 ens1f1 的所有 VF 都可以直通到实例并属于网络提供程序。

配置 neutron-server(控制器)

添加 sriovnicswitch 作为机制驱动程序。

/etc/neutron/plugins/ml2/ml2_conf.ini 文件中进行更改。

  • mechanism_drivers = openvswitchsriovnicswitch

  • 重新启动 neutron-server 服务

配置 nova-scheduler(控制器)

/etc/nova/nova.conf 文件中的 default 部分下进行更改。

scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter
scheduler_available_filters = nova.scheduler.filters.all_filters 

启用 Neutron sriov-agent(计算)

/etc/neutron/plugins/ml2/sriov_agent.ini 文件中进行更改。

[sriov_nic]
physical_device_mappings = provider:ens1f1
exclude_devices = [securitygroup]
firewall_driver = neutron.agent.firewall.NoopFirewallDriver 

使用 SR-IOV 端口启动实例

  1. 获取网络 ID 以创建 SR-IOV(在本例中,已经创建了网络提供程序 1,并且可将其用于 SE 的管理和数据)。

    net_id=neutron net-show provider1 | grep "\ id\ " | awk '{ print $4 }'
  2. 创建 SR-IOV,此处使用 port. vnic_type=direct

    port_id=neutron port-create $net_id --name sriov_port_1 --binding:vnic_type direct | grep "\ id\ " | awk '{ print $4 }'
    
    port_id=neutron port-create $net_id --name sriov_port_2 --binding:vnic_type direct | grep "\ id\ " | awk '{ print $4 }'
  3. 端口的 Port-Show 指示已创建了相应的端口作为 SR-IOV 端口:

    root@sriov:~# neutron port-show 3d6ef025-77ae-4136-a8b6-c48955fe5d2f

    +-------------------------+---------------------------------------------------------------------------------+
     | Field                   | Value                                                    |
     +-------------------------+---------------------------------------------------------------------------------+
     | admin_state_up          | True                                                     |
     | allowed_address_pairs   |                                                          |
     | binding:host_id         | sriov                                                    |
     | binding:profile         | {"pci_slot": "0000:03:10.7", "physical_network": "provider",                                            "pci_vendor_info": "8086:1515"}                          |
     | binding:vif_details     | {"port_filter": false, "vlan": "0"}                      |
     | binding:vif_type        | hw_veb                                                   |
     | binding:vnic_type       | direct                                                   |
     | created_at              | 2019-04-05T04:32:15Z                                     |
     | description             |                                                          |
     | device_id               | 6cf94dd4-c6f3-4d49-84bd-639f40ed1b5e                     |
     | device_owner            | compute:nova                                             |
     | extra_dhcp_opts         |                                                          |
     | fixed_ips               | {"subnet_id": "03e68028-ecec-4fb4-9c03-546ed14bf3c4", "ip_address":                                     "10.140.81.217"}                                         |
     | id                      | 3d6ef025-77ae-4136-a8b6-c48955fe5d2f                     |
     | mac_address             | fa:16:3e:af:d1:f6                                        |
     | name                    | sriov_port_2                                             |
     | network_id              | c4260d3e-f275-4097-96be-03751495f291                     |
     | port_security_enabled   | True                                                     |
     | project_id              | dbe81cf9baa8492288456cbb295a529e                         |
     | revision_number         | 18                                                       |
     | security_groups         | 643c4bb8-7236-47ec-a91d-9038be4774cb                     |
     | status                  | ACTIVE                                                   |
     | tags                    |                                                          |
     | tenant_id               | dbe81cf9baa8492288456cbb295a529e                         |
     | updated_at              | 2019-04-05T04:39:02Z                                     |
     +-------------------------+--------------------------------------------------------------------------------+
     
  4. root@sriov:~# neutron port-show a9fe3f1a-2e1c-4c3f-9fa0-1c03ab29d2c0

    +-------------------------------+--------------------------------------------------------------------------+
     | Field                         | Value                                              |
     +-------------------------------+--------------------------------------------------------------------------+
     | admin_state_up                | True                                               |
     | allowed_address_pairs         |                                                    |
     | binding:host_id               | sriov                                              |
     | binding:profile               | {"pci_slot": "0000:03:11.1", "physical_network": "provider",                                              "pci_vendor_info": "8086:1515"}                  |
     | binding:vif_details           | {"port_filter": false, "vlan": "0"}                |
     | binding:vif_type              | hw_veb                                             |
     | binding:vnic_type             | direct                                             |
     | created_at                    | 2019-04-05T04:32:06Z                               |
     | description                   |                                                    |
     | device_id                     | 6cf94dd4-c6f3-4d49-84bd-639f40ed1b5e               |
     | device_owner                  | compute:nova                                       |
     | extra_dhcp_opts               |                                                    |
     | fixed_ips                     | {"subnet_id": "03e68028-ecec-4fb4-9c03-546ed14bf3c4", "ip_address":                                       "10.140.81.213"}                                 |
     | id                            | a9fe3f1a-2e1c-4c3f-9fa0-1c03ab29d2c0               |
     | mac_address                   | fa:16:3e:db:61:0a                                  |
     | name                          | sriov_port_1                                       |
     | network_id                    | c4260d3e-f275-4097-96be-03751495f291               |
     | port_security_enabled         | True                                               |
     | project_id                    | dbe81cf9baa8492288456cbb295a529e                   |
     | revision_number               | 19                                                 |
     | security_groups               | 643c4bb8-7236-47ec-a91d-9038be4774cb               |
     | status                        | ACTIVE                                             |
     | tags                          |                                                    |
     | tenant_id                     | dbe81cf9baa8492288456cbb295a529e                   |
     | updated_at                    | 2019-04-05T04:39:02Z                               |
     +-------------------------------+-------------------------------------------------------------------------+
  5. OpenStack 控制器将在无权访问模式下启动,并将 se.qcow2 映像推送到 Glance(如“将 NSX Advanced Load Balancer 安装到无权访问 OpenStack 云中”的步骤 3 中所述)

  6. 使用 se.qcow2 映像创建具有两个网卡(数据和管理)的实例(如“将 NSX Advanced Load Balancer 安装到无权访问 OpenStack 云中”的步骤 4 中所述),如下所示:

    openstack server create --flavor m1.se --image AVi-se-18.2.2-9224 --port a9fe3f1a-2e1c-4c3f-9fa0-1c03ab29d2c0 --port 3d6ef025-77ae-4136-a8b6-c48955fe5d2f test-sriov
  7. 运行 /opt/avi/init_system.py 脚本并确保 SE 可以连接到控制器(如“将 NSX Advanced Load Balancer 安装到无权访问 OpenStack 云中”的步骤 15 中所述)。

  8. 确保 SE 数据 vNIC(登录到 SE)已作为 SR-IOV VF 启动,而不是作为 VIRTIO 接口启动。

     root@10-140-81-213:~# lspci | grep "Ethernet"
     00:04.0 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)
     00:05.0 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01)   
  9. 要使 SE 数据 vNIC 端口在 SR-IOV 端口上运行 DPDK,请登录到控制器 Shell(请参阅VMware NSX Advanced Load Balancer 管理指南》中的“访问控制器 CLI”一节),并在 SE 组属性下(这将影响该 SE 组下的所有 SE),通过进行以下更改,使网卡在 DPDK 模式下启动:

    [admin:avi-ctrlr]: serviceenginegroup> se_use_dpdk
    [admin:avi-ctrlr]: serviceenginegroup> se_dpdk_pmd 
    注:

    需要重新引导 SE,才能使更改生效。