このページの目的は、 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 に割り当てることができます。その結果、ユーザーは低遅延とラインレートに近い通信速度を得ることができます。
このドキュメントでは以下の用語を使用します。
用語 |
定義 |
---|---|
PF | Physical Function (物理機能)。SR-IOV に対応した物理 Ethernet コントローラーです。 |
VF | Virtual Function (仮想機能)。物理 Ethernet コントローラーから作成された仮想 PCIe デバイスです。 |
SR-IOV を有効にするには、以下の手順を行う必要があります。
Virtual Function を作成する (コンピュートノード)
nova-compute で PCI デバイスのホワイトリストを設定する (コンピュートノード)
neutron-server の設定を行う (コントローラーノード)
nova-scheduler の設定を行う (コントローラーノード)
neutron sriov-agent を有効にする (コンピュートノード)
Neutron sriov-agent
SR-IOV の設定としては 2 つの方法があります。
各コンピュートノードで sriov-agent を動かす
コンピュートノードで 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 として設定されたプロバイダーネットワークとして使用します。実際の環境に応じて、これらを変更してください。
この手順では、 SR-IOV 用に使用するネットワークインターフェース用の VF を作成します。 eth3 を PF として使用します。 eth3 は Open vSwitch VLAN のインターフェースとしても使用され、 eth3 はすべてのマシンのプライベートネットワークにアクセスできます。
VF を作成する手順は SR-IOV カードの Ethernet コントローラーベンダーにより異なります。現在のところ、以下のベンダーの動作が確認されています。
Mellanox SR-IOV Ethernet カード については、Mellanox: HowTo Configure SR-IOV VFs を参照してください。
Ubuntu 上で Intel SR-IOV Ethernet カード で VF を作成するには、以下のようにします。
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
新しいパラメーターを追加したら、以下を実行します。
# update-grub
# reboot
各コンピュートノードで、 PCI SYS インターフェース経由で VF を作成します。
# echo '7' > /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
インターフェースが 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
ここで VF が作成されたかを確認します (Virtual Function デバイスのところを見てください)。
# lspci | grep Ethernet
再起動時にも作成 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 デバイスでパススルーを許可するかを指示します。 /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_id と product_id は Linux のユーティリティー lspci で表示できます。
pci_passthrough_whitelist = { "vendor_id": "<id>", "product_id": "<id>",
"physical_network": "physnet2"}
PCI アドレスやデバイス名で定義されたデバイスが SR-IOV PF に対応する場合には、その PF 配下のすべての VF がこのエントリーにマッチします。 1 つのホストで複数の passthrough_whitelist エントリーを指定することもできます。
sriovnicswitch をメカニズムドライバーとして追加します。ファイル /etc/neutron/plugins/ml2/ml2_conf.ini を編集します。
mechanism_drivers = openvswitch,sriovnicswitch
VF を作成しておいたコンピュートノードにログインし、作成した VF の vendor_id と product_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)
各コントローラーで /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
新しく設定した 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
変更を反映させるため、 service neutron-server restart を実行して neutron-server サービスを再起動します。
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
service nova-scheduler restart を実行して nova-scheduler サービスを再起動します。
注釈
sriov-agent を有効にする必要があるのは neutron-server の設定を行う (コントローラーノード) の手順で agent_required=True``をそのままにした場合にだけです。 ``agent_required=False に設定した場合は、この手順をスキップできます。
各コンピュートノードで /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
sriov-agent が正常に実行できるかを確認します。
# neutron-sriov-nic-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
システム起動時に neutron-sriov-agent が自動的に開始するようにします。お使いのディストリビューションで init システム用のデーモンファイルが提供されていない場合は、デーモンの設定ファイルを作成します。例えば、 Ubuntu では、このパッケージをインストールします。
# apt-get install neutron-plugin-sriov-agent
設定が終わったら、 neutron SR-IOV ポートを持つインスタンスを起動できます。
SR-IOV ポートを作成したい neutron ネットワークの ID を取得します。
$ net_id=`neutron net-show net04 | grep "\ id\ " | awk '{ print $4 }'`
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 }'`
VM を作成します。ステップ 2 で作成した SR-IOV ポートを NIC として指定します。
$ nova boot --flavor m1.large --image ubuntu_14.04 --nic port-id=$port_id test-sriov
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
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.