Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

第4章 DPDK で高速化した Open vSwitch (OVS) のネットワーク設定

本章では、Red Hat OpenStack Platform 環境内で DPDK を Open vSwitch とともにインストールしてチューニングする方法について説明します。

OVS-DPDK を設定するのに使用されるパラメーターについて理解するには、「OVS-DPDK デプロイメントのプランニング」を参照してください。

注記

本ガイドでは、CPU の割り当て、メモリーの確保、NIC の設定の例を紹介します。これらは、トポロジーとユースケースによって異なる場合があります。ハードウェアと設定のオプションについて理解するには、『ネットワーク機能仮想化 (NFV) の製品ガイド』および『ネットワーク機能仮想化 (NFV) のプランニングガイド』を参照してください。

注記

etc/tuned/cpu-partitioning-variables.confisolated_cores や他の値を編集または変更しないでください。これらは、ここで説明する director の heat テンプレートにより変更されます。

以降の手順で、以下の設定を行う必要があります。

  • 適切な network-environment.yaml ファイルを更新して、カーネル引数と DPDK 引数のパラメーターを追加する。
  • compute.yaml ファイルを更新して、DPDK インターフェース用のブリッジを追加する。
  • controller.yaml ファイルを更新して、DPDK インターフェースパラメーター用の同じブリッジ情報を追加する。
  • overcloud_deploy.sh スクリプトを実行して、DPDK パラメーターを使用してオーバークラウドをデプロイする。
注記

デプロイメントでヒュージページが使用される場合は、reserved_huge_pages を設定する必要もあります。詳しくは、「How to set reserved_huge_pages in /etc/nova/nova.conf in Red Hat OpenStack Platform」を参照してください。

OpenStack NFV Config Guide Topology 450694 0617 ECE OVS DPDK

手順を開始する前に、以下の項目が揃っていることを確認します。

  • Red Hat Enterprise Linux 7.5 上で動作している Red Hat OpenStack Platform 10
  • OVS-DPDK 2.9
  • テスト済み NIC。NFV 向けのテスト済み NIC の一覧は、「テスト済み NIC」を参照してください。
注記

OVS-DPDK デプロイメントでは、Red Hat OpenStack Platform 10 と OVS 2.9 の組み合わせは、OVS クライアントモードで稼働します。

4.1. 命名規則

OpenStack デプロイメントでカスタムロールを使用する場合、特にノードが複数あるケースでは、一貫性のある命名規則に従うことを推奨します。この命名規則は、以下のファイルおよび設定を作成する際に役立ちます。

  • instackenv.json: ハードウェアまたは NIC 機能が異なるノードを区別する。

    "name":"computeovsdpdk-0"
  • roles_data.yaml: DPDK をサポートする Compute ベースのロールを区別する。

    `ComputeOvsDpdk`
  • network-environment.yaml: カスタムロールを正しいフレーバー名に一致させる。

     `OvercloudComputeOvsDpdkFlavor: computeovsdpdk`
  • nic-config のファイル名: DPDK インターフェースをサポートするコンピュートノードの NIC yaml ファイルを区別する。
  • フレーバー作成: フレーバーおよび capabilities:profile の値を適切なベアメタルノードおよびカスタムロールに容易に一致させる。

    # openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 4 computeovsdpdk
    # openstack flavor set --property "cpu_arch"="x86_64" --property "capabilities:boot_option"="local" --property "capabilities:profile"="computeovsdpdk" computeovsdpdk
  • ベアメタルノード: ベアメタルノードを適切なハードウェアおよび capability:profile の値に一致させる。

     # openstack baremetal node update computeovsdpdk-0 add properties/capabilities='profile:computeovsdpdk,boot_option:local'
注記

フレーバー名をフレーバーの capabilities:profile の値に一致させる必要はありませんが、フレーバーの capabilities:profile の値をベアメタルノードの properties/capabilities='profile の値に一致させる必要があります。上記の例では、3 つすべてに computeovsdpdk が使用されています。

注記

カスタムロールおよびプロファイルに使用するすべてのノードの CPU、RAM、および PCI ハードウェアトポロジーが、同じになるようにしてください。

4.2. VLAN トンネリングを使用する 2 ポート OVS-DPDK データプレーンボンディングの設定

本項では、OpenStack 環境用に、コントロールプレーンの Linux ボンディングと共に、OVS-DPDK ボンディングの 2 つのデータプレーンポートを持つ OVS-DPDK を設定およびデプロイする手順について説明します。

4.3. VXLAN トンネリングを使用する単一ポート OVS-DPDK の設定

本項では、OpenStack 環境用に、コントロールプレーンの Linux ボンディングおよび VXLAN トンネリングと共に、単一ポートの OVS-DPDK を設定する手順について説明します。

4.4. OVS-DPDK インターフェースの MTU 値の設定

Red Hat OpenStack Platform は OVS-DPDK 向けにジャンボフレームをサポートしています。ジャンボフレーム用の MTU 値を設定するには、以下の操作を行う必要があります。

  • network-environment.yaml ファイルで、ネットワークのグローバル MTU 値を設定する。
  • compute.yaml ファイルで、物理 DPDK ポートの MTU 値を設定する。この値は、vhost のユーザーインターフェースでも使用されます。
  • コンピュートノード上の任意のゲストインスタンスで MTU 値を設定し、設定内でエンドツーエンドに同等の MTU 値が設定されるようにする。
注記

VXLAN パケットには追加で 50 バイトがヘッダーに含まれます。MTU の必要値は、ヘッダーの追加バイト値に基づいて計算してください。たとえば、MTU 値 が 9000 の場合には、これらの追加バイト値を計算に入れると、VXLAN トンネルの MTU 値は 8950 となります。

注記

物理 NIC は DPDK PMD によって制御され、compute.yaml ファイルで設定されているのを同じ MTU 値が適用されるので、特別な設定は必要ありません。MTU 値には、物理 NIC でサポートされているよりも高い値を設定することはできません。

OVS-DPDK インターフェースの MTU 値を設定するには、以下の手順を実行します。

  1. network-environment.yaml ファイルで NeutronGlobalPhysnetMtu パラメーターを設定します。

    parameter_defaults:
      # Global MTU configuration on Neutron
      NeutronGlobalPhysnetMtu: 9000
    注記

    network-environment.yaml ファイルの NeutronDpdkSocketMemory の値がジャンボフレームをサポートするのに十分な容量であることを確認します。詳しくは、「メモリーパラメーター」を参照してください。

  2. controller.yaml ファイルでコンピュートノードへのブリッジ上の MTU 値を設定します。

      -
        type: ovs_bridge
        name: br-link0
        use_dhcp: false
        mtu: 9000
        members:
          -
            type: ovs_bond
            name: bond0
            use_dhcp: true
            members:
              -
                type: interface
                name: nic7
                mtu: 9000
              -
                type: interface
                name: nic8
                mtu: 9000
          -
            type: vlan
            vlan_id: {get_param: TenantNetworkVlanID}
            device: bond0
            mtu: 9000
            addresses:
              -
                ip_netmask: {get_param: TenantIpSubnet}

compute.yaml ファイルで OVS-DPDK インターフェースおよびボンディング用の MTU 値を定義するには、以下のように設定します。

  -
    type: ovs_user_bridge
    name: br-link0
    use_dhcp: false
    ovs_extra:
      -
        str_replace:
          template: set port br-link0 tag=VLAN_TAG
          params:
            VLAN_TAG: {get_param: TenantNetworkVlanID}
    addresses:
      -
        ip_netmask: {get_param: TenantIpSubnet}
    members:
      -
        type: ovs_dpdk_bond
        name: dpdkbond0
        mtu: 9000
        ovs_extra:
          - set interface dpdk0 mtu_request=$MTU
          - set interface dpdk1 mtu_request=$MTU
          - set interface dpdk0 options:n_rxq=2
          - set interface dpdk1 options:n_rxq=2
        members:
          -
            type: ovs_dpdk_port
            name: dpdk0
            members:
              -
                type: interface
                name: nic7
          -
            type: ovs_dpdk_port
            name: dpdk1
            members:
              -
                type: interface
                name: nic8

4.5. OVS-DPDK インターフェース向けのマルチキューの設定

コンピュートノード上の OVS-DPDK ポートのキューの数を設定するには、compute.yaml ファイルを以下のように変更します。

  -
    type: ovs_user_bridge
    name: br-link0
    use_dhcp: false
    ovs_extra:
      -
        str_replace:
          template: set port br-link0 tag=VLAN_TAG
          params:
            VLAN_TAG: {get_param: TenantNetworkVlanID}
    addresses:
      -
        ip_netmask: {get_param: TenantIpSubnet}
    members:
      -
        type: ovs_dpdk_bond
        name: dpdkbond0
        mtu: 9000
        ovs_extra:
          - set interface dpdk0 mtu_request=$MTU
          - set interface dpdk1 mtu_request=$MTU
          - set interface dpdk0 options:n_rxq=2
          - set interface dpdk1 options:n_rxq=2
        members:
          -
            type: ovs_dpdk_port
            name: dpdk0
            members:
              -
                type: interface
                name: nic7
          -
            type: ovs_dpdk_port
            name: dpdk1
            members:
              -
                type: interface
                name: nic8

4.6. 既知の制限事項

NFV のユースケース向けに Red Hat OpenStack Platform 10 で OVS-DPDK を設定する場合には特定の制限事項があります。

  • コントロールプレーンのネットワークには、Linux ボンディングを使用します。最大限のパフォーマンスを得るために、ボンディングに使用されている両方の PCI デバイスが同じ NUMA ノード上に設定されるようにしてください。Red Hat では、Neutron の Linux ブリッジ構成はサポートしていません。
  • ヒュージページは OVS-DPDK を使用するホスト上で実行される全インスタンスに必要です。ゲストのヒュージページがない場合には、インターフェースは表示されても機能しません。
  • TAP デバイスは DPDK をサポートしないため、これらのデバイスを使用するサービスのパフォーマンスが低下します。TAP デバイスを使用するサービスの例としては、DVR、FWaaS、および LBaaS 等が挙げられます。

    • OVS-DPDK を使用する場合、netdev datapath により DVR を有効にすることができますが、そのパフォーマンスは低く、実稼働環境に適するものではありません。DVR は カーネル名前空間および TAP デバイスを使用してルーティングを行います。
    • OVS-DPDK との組み合わせで DVR のルーティングが適切に機能するためには、OpenFlow ルールとしてルーティングを実装する ODL 等のコントローラーを使用する必要があります。OVS-DPDK を使用する場合、OpenFlow のルーティングが Linux カーネルインターフェースに起因するボトルネックを排除するので、データパスの完全なパフォーマンスが維持されます。
  • OVS-DPDK を使用する場合には、コンピュートノード上の ブリッジの種別が ovs_user_bridge でなければなりません。ovs_bridgeovs_user_bridge が混在する構成は、director では受け入れ可能ですが、Red Hat OpenStack Platform ではサポートされていません。

4.7. OVS-DPDK 用フレーバーの作成とインスタンスのデプロイ

NFV を実装する Red Hat OpenStack Platform デプロイメントの OVS-DPDK の設定を完了した後には、以下の手順に従ってフレーバーを作成してインスタンスをデプロイすることができます。

  1. OVS-DPDK 用にアグリゲートグループを作成し、ホストを追加します。フレーバーメタデータに一致するメタデータを定義します (例: "aggregate_instance_extra_specs:dpdk"="true")。

     # openstack aggregate create dpdk_group
     # openstack aggregate set --property \
     "aggregate_instance_extra_specs:dpdk"="true" dpdk_group
     # openstack aggregate add host dpdk compute-ovs-dpdk-0.localdomain
  2. フレーバーを作成します。

    # openstack flavor create <flavor --ram <MB> --disk <GB> --vcpus <#>
  3. 追加のフレーバー属性を設定します。定義したメタデータ ("aggregate_instance_extra_specs:dpdk"=true") と DPDK アグリゲートで定義したメタデータが一致している点に注意してください。

    # openstack flavor set --property "aggregate_instance_extra_specs:dpdk"="true" \
    --property hw:cpu_policy=dedicated  \
    --property hw:mem_page_size=large <flavor>
  4. ネットワークを作成します。

    # openstack network create net1 --provider-physical-network tenant --provider-network-type vlan --provider-segment <VLAN-ID>
  5. サブネットを作成します。

    # openstack subnet create subnet1 --network net1 --subnet-range 192.0.2.0/24 --dhcp
  6. インスタンスをデプロイします。

    # openstack server create --flavor <flavor> --image <glance_image> --nic net-id=net1 <name>

これで、NFV ユースケースで OVS-DPDK 用インスタンスがデプロイされました。

4.7.1. エミュレータースレッドの固定によるパフォーマンスの最適化

パフォーマンスを改善するために、Qemu エミュレータースレッドを代替のコアに固定することができます。

  1. インスタンスの仮想 CPU として使用されているコアを把握します。

    # virsh dumpxml dpdk_vm | grep cpuset
        <vcpupin vcpu='0' cpuset='2'/>
        <vcpupin vcpu='1' cpuset='18'/>
        <vcpupin vcpu='2' cpuset='1'/>
        <vcpupin vcpu='3' cpuset='17'/>
        <emulatorpin cpuset='1-2,17-18'/>
  2. エミュレータースレッドを固定するコアを選択します。選択したコアが NovaVcpuPinSet の一覧に含まれることを確認します。

    #virsh emulatorpin <vm-name> --cpulist 2
    注記

    エミュレーター固定スレッドに関連付けられる物理 CPU は、NovaVcpuPinSet の一覧に含まれる仮想 CPU の 1 つ (ハイパースレッディングが有効な場合は 2 つのスレッド) を使用します。

4.8. 設定のトラブルシューティング

本項では、DPDK-OVS 設定のトラブルシューティングの手順を説明します。

  1. ブリッジの設定を見直して、ブリッジが datapath_type=netdev で作成されたことを確認します。以下に例を示します。

    # ovs-vsctl list bridge br0
    _uuid               : bdce0825-e263-4d15-b256-f01222df96f3
    auto_attach         : []
    controller          : []
    datapath_id         : "00002608cebd154d"
    datapath_type       : netdev
    datapath_version    : "<built-in>"
    external_ids        : {}
    fail_mode           : []
    flood_vlans         : []
    flow_tables         : {}
    ipfix               : []
    mcast_snooping_enable: false
    mirrors             : []
    name                : "br0"
    netflow             : []
    other_config        : {}
    ports               : [52725b91-de7f-41e7-bb49-3b7e50354138]
    protocols           : []
    rstp_enable         : false
    rstp_status         : {}
    sflow               : []
    status              : {}
    stp_enable          : false
  2. neutron-ovs-agent が自動的に起動するように設定されていることを確認して、OVS サービスを見直します。

    # systemctl status neutron-openvswitch-agent.service
    neutron-openvswitch-agent.service - OpenStack Neutron Open vSwitch Agent
    Loaded: loaded (/usr/lib/systemd/system/neutron-openvswitch-agent.service; enabled; vendor preset: disabled)
    Active: active (running) since Mon 2015-11-23 14:49:31 AEST; 25min ago

    サービスが起動しない場合には、関連する何らかのメッセージが表示されるはずです。

    # journalctl -t neutron-openvswitch-agent.service
  3. ovs-dpdk の PMD CPU マスクが CPU にピニングされていることを確認します。HT の場合には、シブリング CPU を使用します。

    CPU4 の例を以下に示します。

    # cat /sys/devices/system/cpu/cpu4/topology/thread_siblings_list
    4,20

    CPU 4 と 20 を使用します。

    # ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x100010

    ステータスを表示します。

    # tuna -t ovs-vswitchd -CP
    thread  ctxt_switches pid SCHED_ rtpri affinity voluntary nonvoluntary       cmd
    3161	OTHER 	0    	6	765023      	614	ovs-vswitchd
    3219   OTHER 	0    	6     	1        	0   	handler24
    3220   OTHER 	0    	6     	1        	0   	handler21
    3221   OTHER 	0    	6     	1        	0   	handler22
    3222   OTHER 	0    	6     	1        	0   	handler23
    3223   OTHER 	0    	6     	1        	0   	handler25
    3224   OTHER 	0    	6     	1        	0   	handler26
    3225   OTHER 	0    	6     	1        	0   	handler27
    3226   OTHER 	0    	6     	1        	0   	handler28
    3227   OTHER 	0    	6     	2        	0   	handler31
    3228   OTHER 	0    	6     	2        	4   	handler30
    3229   OTHER 	0    	6     	2        	5   	handler32
    3230   OTHER 	0    	6	953538      	431   revalidator29
    3231   OTHER 	0    	6   1424258      	976   revalidator33
    3232   OTHER 	0    	6   1424693      	836   revalidator34
    3233   OTHER 	0    	6	951678      	503   revalidator36
    3234   OTHER 	0    	6   1425128      	498   revalidator35
    *3235   OTHER 	0    	4	151123       	51       	pmd37*
    *3236   OTHER 	0   	20	298967       	48       	pmd38*
    3164   OTHER 	0    	6 	47575        	0  dpdk_watchdog3
    3165   OTHER 	0    	6	237634        	0   vhost_thread1
    3166   OTHER 	0    	6  	3665        	0       	urcu2