このページの目的は、 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 エージェントは、ポートの 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 を有効にするには、以下の手順を行う必要があります。
Virtual Function の作成 (コンピュートノード)
nova-compute での PCI デバイスのホワイトリストの設定 (コンピュートノード)
neutron-server の設定 (コントローラーノード)
nova-scheduler の設定 (コントローラーノード)
neutron sriov-agent の有効化 (コンピュートノード)
推奨のネットワーク分離方法は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 拡張機能には、以下のようなユースケースがあります。
SR-IOV ポートを持つインスタンスと通常ポートのインスタンスを同じコンピュートノード上に配置する
Floating IP アドレスを使用する SR-IOV ポートを持つインスタンスとネットワークノードを同じホストに配置する
この問題の詳しい情報は、 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 に指定します。
$ 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 対応では、 仮想 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 ポートを持つインスタンスのライブマイグレーションはサポートされていません。
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.