本节介绍了 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 节点的具体步骤如下所述:
创建虚拟功能(计算)
将 nova-compute 中的 PCI 设备列入允许列表(计算)
配置 neutron-server(控制器)
配置 nova-scheduler(控制器)
启用 neutron sriov-agent(计算)
创建虚拟功能(计算)
以下是创建虚拟功能的步骤:
确保在 BIOS 中启用了 SR-IOV 和 VT-d。
在 Linux 中启用 IOMMU,方法是向内核参数添加
intel_iommu=on
,例如使用GRUB
。在每个计算节点上,通过 PCI SYS 接口创建 VF:
echo '8' > /sys/class/net/eth3/device/sriov_numvfs
网络接口可用于 PCI 直通(使用 PF)和 SR-IOV(使用 VF)。如果使用 PF,存储在
sriov_numvfs
文件中的 VF 数量将丢失。如果 PF 再次连接到操作系统,则分配给此接口的 VF 数量将为零。要始终保持分配给此接口的 VF 数量,请通过添加ifup
脚本命令来修改接口配置文件。PF 可以支持的最大 VF 数量:
cat /sys/class/net/eth3/device/sriov_totalvfs63
在 Ubuntu 中,修改 /etc/network/interfaces 文件,如下所示:
auto eth3 iface eth3 inet dhcp pre-up echo '4' > /sys/class/net/eth3/device/sriov_numvfs
在 Red Hat 中,修改 /sbin/ifup-local 文件,如下所示:
#!/bin/sh if [[ "$1" == "eth3" ]] then echo '4' > /sys/class/net/eth3/device/sriov_numvfs fi
验证是否已创建 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)
重新引导时保留创建的 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
=openvswitch
、sriovnicswitch
重新启动
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 端口启动实例
获取网络 ID 以创建 SR-IOV(在本例中,已经创建了网络提供程序 1,并且可将其用于 SE 的管理和数据)。
net_id=neutron net-show provider1 | grep "\ id\ " | awk '{ print $4 }'
创建 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 }'
端口的 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 | +-------------------------+--------------------------------------------------------------------------------+
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 | +-------------------------------+-------------------------------------------------------------------------+
OpenStack 控制器将在无权访问模式下启动,并将
se.qcow2
映像推送到 Glance(如“将 NSX Advanced Load Balancer 安装到无权访问 OpenStack 云中”的步骤 3 中所述)使用
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
运行 /opt/avi/init_system.py 脚本并确保 SE 可以连接到控制器(如“将 NSX Advanced Load Balancer 安装到无权访问 OpenStack 云中”的步骤 15 中所述)。
确保 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)
要使 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,才能使更改生效。