Contrail vRouter と統合されたデータ プレーン開発キット(DPDK)の設定
Contrail での DPDK サポート
Contrail Networkingは、データプレーン開発キット(DPDK)をサポートしています。DPDKは、高速パケット処理のためのライブラリとドライバーのオープンソースセットです。DPDK は、ネットワーク インターフェイス カード (NIC) がダイレクト メモリ アクセス (DMA) パケットをアプリケーションのアドレス空間に直接送信できるようにすることで、アプリケーションがパケットをポーリングできるようにすることで、高速パケット処理を可能にし、NIC からの割り込みのオーバーヘッドを回避します。
DPDK との統合により、Contrail vRouter はカーネル モジュールとして実行している場合よりも多くのパケット/秒を処理できます。
Contrail Networkingでは、DPDKを使用する前に、Ansibleベースのプロビジョニングの場合は で、Helmベースのプロビジョニングの場合は でDPDK設定を定義するhost.yaml必要があります。AGENT_MODE設定では、ハイパーバイザーを DPDK モードの動作でプロビジョニングするかどうかを指定します。instances.yaml
Contrail コンピューティング ノードが DPDK でプロビジョニングされると、対応する yaml ファイルに、パケットの転送に使用する CPU コアの数、DPDK に割り当てるヒュージ ページの数、DPDK に使用する UIO ドライバーが指定されます。
DPDKを使用してクラスタノードをプロビジョニングするための環境ファイルの準備
環境ファイルは、DPDKを使用するようにノードを設定する必要があるかどうかなど、Contrailクラスターのインストールに必要なすべてのオプションを指定するためにプロビジョニング時に使用されます。
DPDK vRouter を使用して構成する各ノードは、DPDK ヒュージ ページのメモリの割合と使用する CPU と共に、ディクショナリ エントリとともにプロビジョニング ファイルにリストされている必要があります。
次に、サーバー構成に必要なエントリについて説明します。:
-
HUGE_PAGES- DPDK ヒュージ ページ用に予約するホスト メモリの割合を指定します。予約済みメモリは、そのホストで生成された仮想マシン(VM)にメモリリソースを割り当てるために、vRouter とクイックエミュレータ(QEMU)によって使用されます。メモ:ホストLinuxカーネルにもメモリが必要なため、割り当てる
HUGE_PAGES割合は高すぎないようにする必要があります。DPDKでヒュージ・ページを使用する場合は、以下のことを確認してください。
-
デフォルトでは、2MBのヒュージ・ページがプロビジョニングされます。
-
ノードに1GBの巨大ページが必要な場合は、1GBの巨大ページ設定を好みに合わせて設定し、2MBの巨大ページを無効にします。ノードが2Mの巨大ページを使用しようとしないように、変数を削除するのではなく、2Mの巨大ページ設定を0に設定することを強くお勧めします。
-
ヒュージ ページの設定は環境によって異なりますが、contrail_services.yaml ファイル内の ContrailDpdkParameters 階層で 2M のヒュージ ページを 0 に設定することで、ほとんどの環境で 2M のヒュージ ページを 0 に設定することができます。
-
CPU_CORE_MASK- vRouter を実行する CPU アフィニティ マスクを指定します。vRouter は、その実行スレッドに指定された CPU のみを使用します。これらのCPUコアは常にパケットをポーリングし、「top」の出力では100%ビジーとして表示されます。サポートされている形式は 16 進数 (0xf など) です。
DPDK_UIO_DRIVER- DPDK で使用する UIO ドライバを指定します。サポートされている値は次のとおりです。
vfio-pci- uio の代わりに Linux カーネルの vfio モジュールを使用することを指定します。SR-IOV 仮想関数が vrouter の物理インターフェイスとして使用されている場合、vfio モジュールは IOMMU を使用してメモリ アクセスを保護します。uio_pci_generic- Linux カーネルに組み込まれている UIO ドライバーを使用することを指定します。このオプションでは、SR-IOV VF の使用はサポートされていません。これは、DPDK_UIO_DRIVERが指定されていない場合の既定のオプションです。mlnx– Mellanox ConnectX-4 および ConnectX-5 NIC 用。
RHEL および Intel x710 フォートビル ベースの NIC の場合は、既定のuio_pci_genericの代わりに を使用します vfio-pci 。
標準の Ansible または helm ベースのプロビジョニング手順を使用します。完了すると、DPDK vRouter 実装を使用する指定されたノードを含むクラスターを使用できるようになります。
ansibleベースのプロビジョニングのためのinstances.ymlの設定例
Bms1:
provider: bms
ip: ip-address
roles:
vrouter:
AGENT_MODE: dpdk
CPU_CORE_MASK: “0xff”
DPDK_UIO_DRIVER: uio_pci_generic
HUGE_PAGES: 32000
helm ベースのプロビジョニングのための host.yml での設定例
... AGENT_MODE: dpdk CPU_CORE_MASK: “0xff” DPDK_UIO_DRIVER: uio_pci_generic HUGE_PAGES: 32000
DPDKのフレーバーの作成と巨大なページの理解
DPDK 対応の vRouter ハイパーバイザーで VM を起動するには、VM のフレーバーをヒュージ ページを使用するように設定する必要があります。ヒュージ ページの使用は、DPDK vRouter を使用するための要件です。
次のコマンドを使用してフレーバーを追加します。はフレーバーの名前です。 m1.large このフレーバーを使用して VM が作成されると、OpenStack は、ヒュージ・ページが有効になっているコンピュート・ノードでのみ VM が生成されるようにします。
# openstack flavor set m1.large --property hw:mem_page_size=large
ヒュージ ページは、vRouter が DPDK でプロビジョニングされているコンピューティング ノードで有効になります。
ヒュージ ページが有効になっていないフレーバーを使用して VM を生成する場合は、vRouter が DPDK でプロビジョニングされているコンピューティング ノードに VM を作成しないでください。
OpenStack アベイラビリティーゾーンまたはホストアグリゲートを使用して、vRouter が DPDK でプロビジョニングされているホストを除外できます。
DPDK でヒュージ・ページを使用する場合は、以下の点に注意してください。
ノード上のフローテーブルのサイズは、巨大ページ構成のサイズを決定する必要があります。フローテーブルエントリが多い環境では、1GBのヒュージページを使用します。
デフォルトでは、2MBのヒュージ・ページがプロビジョニングされます。
ノードに1GBの巨大ページが必要な場合は、1GBの巨大ページ設定を好みに合わせて設定し、2Mの巨大ページを無効にします。変数を削除するのではなく、2M の巨大ページ設定を 0 に設定して、環境で 2M の巨大ページの使用を試みないようにすることを強くお勧めします。
ヒュージ ページの設定は環境によって異なりますが、contrail_services.yaml ファイル内の ContrailDpdkParameters 階層で 2M のヒュージ ページを 0 に設定することで、ほとんどの環境で 2M のヒュージ ページを 0 に設定することができます。
DPDK vRouter の MTU の設定と検証
このセクションでは、DPDK vRouter の最大送信単位(MTU)を設定する方法について説明します。MTU を設定するには、contrail_vrouter_dpdk_bond.yaml ファイルで目的の値mtuを指定する必要があります。
network_config:
-
type: contrail_vrouter_dpdk
name: vhost0
members:
-
type: interface
name: em3
-
type: interface
name: em1
mtu: 9100
bond_mode: 2
bond_policy: 802.3ad
ハイパーバイザーから設定された値を確認するには、次のコマンドを実行します。
$ ip link list vhost0
39: vhost0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9100 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 98:03:9b:a7:3b:a0 brd ff:ff:ff:ff:ff:ff
vif -gまたは vif --get コマンドを使用して、DPDK vRouter のボンディング インターフェイスのステータスを表示できます。
例えば
# vif --get 0
Vrouter Interface Table
[...]
vif0/0 PCI: 0000:00:00.0 (Speed 20000, Duplex 1) NH: 4
Type:Physical HWaddr:00:1b:21:bb:f9:48 IPaddr:0.0.0.0
Vrf:0 Mcast Vrf:65535 Flags:TcL3L2VpEr QOS:-1 Ref:26
RX device packets:668852 bytes:110173140 errors:0
RX port packets:207344 errors:0
RX queue errors to lcore 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Fabric Interface: eth_bond_bond0 Status: UP Driver: net_bonding
Slave Interface(o): 0000:02:00.0 Status: UP Driver: net_ixgbe
Slave Interface(1): 0000:02:00.1 Status: UP Driver: net_ixgbe
Vlan Id: 101 VLAN fwd Interface: bond
RX packets:207344 bytes:45239337 errors:0
TX packets:326159 bytes:237905360 errors:4
Drops:0
TX port packets:326145 errors:10
TX device packets:915402 bytes:511551768 errors:0