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.conf
の isolated_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」を参照してください。
手順を開始する前に、以下の項目が揃っていることを確認します。
- 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.2.1. first-boot.yaml の変更
first-boot.yaml
ファイルを変更し、OVS および DPDK パラメーターを設定し、CPU アフィニティー用に tuned
を設定します。
以前のデプロイメントで first-boot.yaml
ファイルに以下の行を追加している場合、Open vSwitch 2.9 を使用する Red Hat OpenStack Platform 10 ではこれらの行を削除してください。
ovs_service_path="/usr/lib/systemd/system/ovs-vswitchd.service" grep -q "RuntimeDirectoryMode=.*" $ovs_service_path if [ "$?" -eq 0 ]; then sed -i 's/RuntimeDirectoryMode=.*/RuntimeDirectoryMode=0775/' $ovs_service_path else echo "RuntimeDirectoryMode=0775" >> $ovs_service_path fi grep -Fxq "Group=qemu" $ovs_service_path if [ ! "$?" -eq 0 ]; then echo "Group=qemu" >> $ovs_service_path fi grep -Fxq "UMask=0002" $ovs_service_path if [ ! "$?" -eq 0 ]; then echo "UMask=0002" >> $ovs_service_path fi ovs_ctl_path='/usr/share/openvswitch/scripts/ovs-ctl' grep -q "umask 0002 \&\& start_daemon \"\$OVS_VSWITCHD_PRIORITY\"" $ovs_ctl_path if [ ! "$?" -eq 0 ]; then sed -i 's/start_daemon \"\$OVS_VSWITCHD_PRIORITY.*/umask 0002 \&\& start_daemon \"$OVS_VSWITCHD_PRIORITY\" \"$OVS_VSWITCHD_WRAPPER\" \"$@\"/' $ovs_ctl_path fi
新たなリソースを追加します。
resources: userdata: type: OS::Heat::MultipartMime properties: parts: - config: {get_resource: set_dpdk_params} - config: {get_resource: install_tuned} - config: {get_resource: compute_kernel_args}
DPDK パラメーターを設定します。
set_dpdk_params: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash set -x get_mask() { local list=$1 local mask=0 declare -a bm max_idx=0 for core in $(echo $list | sed 's/,/ /g') do index=$(($core/32)) bm[$index]=0 if [ $max_idx -lt $index ]; then max_idx=$(($index)) fi done for ((i=$max_idx;i>=0;i--)); do bm[$i]=0 done for core in $(echo $list | sed 's/,/ /g') do index=$(($core/32)) temp=$((1<<$(($core % 32)))) bm[$index]=$((${bm[$index]} | $temp)) done printf -v mask "%x" "${bm[$max_idx]}" for ((i=$max_idx-1;i>=0;i--)); do printf -v hex "%08x" "${bm[$i]}" mask+=$hex done printf "%s" "$mask" } 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 # 42477 is the kolla hugetlbfs gid value. getent group hugetlbfs >/dev/null || \ groupadd hugetlbfs -g 42477 && groupmod -g 42477 hugetlbfs pmd_cpu_mask=$( get_mask $PMD_CORES ) host_cpu_mask=$( get_mask $LCORE_LIST ) socket_mem=$(echo $SOCKET_MEMORY | sed s/\'//g ) ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=$socket_mem ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=$pmd_cpu_mask ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=$host_cpu_mask fi params: $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $LCORE_LIST: {get_param: HostCpusList} $PMD_CORES: {get_param: NeutronDpdkCoreList} $SOCKET_MEMORY: {get_param: NeutronDpdkSocketMemory}
tuned
設定を定義して CPU アフィニティーを提供します。install_tuned: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash 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 # Install the tuned package yum install -y tuned-profiles-cpu-partitioning tuned_conf_path="/etc/tuned/cpu-partitioning-variables.conf" if [ -n "$TUNED_CORES" ]; then grep -q "^isolated_cores" $tuned_conf_path if [ "$?" -eq 0 ]; then sed -i 's/^isolated_cores=.*/isolated_cores=$TUNED_CORES/' $tuned_conf_path else echo "isolated_cores=$TUNED_CORES" >> $tuned_conf_path fi tuned-adm profile cpu-partitioning fi fi params: $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $TUNED_CORES: {get_param: HostIsolatedCoreList}
カーネルの引数を設定します。
compute_kernel_args: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash 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 sed 's/^\(GRUB_CMDLINE_LINUX=".*\)"/\1 $KERNEL_ARGS isolcpus=$TUNED_CORES"/g' -i /etc/default/grub ; grub2-mkconfig -o /etc/grub2.cfg reboot fi params: $KERNEL_ARGS: {get_param: ComputeKernelArgs} $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $TUNED_CORES: {get_param: HostIsolatedCoreList}
4.2.2. network-environment.yaml の変更
resource_registry
セクションに OVS-DPDK 用のカスタムリソースを追加します。resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::Compute::Net::SoftwareConfig: nic-configs/compute.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml OS::TripleO::NodeUserData: first-boot.yaml
parameter_defaults
セクションにおいて、トンネル種別を無効にし (値を""
に設定)、ネットワーク種別をvlan
に設定します。NeutronTunnelTypes: '' NeutronNetworkType: 'vlan'
parameter_defaults
セクションにおいて、物理ネットワークを仮想ブリッジにマッピングします。NeutronBridgeMappings: 'tenant:br-link0'
parameter_defaults
セクションにおいて、OpenStack Networking ML2 および Open vSwitch VLAN のマッピング範囲を設定します。NeutronNetworkVLANRanges: 'tenant:22:22,tenant:25:25'
上記の例では、物理ネットワーク上の VLAN 範囲を設定しています。
parameter_defaults
セクションにおいて、OVS-DPDK の設定パラメーターを定義します。注記NeutronDPDKCoreList
とNeutronDPDKMemoryChannels
は、本手順では 必須の 設定です。適切な値を設定せずに DPDK のデプロイメントを試みると、デプロイメントが失敗したり、不安定なデプロイメントになったりします。DPDK Poll Mode Driver (PMD) として使用することのできる CPU コアの一覧を、
[allowed_pattern: "'[0-9,-]+'"]
の形式で指定します。NeutronDpdkCoreList: "'2,22,3,23'"
注記ゲストインスタンス作成の失敗を避けるために、DPDK PMD 用の DPDK NIC の有無にかかわらず、各 NUMA ノード上で少なくとも 1 つの CPU を (シブリングスレッドと共に) 割り当てる必要があります。
OVS-DPDK のパフォーマンスを最適化するために、以下のオプションを検討してください。
-
DPDK インターフェースの NUMA ノードに関連付けられた CPU を選択する。インターフェースに関連付けられた NUMA ノードを一覧表示するには、
cat /sys/class/net/<interface>/device/numa_node
を使用します。その NUMA ノードに関連付けられた CPU を一覧表示するには、lscpu
を使用します。 -
CPU シブリングをまとめてグループ化する (ハイパースレッディングの場合)。CPU のシブリングを確認するには、
cat /sys/devices/system/cpu/<cpu>/topology/thread_siblings_list
を使用します。 - ホストプロセス用に CPU 0 を確保する。
- ホストプロセスが PMD に割り当てられた CPU を使用しないように、これらの CPU を分離する。
NovaVcpuPinset
を使用して、PMD に割り当てられた CPU を Compute のスケジューリングから除外する。メモリーチャネルの数を、
[allowed_pattern: "[0-9]+"]
の形式で指定します。NeutronDpdkMemoryChannels: "4"
ソケットごとに、ヒュージページプールから事前に割り当てられたメモリーを設定します。
NeutronDpdkSocketMemory: "'3072,1024'"
CPU ソケットの降順で、形式はコンマ区切り文字列です。上記の例は 2 つの NUMA ノード構成を前提とし、ソケット 0 およびソケット 1 を設定してそれぞれ 1024 MB のヒュージページを事前割り当てします。NUMA ノードが 1 つのシステムでは、この値を 1024,0 に設定します。
OVS ブリッジの DPDK ドライバーの種別を設定します。
NeutronDpdkDriverType: "vfio-pci"
parameter_defaults
セクションにおいて、OVS 用の vhost-user ソケットディレクトリーを設定します。NeutronVhostuserSocketDir: "/var/lib/vhost_sockets"
parameter_defaults
セクションにおいて、ホストプロセス用の RAM を確保します。NovaReservedHostMemory: 4096
parameter_defaults
セクションにおいて、仮想マシンプロセス用に確保する物理 CPU コアのコンマ区切りリストまたは範囲を設定します。NovaVcpuPinSet: "4-19,24-39"
parameter_defaults
セクションにおいて、適用可能なフィルターの一覧を設定します。Nova スケジューラーは、ここで指定するリスト順にこれらのフィルターを適用します。ノードに対するフィルタリングのプロセスがより効率的になるように、最も制限の厳しいフィルターを最初に設定します。
NovaSchedulerDefaultFilters: - "RetryFilter" - "AvailabilityZoneFilter" - "RamFilter" - "ComputeFilter" - "ComputeCapabilitiesFilter" - "ImagePropertiesFilter" - "ServerGroupAntiAffinityFilter" - "ServerGroupAffinityFilter" - "PciPassthroughFilter" - "NUMATopologyFilter" - "AggregateInstanceExtraSpecsFilter"
parameter_defaults
セクションにおいて、ComputeKernelArgs
パラメーターを追加して、初回ブート時にこれらのパラメーターをデフォルトのgrub
ファイルに追加します。ComputeKernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on"
注記これらのヒュージページは仮想マシンよって消費されると共に、本手順に示すように
NeutronDpdkSocketMemory
パラメーターを使用して OVS-DPDK によって消費されます。仮想マシンが利用可能なヒュージページの数は、boot
パラメーターからNeutronDpdkSocketMemory
を減算した値です。DPDK インスタンスに関連付けるフレーバーに
hw:mem_page_size=1GB
を追加する必要があります。追加しない場合、DHCP による割り当てがインスタンスに適用されません。parameter_defaults
セクションにおいて、チューニングする物理 CPU コアの一覧または範囲を設定します。指定した引数がチューニングされた
cpu-partitioning
プロファイルに追加されます。HostIsolatedCoreList: "2-19,22-39"
parameters_default
セクションにおいて、論理 OVS-DPDK コアの一覧を設定します。これらのコアは、NeutronDpdkCoreList
およびNovaVcpuPinSet
のコアの一覧と相互に排他的でなければなりません。HostCpusList: "'0,20,1,21'"
4.2.3. controller.yaml の変更
独立したプロビジョニングインターフェースを作成します。
network_config: - type: interface name: nic1 use_dhcp: false defroute: false - type: interface name: nic2 addresses: - ip_netmask: list_join: - '/' - - {get_param: ControlPlaneIp} - {get_param: ControlPlaneSubnetCidr} routes: - ip_netmask: 169.254.169.254/32 next_hop: {get_param: EC2MetadataIp}
分離ネットワーク用のコントロールプレーンの Linux ボンディングを作成します。
type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: {get_param: DnsServers} members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: {get_param: InternalApiNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: InternalApiIpSubnet} - type: vlan vlan_id: {get_param: TenantNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: TenantIpSubnet} - type: vlan vlan_id: {get_param: StorageNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageIpSubnet} - type: vlan vlan_id: {get_param: StorageMgmtNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageMgmtIpSubnet} - type: vlan vlan_id: {get_param: ExternalNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: ExternalIpSubnet} routes: - default: true next_hop: {get_param: ExternalInterfaceDefaultRoute}
neutron-dhcp-agent および neutron-metadata-agent サービスにアクセスするための OVS ブリッジを作成します。
- 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
4.2.4. compute.yaml の変更
デフォルトの compute.yaml
ファイルを編集し、以下のように変更します。
独立したプロビジョニングインターフェースを作成します。
network_config: - type: interface name: nic1 use_dhcp: false defroute: false - type: interface name: nic2 use_dhcp: false addresses: - ip_netmask: list_join: - '/' - - {get_param: ControlPlaneIp} - {get_param: ControlPlaneSubnetCidr} routes: - ip_netmask: 169.254.169.254/32 next_hop: {get_param: EC2MetadataIp} - default: true next_hop: {get_param: ControlPlaneDefaultRoute}
分離ネットワーク用のコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: {get_param: DnsServers} members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: {get_param: InternalApiNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: InternalApiIpSubnet} - type: vlan vlan_id: {get_param: TenantNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: TenantIpSubnet} - type: vlan vlan_id: {get_param: StorageNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageIpSubnet}
OVS-DPDK データプレーンボンディングの 2 つの DPDK ポートを持つ構成されるブリッジを設定し、コントローラーにリンクします。
- type: ovs_user_bridge name: br-link use_dhcp: false 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
注記複数の DPDK デバイスを含めるには、追加する DPDK デバイスごとに
type
のコードセクションを繰り返します。注記OVS-DPDK を使用する場合には、同じコンピュートノード上の 全 ブリッジが
ovs_user_bridge
の種別である必要があります。同じノード上でovs_bridge
とovs_user_bridge
が混在する構成は、director では受け入れ可能ですが、Red Hat OpenStack Platform ではサポートされていません。
4.2.5. overcloud_deploy.sh スクリプトを実行します。
bash スクリプトに記述した OVS-DPDK 環境用の openstack overcloud deploy
コマンドの例を以下に示します。
#!/bin/bash openstack overcloud deploy \ --templates \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/ovs-dpdk-permissions.yaml \ -e /home/stack/ospd-10-vlan-dpdk-two-ports-ctlplane-dataplane-bonding/network-environment.yaml
-
/usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml
はデフォルトのneutron-ovs-dpdk.yaml
ファイルの場所です。これにより Compute ロールの OVS-DPDK パラメーターを有効にします。 -
/home/stack/<relative-directory>/network-environment.yaml
はnetwork-environment.yaml
ファイルへのパスです。このファイルを使用して、neutron-ovs-dpdk.yaml
ファイルからのデフォルト値を上書きします。
この構成の OVS-DPDK は、セキュリティーグループおよびライブマイグレーションをサポートしません。
4.3. VXLAN トンネリングを使用する単一ポート OVS-DPDK の設定
本項では、OpenStack 環境用に、コントロールプレーンの Linux ボンディングおよび VXLAN トンネリングと共に、単一ポートの OVS-DPDK を設定する手順について説明します。
4.3.1. Modify first-boot.yaml
first-boot.yaml
ファイルを変更し、OVS および DPDK パラメーターを設定し、CPU アフィニティー用に tuned
を設定します。
以前のデプロイメントで first-boot.yaml
ファイルに以下の行を追加している場合、Open vSwitch 2.9 を使用する Red Hat OpenStack Platform 10 ではこれらの行を削除してください。
ovs_service_path="/usr/lib/systemd/system/ovs-vswitchd.service" grep -q "RuntimeDirectoryMode=.*" $ovs_service_path if [ "$?" -eq 0 ]; then sed -i 's/RuntimeDirectoryMode=.*/RuntimeDirectoryMode=0775/' $ovs_service_path else echo "RuntimeDirectoryMode=0775" >> $ovs_service_path fi grep -Fxq "Group=qemu" $ovs_service_path if [ ! "$?" -eq 0 ]; then echo "Group=qemu" >> $ovs_service_path fi grep -Fxq "UMask=0002" $ovs_service_path if [ ! "$?" -eq 0 ]; then echo "UMask=0002" >> $ovs_service_path fi ovs_ctl_path='/usr/share/openvswitch/scripts/ovs-ctl' grep -q "umask 0002 \&\& start_daemon \"\$OVS_VSWITCHD_PRIORITY\"" $ovs_ctl_path if [ ! "$?" -eq 0 ]; then sed -i 's/start_daemon \"\$OVS_VSWITCHD_PRIORITY.*/umask 0002 \&\& start_daemon \"$OVS_VSWITCHD_PRIORITY\" \"$OVS_VSWITCHD_WRAPPER\" \"$@\"/' $ovs_ctl_path fi
新たなリソースを追加します。
resources: userdata: type: OS::Heat::MultipartMime properties: parts: - config: {get_resource: set_dpdk_params} - config: {get_resource: install_tuned} - config: {get_resource: compute_kernel_args}
DPDK パラメーターを設定します。
set_dpdk_params: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash set -x get_mask() { local list=$1 local mask=0 declare -a bm max_idx=0 for core in $(echo $list | sed 's/,/ /g') do index=$(($core/32)) bm[$index]=0 if [ $max_idx -lt $index ]; then max_idx=$(($index)) fi done for ((i=$max_idx;i>=0;i--)); do bm[$i]=0 done for core in $(echo $list | sed 's/,/ /g') do index=$(($core/32)) temp=$((1<<$(($core % 32)))) bm[$index]=$((${bm[$index]} | $temp)) done printf -v mask "%x" "${bm[$max_idx]}" for ((i=$max_idx-1;i>=0;i--)); do printf -v hex "%08x" "${bm[$i]}" mask+=$hex done printf "%s" "$mask" } 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 # 42477 is the kolla hugetlbfs gid value. getent group hugetlbfs >/dev/null || \ groupadd hugetlbfs -g 42477 && groupmod -g 42477 hugetlbfs pmd_cpu_mask=$( get_mask $PMD_CORES ) host_cpu_mask=$( get_mask $LCORE_LIST ) socket_mem=$(echo $SOCKET_MEMORY | sed s/\'//g ) ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=$socket_mem ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=$pmd_cpu_mask ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=$host_cpu_mask fi params: $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $LCORE_LIST: {get_param: HostCpusList} $PMD_CORES: {get_param: NeutronDpdkCoreList} $SOCKET_MEMORY: {get_param: NeutronDpdkSocketMemory}
tuned
設定を定義して CPU アフィニティーを提供します。install_tuned: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash 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 # Install the tuned package yum install -y tuned-profiles-cpu-partitioning tuned_conf_path="/etc/tuned/cpu-partitioning-variables.conf" if [ -n "$TUNED_CORES" ]; then grep -q "^isolated_cores" $tuned_conf_path if [ "$?" -eq 0 ]; then sed -i 's/^isolated_cores=.*/isolated_cores=$TUNED_CORES/' $tuned_conf_path else echo "isolated_cores=$TUNED_CORES" >> $tuned_conf_path fi tuned-adm profile cpu-partitioning fi fi params: $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $TUNED_CORES: {get_param: HostIsolatedCoreList}
カーネルの引数を設定します。
compute_kernel_args: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash 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 sed 's/^\(GRUB_CMDLINE_LINUX=".*\)"/\1 $KERNEL_ARGS isolcpus=$TUNED_CORES"/g' -i /etc/default/grub ; grub2-mkconfig -o /etc/grub2.cfg reboot fi params: $KERNEL_ARGS: {get_param: ComputeKernelArgs} $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $TUNED_CORES: {get_param: HostIsolatedCoreList}
4.3.2. network-environment.yaml の変更
resource_registry
セクションに OVS-DPDK 用のカスタムリソースを追加します。resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::Compute::Net::SoftwareConfig: nic-configs/compute.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml OS::TripleO::NodeUserData: first-boot.yaml
parameter_defaults
セクションにおいて、トンネルの種別とテナントの種別をvxlan
に設定します。NeutronTunnelTypes: 'vxlan' NeutronNetworkType: 'vxlan'
parameter_defaults
セクションにおいて、OVS-DPDK の設定パラメーターを定義します。注記NeutronDPDKCoreList
とNeutronDPDKMemoryChannels
は、本手順では 必須の 設定です。適切な値を設定せずに DPDK のデプロイメントを試みると、デプロイメントが失敗したり、不安定なデプロイメントになったりします。DPDK Poll Mode Driver (PMD) として使用することのできる CPU コアの一覧を、
[allowed_pattern: "'[0-9,-]+'"]
の形式で指定します。NeutronDpdkCoreList: "'2,22,3,23'"
注記ゲストインスタンス作成の失敗を避けるために、DPDK PMD 用の DPDK NIC の有無にかかわらず、各 NUMA ノード上で少なくとも 1 つの CPU を (シブリングスレッドと共に) 割り当てる必要があります。
OVS-DPDK のパフォーマンスを最適化するために、以下のオプションを検討してください。
-
DPDK インターフェースの NUMA ノードに関連付けられた CPU を選択する。インターフェースに関連付けられた NUMA ノードを一覧表示するには、
cat /sys/class/net/<interface>/device/numa_node
を使用します。その NUMA ノードに関連付けられた CPU を一覧表示するには、lscpu
を使用します。 -
CPU シブリングをまとめてグループ化する (ハイパースレッディングの場合)。CPU のシブリングを確認するには、
cat /sys/devices/system/cpu/<cpu>/topology/thread_siblings_list
を使用します。 - ホストプロセス用に CPU 0 を確保する。
- ホストプロセスが PMD に割り当てられた CPU を使用しないように、これらの CPU を分離する。
NovaVcpuPinset
を使用して、PMD に割り当てられた CPU を Compute のスケジューリングから除外する。メモリーチャネルの数を、
[allowed_pattern: "[0-9]+"]
の形式で指定します。NeutronDpdkMemoryChannels: "4"
ソケットごとに、ヒュージページプールから事前に割り当てられたメモリーを設定します。
NeutronDpdkSocketMemory: "'3072,1024'"
CPU ソケットの降順で、形式はコンマ区切り文字列です。NUMA ノードが 1 つのシステムでは、この値を 3072,0 に設定します。
OVS ブリッジの DPDK ドライバーの種別を設定します。
NeutronDpdkDriverType: "vfio-pci"
parameter_defaults
セクションにおいて、OVS 用の vhost-user ソケットディレクトリーを設定します。NeutronVhostuserSocketDir: "/var/lib/vhost_sockets"
parameter_defaults
セクションにおいて、ホストプロセス用の RAM を確保します。NovaReservedHostMemory: 4096
parameter_defaults
セクションにおいて、仮想マシンプロセス用に確保する物理 CPU コアのコンマ区切りリストまたは範囲を設定します。NovaVcpuPinSet: "4-19,24-39"
parameter_defaults
セクションにおいて、適用可能なフィルターの一覧を設定します。Nova スケジューラーは、ここで指定するリスト順にこれらのフィルターを適用します。ノードに対するフィルタリングのプロセスがより効率的になるように、最も制限の厳しいフィルターを最初に設定します。
NovaSchedulerDefaultFilters: - "RetryFilter" - "AvailabilityZoneFilter" - "RamFilter" - "ComputeFilter" - "ComputeCapabilitiesFilter" - "ImagePropertiesFilter" - "ServerGroupAntiAffinityFilter" - "ServerGroupAffinityFilter" - "PciPassthroughFilter" - "NUMATopologyFilter" - "AggregateInstanceExtraSpecsFilter"
parameter_defaults
セクションにおいて、ComputeKernelArgs
パラメーターを追加して、初回ブート時にこれらのパラメーターをデフォルトのgrub
ファイルに追加します。ComputeKernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on"
注記これらのヒュージページは仮想マシンよって消費されると共に、本手順に示すように
NeutronDpdkSocketMemory
パラメーターを使用して OVS-DPDK によって消費されます。仮想マシンが利用可能なヒュージページの数は、boot
パラメーターからNeutronDpdkSocketMemory
を減算した値です。DPDK インスタンスに関連付けるフレーバーに
hw:mem_page_size=1GB
を追加する必要があります。追加しない場合、DHCP による割り当てがインスタンスに適用されません。parameter_defaults
セクションにおいて、チューニングする物理 CPU コアの一覧または範囲を設定します。指定した引数がチューニングされた
cpu-partitioning
プロファイルに追加されます。HostIsolatedCoreList: "2-19,22-39"
parameters_default
セクションにおいて、論理 OVS-DPDK コアの一覧を設定します。これらのコアは、NeutronDpdkCoreList
およびNovaVcpuPinSet
のコアの一覧と相互に排他的でなければなりません。HostCpusList: "'0,20,22-39'"
4.3.3. controller.yaml の変更
独立したプロビジョニングインターフェースを作成します。
network_config: - type: interface name: nic1 use_dhcp: false defroute: false - type: interface name: nic2 addresses: - ip_netmask: list_join: - '/' - - {get_param: ControlPlaneIp} - {get_param: ControlPlaneSubnetCidr} routes: - ip_netmask: 169.254.169.254/32 next_hop: {get_param: EC2MetadataIp}
分離ネットワーク用のコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: {get_param: DnsServers} members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: {get_param: InternalApiNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: InternalApiIpSubnet} - type: vlan vlan_id: {get_param: StorageNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageIpSubnet} - type: vlan vlan_id: {get_param: StorageMgmtNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageMgmtIpSubnet} - type: vlan vlan_id: {get_param: ExternalNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: ExternalIpSubnet} routes: - default: true next_hop: {get_param: ExternalInterfaceDefaultRoute}
neutron-dhcp-agent および neutron-metadata-agent サービスにアクセスするための OVS ブリッジを作成します。
- 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}
4.3.4. compute.yaml の変更
デフォルトの compute.yaml
ファイルから compute-ovs-dpdk.yaml
ファイルを作成し、次のように変更します。
独立したプロビジョニングインターフェースを作成します。
network_config: - type: interface name: nic1 use_dhcp: false defroute: false - type: interface name: nic2 use_dhcp: false addresses: - ip_netmask: list_join: - '/' - - {get_param: ControlPlaneIp} - {get_param: ControlPlaneSubnetCidr} routes: - ip_netmask: 169.254.169.254/32 next_hop: {get_param: EC2MetadataIp} - default: true next_hop: {get_param: ControlPlaneDefaultRoute}
分離ネットワーク用のコントロールプレーンの Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: {get_param: DnsServers} members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: {get_param: InternalApiNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: InternalApiIpSubnet} - type: vlan vlan_id: {get_param: StorageNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageIpSubnet}
コントローラーにリンクする DPDK ポートを備えたブリッジを設定します。
- 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
注記複数の DPDK デバイスを含めるには、追加する DPDK デバイスごとに
type
のコードセクションを繰り返します。注記OVS-DPDK を使用する場合には、同じコンピュートノード上の 全 ブリッジが
ovs_user_bridge
の種別である必要があります。同じノード上でovs_bridge
とovs_user_bridge
が混在する構成は、director では受け入れ可能ですが、Red Hat OpenStack Platform ではサポートされていません。
4.3.5. overcloud_deploy.sh スクリプトを実行します。
bash スクリプトに記述した OVS-DPDK 環境用の openstack overcloud deploy
コマンドの例を以下に示します。
#!/bin/bash openstack overcloud deploy \ --templates \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/ovs-dpdk-permissions.yaml \ -e /home/stack/ospd-10-vxlan-dpdk-single-port-ctlplane-bonding/network-environment.yaml
-
/usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml
はデフォルトのneutron-ovs-dpdk.yaml
ファイルの場所です。これにより Compute ロールの OVS-DPDK パラメーターを有効にします。 -
/home/stack/<relative-directory>/network-environment.yaml
はnetwork-environment.yaml
ファイルへのパスです。このファイルを使用して、neutron-ovs-dpdk.yaml
ファイルからのデフォルト値を上書きします。
この構成の 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 値を設定するには、以下の手順を実行します。
network-environment.yaml
ファイルでNeutronGlobalPhysnetMtu
パラメーターを設定します。parameter_defaults: # Global MTU configuration on Neutron NeutronGlobalPhysnetMtu: 9000
注記network-environment.yaml
ファイルの NeutronDpdkSocketMemory の値がジャンボフレームをサポートするのに十分な容量であることを確認します。詳しくは、「メモリーパラメーター」を参照してください。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-DPDK を使用する場合には、コンピュートノード上の 全 ブリッジの種別が
ovs_user_bridge
でなければなりません。ovs_bridge
とovs_user_bridge
が混在する構成は、director では受け入れ可能ですが、Red Hat OpenStack Platform ではサポートされていません。
4.7. OVS-DPDK 用フレーバーの作成とインスタンスのデプロイ
NFV を実装する Red Hat OpenStack Platform デプロイメントの OVS-DPDK の設定を完了した後には、以下の手順に従ってフレーバーを作成してインスタンスをデプロイすることができます。
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
フレーバーを作成します。
# openstack flavor create <flavor --ram <MB> --disk <GB> --vcpus <#>
追加のフレーバー属性を設定します。定義したメタデータ (
"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>
ネットワークを作成します。
# openstack network create net1 --provider-physical-network tenant --provider-network-type vlan --provider-segment <VLAN-ID>
サブネットを作成します。
# openstack subnet create subnet1 --network net1 --subnet-range 192.0.2.0/24 --dhcp
インスタンスをデプロイします。
# openstack server create --flavor <flavor> --image <glance_image> --nic net-id=net1 <name>
これで、NFV ユースケースで OVS-DPDK 用インスタンスがデプロイされました。
4.7.1. エミュレータースレッドの固定によるパフォーマンスの最適化
パフォーマンスを改善するために、Qemu エミュレータースレッドを代替のコアに固定することができます。
インスタンスの仮想 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'/>
エミュレータースレッドを固定するコアを選択します。選択したコアが NovaVcpuPinSet の一覧に含まれることを確認します。
#virsh emulatorpin <vm-name> --cpulist 2
注記エミュレーター固定スレッドに関連付けられる物理 CPU は、
NovaVcpuPinSet
の一覧に含まれる仮想 CPU の 1 つ (ハイパースレッディングが有効な場合は 2 つのスレッド) を使用します。
4.8. 設定のトラブルシューティング
本項では、DPDK-OVS 設定のトラブルシューティングの手順を説明します。
ブリッジの設定を見直して、ブリッジが
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
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
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