SR-IOV 機能を使用する

SR-IOV 機能を使用する

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

基本

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

Ethernet を用いた SR-IOV

このドキュメントでは以下の用語を使用します。

用語

定義

PF

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

VF

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

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

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

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

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

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

  5. neutron sriov-agent を有効にする (コンピュートノード)

Neutron sriov-agent

SR-IOV の設定としては 2 つの方法があります。

  1. 各コンピュートノードで sriov-agent を動かす

  2. コンピュートノードで sriov-agent を動かさない

sriov-agent は、ポートの admin state (管理状態) の設定を行います。 Liberty 以降では port security (spoofing チェックを有効にするかどうか) と QoS レート制限の設定も行います。

注釈

sriov-agent を動かす方法が Liberty でのデフォルトです。 sriov-agent を動かさない方法は Liberty では廃止予定になっており、Mitaka で削除されます。

既知の制限

  • QoS 機能は Liberty 以降でサポートされていますが、制限事項があります。 max_burst_kbps (max_kbps のバーストサイズ) には対応していません。 max_kbps は Mbps に丸められます。

  • セキュリティーグループはサポートされていません。エージェントは firewall_driver = neutron.agent.firewall.NoopFirewallDriver でのみ動作します。

  • OpenStack Dashboard によるサポートはありません。ユーザーは CLI か API を使って neutron SR-IOV ポートを作成する必要があります。

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

    注釈

    sriov-agent 使用時の ARP spoofing フィルタリングは Liberty 以降でサポートされています。

利用環境の例

Open vSwitch を使用し、ネットワーク分離方法は VLAN を推奨します。これにより、 SR-IOV ポートを持たない通常の VM と SR-IOV ポートを持つインスタンスを 1 つの neutron ネットワークで共存させることができます。

注釈

このガイドでは、 PF として eth3 を使用し、physnet2 が VLAN として設定されたプロバイダーネットワークとして使用します。実際の環境に応じて、これらを変更してください。

Virtual Function を作成する (コンピュートノード)

この手順では、 SR-IOV 用に使用するネットワークインターフェース用の VF を作成します。 eth3 を PF として使用します。 eth3 は Open vSwitch VLAN のインターフェースとしても使用され、 eth3 はすべてのマシンのプライベートネットワークにアクセスできます。

VF を作成する手順は SR-IOV カードの Ethernet コントローラーベンダーにより異なります。現在のところ、以下のベンダーの動作が確認されています。

  • Intel
  • Mellanox
  • QLogic

Mellanox SR-IOV Ethernet カード については、Mellanox: HowTo Configure SR-IOV VFs を参照してください。

Ubuntu 上で Intel SR-IOV Ethernet カード で VF を作成するには、以下のようにします。

  1. SR-IOV を BIOS で有効にします。また、 VT-d が利用できるか確認し、VT-d を有効にします。VT-d を有効にした後で、カーネルパラメーターに intel_iommu=on を追加し、 Linux で IOMMU を有効にします。ファイル /etc/default/grub を編集します。

    GRUB_CMDLINE_LINUX_DEFAULT="nomdmonddf nomdmonisw intel_iommu=on
    
  2. 新しいパラメーターを追加したら、以下を実行します。

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

    # echo '7' > /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
    

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

    # ip link set eth3 up
    # 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
    
  4. ここで VF が作成されたかを確認します (Virtual Function デバイスのところを見てください)。

    # lspci | grep Ethernet
    
  5. 再起動時にも作成 VF が保持されるようにします。

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

    注釈

    PCI SYS 設定を持続させる推奨の方法は sysfs.conf`を使うことですが、理由は分かりませんが Ubuntu 14.04 では  :file:`sysfs.conf を変更しても何の効果もありません。

QLogic SR-IOV Ethernet カード については、 User’s Guide OpenStack Deployment with SR-IOV Configuration を参照してください。

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

nova-compute にどの PCI デバイスでパススルーを許可するかを指示します。 /etc/nova/nova.conf を編集します。

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

この設定では、 eth3 に所属するすべての VF で VM へのパススルーを許可し、neutron のプロバイダーネットワーク physnet2 に所属すると、 nova-compute に伝えています。 nova compute を service nova-compute restart で再起動し、変更を反映します。

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

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

    pci_passthrough_whitelist = { "address": "[[[[<domain>]:]<bus>]:][<slot>][.[<function>]]", "physical_network": "physnet2" }
    
    # Example match any domain, bus 0a, slot 00, all function
    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 アドレスやデバイス名で定義されたデバイスが SR-IOV PF に対応する場合には、その PF 配下のすべての VF がこのエントリーにマッチします。 1 つのホストで複数の passthrough_whitelist エントリーを指定することもできます。

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

  1. sriovnicswitch をメカニズムドライバーとして追加します。ファイル /etc/neutron/plugins/ml2/ml2_conf.ini を編集します。

    mechanism_drivers = openvswitch,sriovnicswitch
    
  2. VF を作成しておいたコンピュートノードにログインし、作成した VFvendor_idproduct_id を特定します。

    # lspci -nn | grep -i ethernet
    87:00.0 Ethernet controller [0200]: Intel Corporation 82599 10 Gigabit Dual Port Backplane Connection [8086:10f8] (rev 01)
    87:10.1 Ethernet controller [0200]: Intel Corporation 82599 Ethernet Controller Virtual Function [8086:10ed] (rev 01)
    87:10.3 Ethernet controller [0200]: Intel Corporation 82599 Ethernet Controller Virtual Function [8086:10ed] (rev 01)
    
  3. 各コントローラーで /etc/neutron/plugins/ml2/ml2_conf_sriov.ini を更新します。この例の場合、 vendor_id は 8086 で、 product_id は 10ed です。Neutron にサポートする VF の vendor_id と product_id を教えます。

    supported_pci_vendor_devs = 8086:10ed
    
  4. 新しく設定した ml2_conf_sriov.ini を neutron-server デーモンのパラメーターとして追加します。ファイル /etc/init/neutron-server.conf を編集します。

    --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini
    --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
    
  5. 変更を反映させるため、 service neutron-server restart を実行して neutron-server サービスを再起動します。

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

  1. nova-scheduler を実行しているすべてnコントローラーノードで、 scheduler_default_filters に PCIDeviceScheduler を追加します。また、 /etc/nova/nova.conf の [default] セクションの scheduler_available_filters パラメーターに新しい行を追加します。

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

neutron sriov-agent を有効にする (コンピュートノード)

注釈

sriov-agent を有効にする必要があるのは neutron-server の設定を行う (コントローラーノード) の手順で agent_required=True``をそのままにした場合にだけです。 ``agent_required=False に設定した場合は、この手順をスキップできます。

  1. 各コンピュートノードで /etc/neutron/plugins/ml2/ml2_conf_sriov.ini ファイルを編集します。

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

    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
    
  2. sriov-agent が正常に実行できるかを確認します。

    # neutron-sriov-nic-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
    
  3. システム起動時に neutron-sriov-agent が自動的に開始するようにします。お使いのディストリビューションで init システム用のデーモンファイルが提供されていない場合は、デーモンの設定ファイルを作成します。例えば、 Ubuntu では、このパッケージをインストールします。

    # apt-get install neutron-plugin-sriov-agent
    

SR-IOV ポートを持つインスタンスを作成する

設定が終わったら、 neutron SR-IOV ポートを持つインスタンスを起動できます。

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

    $ net_id=`neutron net-show net04 | grep "\ id\ " | awk '{ print $4 }'`
    
  2. SR-IOV ポートを作成します。 vnic_type direct を指定していますが、 macvtap を指定することもできます。

    $ port_id=`neutron port-create $net_id --name sriov_port --binding:vnic_type direct | grep "\ id\ " | awk '{ print $4 }'`
    
  3. VM を作成します。ステップ 2 で作成した SR-IOV ポートを NIC として指定します。

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

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
    
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.