SR-IOV

SR-IOV

The purpose of this page is to describe how to enable SR-IOV functionality available in OpenStack (using OpenStack Networking). This functionality was first introduced in the OpenStack Juno release. This page intends to serve as a guide for how to configure OpenStack Networking and OpenStack Compute to create SR-IOV ports.

基本

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 に指定します。

    $ openstack server create --flavor m1.large --image ubuntu_14.04 --nic port-id=$port_id test-sriov
    

    注釈

    There are two ways to attach VFs to an instance. You can create an SR-IOV port or use the pci_alias in the Compute service. For more information about using pci_alias, refer to 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 ポートを持つインスタンスのライブマイグレーションはサポートされていません。

    注釈

    SR-IOV features may require a specific NIC driver version, depending on the vendor. Intel NICs, for example, require ixgbe version 4.4.6 or greater, and ixgbevf version 3.2.2 or greater.

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.