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 エージェントは、ポートの admin state (管理状態) の設定、 port security の設定 (なりすましチェックを有効にするかどうか)、 QoS レート制限を行います。 SR-IOV ポートを使用する各コンピュートノードで SR-IOV エージェントを動かす必要があります。
注釈
Mitaka より前では SR-IOV エージェントはオプションで、 Liberty より前ではデフォルトでは有効ではありませんでした。
注釈
port security の制御および QoS レート制限の設定の機能は Liberty で追加されました。
以下のベンダーの製品が動作するとされています。
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 を有効にするには、以下の手順を行う必要があります。
推奨のネットワーク分離方法はVLAN プロバイダーネットワークを使用することです。こうすることで、 SR-IOV ポートを持たないインスタンスと SR-IOV ポートを持つインスタンスを 1 つの neutron ネットワークで共存させることができます。
注釈
このページでは、、 PF として eth3
を、 VLAN の範囲が設定されたプロバイダーネットワークとして physnet2
を使用します。これらの値は環境によって変わります。
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.
BIOS で SR-IOV と VT-d を有効にしてください。
Linux で IOMMU を有効にするには、 GRUB などを使って、カーネルパラメーターに intel_iommu=on
を追加します。
各コンピュートノードで、 PCI SYS インターフェース経由で VF を作成します。
# echo '8' > /sys/class/net/eth3/device/sriov_numvfs
注釈
PCI デバイスによっては、 VF の総数を変更する際に Device or resource busy
というエラーを出る場合があります。この場合は、まず sriov_numvfs
を 0
に設定し、それから新しい値に設定してください。
警告
別の方法として、 お使いのネットワークインターフェースのカーネルモジュールに max_vfs
を渡して VF を作成することもできます。 max_vfs
パラメーターは廃止予定になっているので、 PCI SYS インターフェースを使うことを推奨します。
PF がサポートしている VF の最大数は以下で確認できます。
# cat /sys/class/net/eth3/device/sriov_totalvfs
63
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
再起動時にも作成 VF が保持されるようにします。
# echo "echo '7' > /sys/class/net/eth3/device/sriov_numvfs" >> /etc/rc.local
注釈
PCI SYS 設定を永続化させる推奨の方法は sysfsutils
ツールを使用する方法です。しかしながら、多くの主要なディストリビューションではこの方法はデフォルトでは利用できません。
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_id
と product_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
を設定することもできます。
nova-compute
サービスを再起動し、変更を反映します。
sriovnicswitch
をメカニズムドライバーとして追加します。各コントローラーで ml2_conf.ini
ファイルを編集します。
mechanism_drivers = openvswitch,sriovnicswitch
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
neutron-server
サービスを再起動します。
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
nova-scheduler
サービスを再起動します。
SR-IOV エージェントをインストールします。
各コンピュートノードで 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 に割り当てることもできます。例えば、 physnet2
が eth3
と eth4
に接続されている場合には、 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
neutron sriov-agent が正常に実行できることを確認します。
# neutron-sriov-nic-agent \
--config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/sriov_agent.ini
neutron sriov-agent を有効にします。
ソースコードからインストールした場合には、 init システム用のデーモンファイルを手動で設定する必要があります。
FDB (Forwarding Database) population は、 OVS エージェントや Linux ブリッジエージェントに対する L2 エージェント拡張機能です。この機能の目的は、通常ポートを使った既存のインスタンス用に FDB テーブルを更新することです。これにより、 SR-IOV インスタンスと通常のインスタンス間での通信が可能になります。 FDB population 拡張機能には、以下のようなユースケースがあります。
この問題の詳しい情報は、 Virtual switching technologies and Linux bridge. を参照してください。
各コンピュートノードで ovs_agent.ini
または linuxbridge_agent.ini
を編集します。
[agent]
extensions = fdb
FDB セクションを追加し、 shared_physical_device_mappings
パラメーターを設定します。このパラメーターは、各物理ポートと物理ネットワーク名のマッピングを行います。 1 つの物理ネットワークを複数の物理ポートにマッピングできます。
[FDB]
shared_physical_device_mappings = physnet1:p1p1, physnet1:p1p2
設定が完了したら、 SR-IOV ポートを持ったインスタンスを起動できます。
SR-IOV ポートを作成したいネットワークの id
を取得します。
$ net_id=`neutron net-show net04 | grep "\ id\ " | awk '{ print $4 }'`
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 }'`
インスタンスを作成します。 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 対応では、 仮想 PCI デバイス (VF) をゲストに直接マッピングでき、高い性能が得られ、 RDMA (remote direct memory access) などの高度な機能が利用できます。この機能を使用するには、以下を行う必要があります。
InfiniBand が有効になったネットワークアダプターを使用します。
InfiniBand サブネットマネージャーを実行し、 InfiniBand ファブリックを有効にします。
どの InfiniBand ネットワークでも、そのネットワークが機能するためにはサブネットマネージャーが実行されている必要があります。スイッチなしの 2 台のホストしかない単純なネットワークで、カードどうしが直結されている場合であっても変わりません。カードのリンクがアップするために、サブネットマネージャーは必須です。サブネットマネージャーを複数台にすることもできます。この場合は、いずれか 1 台がマスターとして動作し、それ以外はスレーブとして動作し、マスターのサブネットマネージャーが故障した際に切り替わります。
コンピュートノードに 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.
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.