Red Hat Training

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

第4章 仮想ネットワーク向けの OVS-DPDK サポートの設定

本章では、コンポーザブルロールを使用して、DPDK (OVS-DPDK) を Open vSwitch とともに Red Hat OpenStack Platform 環境内にデプロイします。オーバークラウドは、通常コントローラーノードやコンピュートノードなどの事前定義済みロールのノードと、異なる種別のストレージノードで構成されます。これらのデフォルトロールにはそれぞれ、director ノード上のコア Heat テンプレートコレクションで定義されている一式のサービスが含まれます。

Red Hat OpenStack Platform 11 では、コンポーザブルロール機能を使用し、各ロールからサービスを追加/削除してカスタムのデプロイメントロールを作成できます。コンポーザブルロールの詳しい情報は「コンポーザブルサービスとカスタムロール」を参照してください。

OVS-DPDK の設定は、以下の作業で構成されます。

  • コンポーザブルロールを使用する場合には、roles-data.yam ファイルをコピーして編集し、OVS-DPDK 用のコンポーザブルロールを追加します。
  • 適切な network-environment.yaml ファイルを更新して、カーネル引数と DPDK 引数のパラメーターを追加します。
  • compute.yaml ファイルを更新して、DPDK インターフェース用のブリッジを追加します。
  • controller.yaml ファイルを更新して、DPDK インターフェースパラメーター用の同じブリッジ情報を追加します。
  • overcloud_deploy.sh スクリプトを実行して、DPDK パラメーターを使用してオーバークラウドをデプロイします。
OpenStack NFV Config Tuning 426823 1116 JCS OVS DPDK

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

  • Red Hat Enterprise Linux 7.3 をベースとした Red Hat OpenStack Platform 11
  • OVS-DPDK 2.6
  • NIC: Dual port Intel x520
注記

OVS-DPDK は Red Hat Enterprise Linux に依存しており、Red Hat Enterprise Linux 7.3 では OVS バージョン 2.6.* が必要です。

4.1. OVS-DPDK の設定パラメーターについての理解

本項では、OVS-DPDK 向けの OpenStack ネットワークを最適化するために network-environment.yaml ファイルで設定する一般的な OVS-DPDK パラメーターについて説明します。

  • NeutronDpdkMemoryChannels: メモリーチャンネルを CPU にマッピングします。
  • NeutronDpdkCoreList: DPDK PMD に使用される CPU コアを指定します。
  • NeutronDpdkSocketMemory: NUMA ノードごとに、ヒュージページプールから事前に割り当てられるメモリー容量を指定します。たとえば、DPDK Poll Mode Driver (PMD) (NeutronDpdkCoreList) が 2 つの NUMA ノードを使用する場合には、NeutronDpdkSocketMemory の設定は 1024,1024 となります。
  • NovaReservedHostMemory: ホスト上のタスク用のメモリーを確保します (例:  4096)。
  • NovaVcpuPinSet: CPU ピニングのコアを設定します。このコアの範囲は、NeutronDpdkCoreList コアとは重複しないようにする必要があります。
  • hugepagesz: CPU 上のヒュージページのサイズ。この値は、CPU ハードウェアによって異なる場合があります。
  • hugepages count: 利用可能なヒュージページの数。この値は、ホストのメモリーの空き容量によって異なります。コンピュートノードに関連付けられている OpenStack フレーバー内のヒュージページ数の値を設定する必要もあります。
  • Tuned CPU partitioning プロファイル: DPDK のパフォーマンスを設定するために適切な tuned プロファイルを設定します。

4.2. VLAN トンネリングを使用した単一ポートの OVS-DPDK の設定

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

4.2.2. post-install.yaml の編集

  1. tuned の設定で CPU アフィニティーを指定するように設定します。

    ExtraConfig:
      type: OS::Heat::SoftwareConfig
      properties:
        group: script
        config:
          str_replace:
            template: |
              #!/bin/bash
    
              set -x
              FORMAT=$COMPUTE_HOSTNAME_FORMAT
              if [[ -z $FORMAT ]] ; then
                FORMAT="compute" ;
              else
                # Assumption: only %index% and %stackname% are the variables in Host name format
                FORMAT=$(echo $FORMAT | sed  's/\%index\%//g' | sed 's/\%stackname\%//g') ;
              fi
              if [[ $(hostname) == *$FORMAT* ]] ; then
                tuned_service=/usr/lib/systemd/system/tuned.service
                grep -q "network.target" $tuned_service
                if [ "$?" -eq 0 ]; then
                  sed -i '/After=.*/s/network.target//g' $tuned_service
                fi
                grep -q "Before=.*network.target" $tuned_service
                if [ ! "$?" -eq 0 ]; then
                  grep -q "Before=.*" $tuned_service
                  if [ "$?" -eq 0 ]; then
                    sed -i 's/^\(Before=.*\)/\1 network.target openvswitch.service/g' $tuned_service
                  else
                    sed -i '/After/i Before=network.target openvswitch.service' $tuned_service
                  fi
                fi
                systemctl daemon-reload
              fi
            params:
              $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}

4.3. VLAN トンネリングを使用した 2 ポートの OVS-DPDK の設定

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

4.3.2. post-install.yaml の編集

  1. tuned の設定で CPU アフィニティーを指定するように設定します。

    ExtraConfig:
      type: OS::Heat::SoftwareConfig
      properties:
        group: script
        config:
          str_replace:
            template: |
              #!/bin/bash
    
              set -x
              FORMAT=$COMPUTE_HOSTNAME_FORMAT
              if [[ -z $FORMAT ]] ; then
                FORMAT="compute" ;
              else
                # Assumption: only %index% and %stackname% are the variables in Host name format
                FORMAT=$(echo $FORMAT | sed  's/\%index\%//g' | sed 's/\%stackname\%//g') ;
              fi
              if [[ $(hostname) == *$FORMAT* ]] ; then
                tuned_service=/usr/lib/systemd/system/tuned.service
                grep -q "network.target" $tuned_service
                if [ "$?" -eq 0 ]; then
                  sed -i '/After=.*/s/network.target//g' $tuned_service
                fi
                grep -q "Before=.*network.target" $tuned_service
                if [ ! "$?" -eq 0 ]; then
                  grep -q "Before=.*" $tuned_service
                  if [ "$?" -eq 0 ]; then
                    sed -i 's/^\(Before=.*\)/\1 network.target openvswitch.service/g' $tuned_service
                  else
                    sed -i '/After/i Before=network.target openvswitch.service' $tuned_service
                  fi
                fi
                systemctl daemon-reload
              fi
            params:
              $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}

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

本項では、OpenStack 環境で、1 つの OVS-DPDK ボンディングが 2 つのデータポートで構成される OVS-DPDK を設定およびデプロイする手順について説明します。このユースケースでは、コントロールプレーンに Linux ボンディングも使用します。

4.4.2. post-install.yaml の編集

  1. tuned の設定で CPU アフィニティーを指定するように設定します。

    ExtraConfig:
      type: OS::Heat::SoftwareConfig
      properties:
        group: script
        config:
          str_replace:
            template: |
              #!/bin/bash
    
              set -x
              FORMAT=$COMPUTE_HOSTNAME_FORMAT
              if [[ -z $FORMAT ]] ; then
                FORMAT="compute" ;
              else
                # Assumption: only %index% and %stackname% are the variables in Host name format
                FORMAT=$(echo $FORMAT | sed  's/\%index\%//g' | sed 's/\%stackname\%//g') ;
              fi
              if [[ $(hostname) == *$FORMAT* ]] ; then
                tuned_service=/usr/lib/systemd/system/tuned.service
                grep -q "network.target" $tuned_service
                if [ "$?" -eq 0 ]; then
                  sed -i '/After=.*/s/network.target//g' $tuned_service
                fi
                grep -q "Before=.*network.target" $tuned_service
                if [ ! "$?" -eq 0 ]; then
                  grep -q "Before=.*" $tuned_service
                  if [ "$?" -eq 0 ]; then
                    sed -i 's/^\(Before=.*\)/\1 network.target openvswitch.service/g' $tuned_service
                  else
                    sed -i '/After/i Before=network.target openvswitch.service' $tuned_service
                  fi
                fi
                systemctl daemon-reload
              fi
            params:
              $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}

4.5. VXLAN トンネリングを使用した単一ポートの OVS-DPDK の設定

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

4.5.2. post-install.yaml の編集

  1. tuned の設定で CPU アフィニティーを指定するように設定します。

    ExtraConfig:
      type: OS::Heat::SoftwareConfig
      properties:
        group: script
        config:
          str_replace:
            template: |
              #!/bin/bash
    
              set -x
              FORMAT=$COMPUTE_HOSTNAME_FORMAT
              if [[ -z $FORMAT ]] ; then
                FORMAT="compute" ;
              else
                # Assumption: only %index% and %stackname% are the variables in Host name format
                FORMAT=$(echo $FORMAT | sed  's/\%index\%//g' | sed 's/\%stackname\%//g') ;
              fi
              if [[ $(hostname) == *$FORMAT* ]] ; then
                tuned_service=/usr/lib/systemd/system/tuned.service
                grep -q "network.target" $tuned_service
                if [ "$?" -eq 0 ]; then
                  sed -i '/After=.*/s/network.target//g' $tuned_service
                fi
                grep -q "Before=.*network.target" $tuned_service
                if [ ! "$?" -eq 0 ]; then
                  grep -q "Before=.*" $tuned_service
                  if [ "$?" -eq 0 ]; then
                    sed -i 's/^\(Before=.*\)/\1 network.target openvswitch.service/g' $tuned_service
                  else
                    sed -i '/After/i Before=network.target openvswitch.service' $tuned_service
                  fi
                fi
                systemctl daemon-reload
              fi
            params:
              $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}

4.6. OVS-DPDK コンポーザブルロールの設定

本項では、VLAN トンネリングを使用した OVS-DPDK および SR-IOV 向けのコンポーザブルロールの設定方法について説明します。コンポーザブルロールの作成/デプロイプロセスは、以下の作業が含まれます。

  • role_data.yaml ファイルのローカルコピーで新規ロールを定義します。
  • network_environment.yaml ファイルを編集して、この新規ロールを追加します。
  • 更新したロールセットでオーバークラウドをデプロイします。

以下の例では、ComputeOvsDpdkComputeSriov は、コンピュートノード用のコンポーザブルロールで、サポートされている NIC が搭載されたノードでのみ DPDK または SR-IOV を有効にします。Red Hat OpenStack Platform によって提供される既存のデフォルトロールセットは、/home/stack/roles_data.yaml ファイルに保管されます。

4.7. 既知の制限事項

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

  • ヒュージページは OVS-DPDK を使用するホスト上で実行される全インスタンスに必要です。ゲストのヒュージページがない場合には、インターフェースは表示されても機能しません。
  • TAP デバイスは DPDK をサポートしていないため、それらのデバイスを使用するサービスのパフォーマンスが低下します。たとえば、DVR、FWaaS、LBaaS などのサービスは TAP デバイスを使用します。

    • OVS-DPDK では、netdev datapath で DVR を有効化することができますが、パフォーマンスが低いので、実稼働環境には適していません。DVR はカーネルの名前空間と TAP デバイスを使用してルーティングを実行します。
    • OVS-DPDK で DVR ルーティングのパフォーマンスを良好な状態にするには、OpenFlow ルールとしてルーティングを実装する ODL などのコントローラーを使用する必要があります。OVS-DPDK では、 OpenFlow ルーティングは、Linux カーネルインターフェースによって生じるボトルネックをなくすので、データパスの完全なパフォーマンスが維持されます。
  • OVS-DPDK を使用する場合には、すべて のブリッジがコンピュートノード上で ovs_user_bridge の種別である必要があります。director は設定を受け入れることができますが、Red Hat OpenStack Platform はコンピュートノード上で ovs_bridgeovs_user_bridge の混在する構成はサポートしていません。

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

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

  1. アグリゲートグループを作成して、OVS-DPDK 用にホストを追加します。

     # openstack aggregate create --zone=dpdk dpdk
     # openstack aggregate add host dpdk compute-ovs-dpdk-0.localdomain
  2. フレーバーを作成します。

    # openstack flavor create  m1.medium_huge_4cpu --ram 4096 --disk 150 --vcpus 4

    このコマンドでは、m1.medium_huge_4cpu はフレーバー名、4096 は MB 単位のメモリー容量、150 は GB 単位のディスク容量 (デフォルトでは 0 G)、4 は仮想 CPU 数を設定しています。

  3. フレーバーの追加のプロパティーを設定します。

    # openstack  flavor set  --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=require --property hw:mem_page_size=large --property hw:numa_nodes=1 --property hw:numa_mempolicy=preferred --property  hw:numa_cpus.0=0,1,2,3 --property hw:numa_mem.0=4096 m1.medium_huge_4cpu

    このコマンドでは、m1.medium_huge_4cpu はフレーバー名を指定しており、残りはそのフレーバーのその他のプロパティーを設定しています。

  4. インスタンスをデプロイします。

    # openstack server create --flavor m1.medium_huge_4cpu --availability-zone dpdk --image rhel_7.3 --nic  net-id=<net-id>

    このコマンドでは、m1.medium_huge_4cpu はフレーバーの名前または ID、dpdk はサーバーのアベイラビリティーゾーン、rhel_7.3 はインスタンスの作成に使用するイメージ (名前または ID)、<net-id> はサーバー上の NIC を設定します。

これで、NFV ユースケースの OVS-DPDK 向けインスタンスのデプロイが完了しました。

multi-queue を OVS-DPDK で使用するには、上記の手順に数ステップを追加する必要があります。フレーバーを作成する前に、以下のステップを実行してください。

  1. イメージのプロパティーを設定します。

    # openstack image set --property hw_vif_multiqueue_enabled=true <image-id>

    ここで、hw_vif_multiqueue_enabled=true はこのイメージ上でマルチキューを有効にするためのプロパティーで、<image-id> は変更するイメージの名前または ID です。

  2. フレーバーの追加のプロパティーを設定します。

    # openstack flavor set m1.vm_mq set hw:vif_multiqueue_enabled=true

    ここで、m1.vm_mq はフレーバーの ID または名前で、残りのオプションはそのフレーバーのマルチキューを有効化します。

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

本項では、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