このセクションでは、OpenStack のアクセス権なしモード(SE の DPDK)での NSX Advanced Load Balancer の構成の側面と、パフォーマンスを向上するために OpenStack からの SR-IOV と VLAN を使用する方法について説明します。

SR-IOV 仕様は、PCIe デバイスを仮想化するための標準化されたメカニズムを定義します。このメカニズムは、単一の PCIe イーサネット Controller を仮想化して、複数の PCIe デバイスとして表示できます。各デバイスは、ハイパーバイザーおよび仮想スイッチ レイヤーをバイパスして、インスタンスに直接割り当てることができます。その結果、低遅延とニアライン ワイヤ速度を実現できます。

  • 物理機能 (PF):SR-IOV をサポートする物理イーサネット Controller。

  • 仮想機能 (VF):物理イーサネット Controller から作成された仮想 PCIe デバイス。

このセクションでは、次の NIC をサポートする ixgbe-vf ドライバの手順の概要を説明します。

  • 82599

  • X520

  • X540

  • X550

  • X552

OpenStack での制限は次のとおりです。

  • SR-IOV ポートを作成する場合は、Horizon を使用しないでください。

  • SR-IOV は、OpenStack ダッシュボード (Horizon) に統合されません。SR-IOV インターフェイスを構成するには、CLI または API を使用する必要があります。

  • 既存のサーバへの SR-IOV ポートの接続は、現在サポートされていません。この場合、NSX Advanced Load Balancer クラウド タイプは OpenStack アクセス権なしです。

SR-IOV の有効化

同等の OpenStack ノードの具体的な手順は次のとおりです。

  1. 仮想機能の作成(コンピューティング)

  2. nova-compute(コンピューティング)の許可リスト PCI デバイス

  3. neutron-server (Controller) の構成

  4. nova-scheduler (Controller) の構成

  5. neutron sriov-agent(コンピューティング)の有効化

仮想機能の作成(コンピューティング)

仮想機能を作成するには、次の手順を実行します。

  1. BIOS で SR-IOV と VT-d が有効になっていることを確認します。

  2. たとえば、GRUB を使用してカーネル パラメータに intel_iommu=on を追加して、Linux で IOMMU を有効にします。

  3. 各コンピューティング ノードで、PCI SYS インターフェイスを介して VF を作成します。

    echo '8' > /sys/class/net/eth3/device/sriov_numvfs
  4. ネットワーク インターフェイスは、PF を使用した PCI パススルーと、VF を使用した SR-IOV の両方に使用できます。PF を使用すると、sriov_numvfs ファイルに格納されている VF 番号は失われます。PF がオペレーティング システムに再度接続されている場合、このインターフェイスに割り当てられた VF の数はゼロになります。このインターフェイスに常に割り当てられている VF の数を維持するには、ifup スクリプト コマンドを追加してインターフェイス構成ファイルを変更します。

  5. 1 つの 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 (Controller) の構成

sriovnicswitch をメカニズム ドライバとして追加します。

/etc/neutron/plugins/ml2/ml2_conf.ini ファイルを変更します。

  • mechanism_drivers = openvswitchsriovnicswitch

  • neutron-server サービスの再起動

nova-scheduler (Controller) の構成

/etc/nova/nova.conf ファイルのデフォルト セクションで、次のように変更します。

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. SR-IOV を作成するためのネットワーク ID を取得します(この場合は、すでに作成され、SE の管理およびデータに使用されている network provider1 があります)。

    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 Controller がアクセス権なしモードで起動され、se.qcow2イメージが Glance にプッシュされます(「アクセス権なしの OpenStack クラウドへの NSX Advanced Load Balancer への OpenStack のインストール」の手順 3 に示すとおり)。

  6. 次のように、se.qcow2 イメージを使用して、2 つの NIC(データと管理)を持つインスタンスを作成します(「アクセス権なしの OpenStack クラウドへの NSX Advanced Load Balancer のインストール」の手順 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 が Controller に接続できることを確認します(「アクセス権なしの OpenStack クラウドへの NSX Advanced Load Balancer OpenStack のインストール」の手順 15 に示すとおり)。

  8. SE データ vNIC(SE へのログイン)が、VIRTIO インターフェイスではなく SR-IOV VF として起動していることを確認します。

     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 を実行するには、Controller シェルにログインします(『VMware NSX Advanced Load Balancer 管理ガイド』の「コントローラ CLI へのアクセス」セクション」を参照してください)。また、SE グループのプロパティ(これは、その SE グループのすべての SE に影響します)で、次の変更を行って、NIC が DPDK モードで稼動するように変更します。

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

    変更を有効にするには、SE を再起動する必要があります。