SR-IOV

SR-IOV

このページの目的は、 Juno の時点で (OpenStack Networking 使用時に) OpenStack で利用可能な SR−IOV 機能を有効にする方法を説明することです。このページは、 SR-IOV ポートを作成するために OpenStack Networking と OpenStack Compute をどのように設定すればよいかの手順書として利用できます。

基本

PCI-SGI の Single Root I/O Virtualization and Sharing (SR-IOV) 機能は Juno リリース以降の OpenStack で利用できます。 SR-IOV 規格は、PCIe デバイスを仮想化する標準化された仕組みを定義しています。この仕組みを使うと、 1 つの PCIe Ethernet コントローラーを仮想化して、複数の PCIe デバイスのように見せることができます。各仮想デバイスは、ハイパーバイザーと仮想スイッチの層を経由せずに、直接インスタンスに割り当てることができます。その結果、ユーザーは低遅延とラインレートに近い通信速度を得ることができます。

以下の用語がこのページではたびたび登場します。

用語

定義

PF

Physical Function (物理機能)。SR-IOV に対応した物理 Ethernet コントローラーです。

VF

Virtual Function (仮想機能)。物理 Ethernet コントローラーから作成された仮想 PCIe デバイスです。

SR-IOV エージェント

SR-IOV エージェントは、ポートの admin state (管理状態) の設定、 port security の設定 (なりすましチェックを有効にするかどうか)、 QoS レート制限を行います。 SR-IOV ポートを使用する各コンピュートノードで SR-IOV エージェントを動かす必要があります。

注釈

Mitaka より前では SR-IOV エージェントはオプションで、 Liberty より前ではデフォルトでは有効ではありませんでした。

注釈

port security の制御および QoS レート制限の設定の機能は Liberty で追加されました。

対応している Ethernet コントローラー

以下のベンダーの製品が動作するとされています。

  • Intel
  • Mellanox
  • QLogic

For information on Mellanox SR-IOV Ethernet ConnectX-3/ConnectX-3 Pro cards, see Mellanox: How To Configure SR-IOV VFs.

For information on QLogic SR-IOV Ethernet cards, see User’s Guide OpenStack Deployment with SR-IOV Configuration.

SR-IOV インターフェースを使用する

SR-IOV を有効にするには、以下の手順を行う必要があります。

  1. Virtual Function の作成 (コンピュートノード)

  2. nova-compute での PCI デバイスのホワイトリストの設定 (コンピュートノード)

  3. neutron-server の設定 (コントローラーノード)

  4. nova-scheduler の設定 (コントローラーノード)

  5. neutron sriov-agent の有効化 (コンピュートノード)

推奨のネットワーク分離方法はVLAN プロバイダーネットワークを使用することです。こうすることで、 SR-IOV ポートを持たないインスタンスと SR-IOV ポートを持つインスタンスを 1 つの neutron ネットワークで共存させることができます。

注釈

このページでは、、 PF として eth3 を、 VLAN の範囲が設定されたプロバイダーネットワークとして physnet2 を使用します。これらの値は環境によって変わります。

Virtual Function の作成 (コンピュートノード)

SR-IOV 用に使用予定のネットワークインターフェースで VF を作成します。ここでは eth3 を PF として使用します。 eth3 は VLAN プロバイダーネットワークに接続するインターフェースとしても使用され、すべてのインスタンスのプライベートネットワークにも到達性があります。

注釈

The steps detail how to create VFs using Mellanox ConnectX-4 and newer/Intel SR-IOV Ethernet cards on an Intel system. Steps may differ for different hardware configurations.

  1. BIOS で SR-IOV と VT-d を有効にしてください。

  2. Linux で IOMMU を有効にするには、 GRUB などを使って、カーネルパラメーターに intel_iommu=on を追加します。

  3. 各コンピュートノードで、 PCI SYS インターフェース経由で VF を作成します。

    # echo '8' > /sys/class/net/eth3/device/sriov_numvfs
    

    注釈

    PCI デバイスによっては、 VF の総数を変更する際に Device or resource busy というエラーを出る場合があります。この場合は、まず sriov_numvfs0 に設定し、それから新しい値に設定してください。

    警告

    別の方法として、 お使いのネットワークインターフェースのカーネルモジュールに max_vfs を渡して VF を作成することもできます。 max_vfs パラメーターは廃止予定になっているので、 PCI SYS インターフェースを使うことを推奨します。

    PF がサポートしている VF の最大数は以下で確認できます。

    # cat /sys/class/net/eth3/device/sriov_totalvfs
    63
    
  4. VF が作成され、状態が up になっていることを確認します。

    # lspci | grep Ethernet
    82:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
    82:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
    82:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:10.2 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:10.4 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:10.6 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:11.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:11.2 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:11.4 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    82:11.6 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
    
    # ip link show eth3
    8: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
       link/ether a0:36:9f:8f:3f:b8 brd ff:ff:ff:ff:ff:ff
       vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 1 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 2 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 3 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 4 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 5 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 6 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 7 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
    

    インターフェースが down の場合は、ゲストを起動する前にインターフェースを up に設定してください。 up になっていない場合は、インスタンスの起動に失敗します。

    # ip link set eth3 up
    
  5. 再起動時にも作成 VF が保持されるようにします。

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

    注釈

    PCI SYS 設定を永続化させる推奨の方法は sysfsutils ツールを使用する方法です。しかしながら、多くの主要なディストリビューションではこの方法はデフォルトでは利用できません。

nova-compute の PCI デバイスのホワイトリストを作成する (コンピュートノード)

  1. nova-compute サービスがどの PCI デバイスを使用できるかを設定します。 nova.conf ファイルを編集します。

    [default]
    pci_passthrough_whitelist = { "devname": "eth3", "physical_network": "physnet2"}
    

    この設定では、 eth3 に属するすべての VF をインスタンスにパススルーでき、これらの VF はプロバイダーネットワーク physnet2 に所属することを Compute サービスに指示しています。

    代わりに、 pci_passthrough_whitelist パラメーターを使ったホワイトリストの設定もできます。

    • PCI アドレス: アドレスは lspci と同じ書式を使用します、アスタリスク (*) は任意のものにマッチすることを示します。

      pci_passthrough_whitelist = { "address": "[[[[<domain>]:]<bus>]:][<slot>][.[<function>]]", "physical_network": "physnet2" }
      

      例えば、任意のドメイン、バス 0a、スロット 00 のすべての PCI ファンクションにマッチするようにするには以下のようにします。

      pci_passthrough_whitelist = { "address": "*:0a:00.*", "physical_network": "physnet2" }
      
    • PCI vendor_idproduct_id は Linux のユーティリティー lspci で表示できます。

      pci_passthrough_whitelist = { "vendor_id": "<id>", "product_id": "<id>", "physical_network": "physnet2" }
      

    PCI アドレスや devname で定義されたデバイスが SR-IOV PF に対応している場合、その PF 配下のすべての VF がこのエントリーにマッチします。 1 つのホストで複数の pci_passthrough_whitelist を設定することもできます。

  2. nova-compute サービスを再起動し、変更を反映します。

neutron-server の設定 (コントローラーノード)

  1. sriovnicswitch をメカニズムドライバーとして追加します。各コントローラーで ml2_conf.ini ファイルを編集します。

    mechanism_drivers = openvswitch,sriovnicswitch
    
  2. ml2_conf_sriov.ini ファイルを neutron-server サービスのパラメーターとして追加します。適切な初期化スクリプトを編集して、 neutron-server サービスが SR-IOV 設定ファイルを読みこむように設定します。

    --config-file /etc/neutron/neutron.conf
    --config-file /etc/neutron/plugin.ini
    --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
    
  3. neutron-server サービスを再起動します。

nova-scheduler の設定 (コントローラーノード)

  1. nova-scheduler サービスを実行しているすべてのコントローラーノードで、 scheduler_default_filters パラメーターに PciPassthroughFilter を追加し、デフォルトで PciPassthroughFilter が有効になるようにします。また、 Compute サービスで提供されているすべてのフィルターが有効になるように、 nova.conf[DEFAULT] セクションの scheduler_available_filters パラメーターを all_filters に設定します。

    [DEFAULT]
    scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter
    scheduler_available_filters = nova.scheduler.filters.all_filters
    
  2. nova-scheduler サービスを再起動します。

neutron sriov-agent の有効化 (コンピュートノード)

  1. SR-IOV エージェントをインストールします。

  2. 各コンピュートノードで sriov_agent.ini ファイルを編集します。例:

    [securitygroup]
    firewall_driver = neutron.agent.firewall.NoopFirewallDriver
    
    [sriov_nic]
    physical_device_mappings = physnet2:eth3
    exclude_devices =
    

    注釈

    physical_device_mapping パラメーターには、物理ネットワークと NIC の 1:1 マッピング以外の設定も可能です。これにより、 1 つの物理ネットワークを複数の NIC に割り当てることもできます。例えば、 physnet2eth3eth4 に接続されている場合には、 physnet2:eth3,physnet2:eth4 は有効な設定となります。

    exclude_devices パラメーターは空なので、 eth3 に関連付けられたすべての VF はエージェントが設定できます。特定の VF を除外するには、以下のようにその VF を exclude_devices パラメーターに追加します。

    exclude_devices = eth1:0000:07:00.2;0000:07:00.3,eth2:0000:05:00.1;0000:05:00.2
    
  3. neutron sriov-agent が正常に実行できることを確認します。

    # neutron-sriov-nic-agent \
      --config-file /etc/neutron/neutron.conf \
      --config-file /etc/neutron/plugins/ml2/sriov_agent.ini
    
  4. neutron sriov-agent を有効にします。

    ソースコードからインストールした場合には、 init システム用のデーモンファイルを手動で設定する必要があります。

(オプション) FDB L2 エージェント拡張機能

FDB (Forwarding Database) population は、 OVS エージェントや Linux ブリッジエージェントに対する L2 エージェント拡張機能です。この機能の目的は、通常ポートを使った既存のインスタンス用に FDB テーブルを更新することです。これにより、 SR-IOV インスタンスと通常のインスタンス間での通信が可能になります。 FDB population 拡張機能には、以下のようなユースケースがあります。

  • SR-IOV ポートを持つインスタンスと通常ポートのインスタンスを同じコンピュートノード上に配置する

  • Floating IP アドレスを使用する SR-IOV ポートを持つインスタンスとネットワークノードを同じホストに配置する

この問題の詳しい情報は、 Virtual switching technologies and Linux bridge. を参照してください。

  1. 各コンピュートノードで ovs_agent.ini または linuxbridge_agent.ini を編集します。

    [agent]
    extensions = fdb
    
  2. FDB セクションを追加し、 shared_physical_device_mappings パラメーターを設定します。このパラメーターは、各物理ポートと物理ネットワーク名のマッピングを行います。 1 つの物理ネットワークを複数の物理ポートにマッピングできます。

    [FDB]
    shared_physical_device_mappings = physnet1:p1p1, physnet1:p1p2
    

SR-IOV ポートを持ったインスタンスの起動

設定が完了したら、 SR-IOV ポートを持ったインスタンスを起動できます。

  1. SR-IOV ポートを作成したいネットワークの id を取得します。

    $ net_id=`neutron net-show net04 | grep "\ id\ " | awk '{ print $4 }'`
    
  2. SR-IOV ポートを作成します。ここでは vnic_type=direct を指定していますが、他の有効な値としては normal, direct-physical, macvtap があります。

    $ port_id=`neutron port-create $net_id --name sriov_port --binding:vnic_type direct | grep "\ id\ " | awk '{ print $4 }'`
    
  3. インスタンスを作成します。 2 番目の手順で作成した SR-IOV ポートを NIC に指定します。

    $ nova boot --flavor m1.large --image ubuntu_14.04 --nic port-id=$port_id test-sriov
    

    注釈

    VF をインスタンスに接続する方法は 2 つあります。 SR-IOV ポートを作成する方法と、 Compute サービスの pci_alias を使用する方法です。 pci_alias を使用する方法の詳細は nova-api configuration を参照してください。

InfiniBand を用いた SR-IOV

InfiniBand を使った SR-IOV 対応では、 仮想 PCI デバイス (VF) をゲストに直接マッピングでき、高い性能が得られ、 RDMA (remote direct memory access) などの高度な機能が利用できます。この機能を使用するには、以下を行う必要があります。

  1. InfiniBand が有効になったネットワークアダプターを使用します。

  2. InfiniBand サブネットマネージャーを実行し、 InfiniBand ファブリックを有効にします。

    どの InfiniBand ネットワークでも、そのネットワークが機能するためにはサブネットマネージャーが実行されている必要があります。スイッチなしの 2 台のホストしかない単純なネットワークで、カードどうしが直結されている場合であっても変わりません。カードのリンクがアップするために、サブネットマネージャーは必須です。サブネットマネージャーを複数台にすることもできます。この場合は、いずれか 1 台がマスターとして動作し、それ以外はスレーブとして動作し、マスターのサブネットマネージャーが故障した際に切り替わります。

  3. コンピュートノードに ebrctl ユーティリティーをインストールします。

    /etc/nova/rootwrap.d/* のいずれかのファイルに ebrctl が入っていることを確認します。

    $ grep 'ebrctl' /etc/nova/rootwrap.d/*
    

    ebrctl が rootwrap ファイルのいずれにも含まれていない場合、 /etc/nova/rootwrap.d/compute.filters ファイルの [filters] セクションに以下を追加してください。

    [Filters]
    ebrctl: CommandFilter, ebrctl, root
    

既知の制限

  • Quality of Service (QoS) を使用する場合、 max_burst_kbps (max_kbps に対するバーストサイズ) には対応していません。また、 max_kbps は Mbps に丸められます。

  • SR-IOV を使用する場合、セキュリティーグループはサポートされていません。したがって、ファイアウォールドライバーは無効にする必要があります。この設定は neutron.conf ファイルで行えます。

    [securitygroup]
    firewall_driver = neutron.agent.firewall.NoopFirewallDriver
    
  • OpenStack Dashboard (horizon) は SR-IOV に対応していません。ユーザーは CLI や API を使って SR-IOV インターフェースを設定する必要があります。

  • SR-IOV ポートを持つインスタンスのライブマイグレーションはサポートされていません。

Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.