azeqjz OpenStack: 紅帽O(jiān)SP10 NFV配置指南: 4. 配置OVS+DPDK
4 配置OVS+DPDK
這一章節(jié)包括OVS+DPDK在Red Hat OpenStack Platform環(huán)境下的部署與調(diào)測(cè)。參考以下文檔OVS-DPDK部署規(guī)劃以了解配置OVS-DPDK的配置參數(shù)。NETWORK FUNCTIONS VIRTUALIZATION PLANNING GUIDE > Chapter 6. Planning Your OVS-DPDK Deployment
- 4.1 單OVS-DPDK數(shù)據(jù)面 單OVS網(wǎng)橋 單端口
- 4.2 雙OVS-DPDK數(shù)據(jù)面 雙OVS網(wǎng)橋 雙端口
- 4.3 單OVS-DPDK數(shù)據(jù)面 單OVS網(wǎng)橋 雙端口
- 4.5 配置OVS-DPDK可組合角色
- 4.6 設(shè)置OVS-DPDK接口的MTU值
注意:本指南提供了CPU使用、內(nèi)存分配與網(wǎng)卡配置等示例,在不同的拓?fù)渑cuse case下,這可能都不一樣。硬件與配置選項(xiàng),可以參考NFV產(chǎn)品指南與NFV規(guī)劃指南。
OVS+DPDK的優(yōu)點(diǎn)
DPDK是Intel實(shí)現(xiàn)的一個(gè)用戶態(tài)高速數(shù)據(jù)包處理框架,相比于Linux內(nèi)核實(shí)現(xiàn)的數(shù)據(jù)包處理方式,有以下優(yōu)勢(shì)。
- 用戶態(tài)驅(qū)動(dòng)程序,避免不必要的內(nèi)存拷貝和系統(tǒng)調(diào)用。
- 使用輪詢方式從網(wǎng)卡獲取數(shù)據(jù)包,避免中斷方式的上下文切換開銷。
- 獨(dú)占CPU處理數(shù)據(jù)包,雖然在網(wǎng)絡(luò)流量低的時(shí)候浪費(fèi)CPU資源,但是網(wǎng)絡(luò)流量高的時(shí)候處理數(shù)據(jù)包性能很好,可以避免CPU切換導(dǎo)致的cache miss和上下文切換。最新DPDK可以實(shí)現(xiàn)流量小的時(shí)候使用中斷方式,流量大的時(shí)候使用輪詢方式。
- 內(nèi)存訪問優(yōu)化,充分利用NUMA架構(gòu),大頁(yè)內(nèi)存,無鎖隊(duì)列實(shí)現(xiàn)數(shù)據(jù)包的并發(fā)高效處理。
- 軟件的優(yōu)化,比如cache line對(duì)齊,CPU預(yù)取數(shù)據(jù),充分利用IntelCPU的網(wǎng)絡(luò)相關(guān)新指令來提升性能。
- 充分利用網(wǎng)卡的Offload功能實(shí)現(xiàn)硬件加速。
雖然DPDK對(duì)于數(shù)據(jù)包處理性能很好,但是它只是將數(shù)據(jù)包高效的送給用戶態(tài),而沒有網(wǎng)絡(luò)棧去處理數(shù)據(jù)包,社區(qū)版DPDK也無法與Linux網(wǎng)絡(luò)棧很好結(jié)合,所以基于Linux網(wǎng)絡(luò)棧實(shí)現(xiàn)的網(wǎng)絡(luò)應(yīng)用程序無法直接使用DPDK,如果要使用DPDK,應(yīng)用程序需要重寫。當(dāng)然如果是全新的網(wǎng)絡(luò)程序,基于DPDK開發(fā)是個(gè)不錯(cuò)的選擇。
原文:x86服務(wù)器中網(wǎng)絡(luò)性能分析與調(diào)優(yōu)
在接下來的流程中,我們需要:
- 更新
network-environment.yaml以包含內(nèi)核參數(shù)和DPDK參數(shù)。 - 更新
compute.yaml以包含DPDK接口參數(shù)中的Bridge。 - 更新
controller.yaml以包含DPDK接口參數(shù)中的同一個(gè)Bridge的細(xì)節(jié)。 - 執(zhí)行
overcloud_deploy.sh腳本部署含有DPDK的overcloud。

在開始之前,需要確保有:
- 基于RHEL7.3的Red Hat OpenStack Platform 10
- OVS-DPDK 2.6
- 已經(jīng)通過測(cè)試的網(wǎng)卡. 獲取通過測(cè)試的NFV網(wǎng)卡列表,參考 NETWORK FUNCTIONS VIRTUALIZATION PLANNING GUIDE > 3.2. Tested NICs。
注意:部署OVS-DPDK時(shí),Red Hat OpenStack Platform 10(OVS2.6)以O(shè)VS服務(wù)器模式運(yùn)行。在OVS服務(wù)器模式中,如果OVS重啟,要求重啟所有連接到該OVS的虛擬機(jī)實(shí)例。
4.1. 配置單網(wǎng)口OVS-DPDK與VLAN Tunneling
*單OVS-DPDK數(shù)據(jù)面 單OVS網(wǎng)橋 單端口 *
這一節(jié)包括配置與部署單數(shù)據(jù)平面端口的OVS-DPDK,同時(shí)配置OpenStack環(huán)境的控制面Linux網(wǎng)橋綁定。
4.1.1. 修改first-boot.yaml
修改first-boot.yaml,定義OVS與DPDK參數(shù),配置CPU親和性為tuned。
- 增加額外資源
resources:
userdata:
type: OS::Heat::MultipartMime
properties:
parts:
- config: {get_resource: set_ovs_config}
- config: {get_resource: set_dpdk_params}
- config: {get_resource: install_tuned}
- config: {get_resource: compute_kernel_args}
- OVS配置。
set_ovs_config:
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
if [ -f /usr/lib/systemd/system/openvswitch-nonetwork.service ]; then
ovs_service_path="/usr/lib/systemd/system/openvswitch-nonetwork.service"
elif [ -f /usr/lib/systemd/system/ovs-vswitchd.service ]; then
ovs_service_path="/usr/lib/systemd/system/ovs-vswitchd.service"
fi
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
fi
params:
$COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}
- 設(shè)置DPDK參數(shù)
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
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}
- 設(shè)置
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
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}
- 設(shè)置內(nèi)核參數(shù)
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.1.2. 修改 post-install.yaml
- 設(shè)置
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.1.3. 修改 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-ovs-dpdk.yaml
OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml
OS::TripleO::NodeUserData: first-boot.yaml
OS::TripleO::NodeExtraConfigPost: post-install.yaml
- 在
parameter_defaults,關(guān)閉tunnel類型(設(shè)置值為""),設(shè)置網(wǎng)絡(luò)類型為vlan。
NeutronTunnelTypes: ""
NeutronNetworkType: 'vlan'
- 更新
parameter_defaults,關(guān)聯(lián)物理網(wǎng)絡(luò)到虛擬網(wǎng)橋。
NeutronBridgeMappings: 'dpdk:br-link'
- 更新
parameter_defaults,設(shè)置OpenStack網(wǎng)絡(luò)ML2與OVS VLAN映射范圍。
NeutronNetworkVLANRanges: 'dpdk:22:22'
這個(gè)示例在物理網(wǎng)絡(luò)(dpdk_data)上設(shè)置VLAN范圍。
- 在
parameter_defaults下設(shè)置OVS-DPDK配置參數(shù)。
注意:NeutronDPDKCoreList 和NeutronDPDKMemoryChannels是必要的配置,如果部署DPDK時(shí)此參數(shù)值不正確,部署會(huì)失敗,或者導(dǎo)致不穩(wěn)定。
ⅰ 提供可以被用來作DPDK輪循模式驅(qū)動(dòng)(DPDK poll mode drivers,PMDs)的CPU核列表,格式為[allowed_pattern: "'[0-9,-]+'"]。
NeutronDpdkCoreList: "'4,6,20,22'"
可通過以下選項(xiàng)優(yōu)化OVS-DPDK性能:
- 配置CPU與DPDK接口的NUMA節(jié)點(diǎn)關(guān)聯(lián)。
使用cat /sys/class/net/<interface>/device/numa_node列出與接口關(guān)聯(lián)的NUMA節(jié)點(diǎn),使用lscpu列出與NUMA節(jié)點(diǎn)關(guān)聯(lián)的CPU。 - 超線程情況下把CPU sibling放到同個(gè)組里( 什么是CPU sibling? )。
使用cat /sys/devices/system/cpu/<cpu>/topology/thread_siblings_list查詢CPU sibling。 - 為主機(jī)進(jìn)程預(yù)留CPU 0。
- 隔離分配給PMD的CPU,保證主機(jī)進(jìn)程不使用這些CPU。
- 使用
NovaVcpuPinset把分配給PMD的CPU從計(jì)算調(diào)度中排除。
》 Type 1: DPDK PMD使用,NeutronDpdkCoreList;Type 2:宿主機(jī)進(jìn)程使用,HostCpusList;Type 3:虛擬機(jī)使用,NovaVcpuPinset。
》 NovaVcpuPinSet + NeutronDpdkCoreList = HostIsolatedCoreList
ⅱ提供內(nèi)存通道的數(shù)量,格式[allowed_pattern: "[0-9]+"]
NeutronDpdkMemoryChannels: "4"
ⅲ 設(shè)置從CPU socket的大頁(yè)池中預(yù)分配的內(nèi)存。
NeutronDpdkSocketMemory: "2048,2048"
這是用逗號(hào)分隔的字符串,按照CPU socket升序排列。如果只有一個(gè)NUMA節(jié)點(diǎn),則設(shè)置為 1024,0 。
ⅳ 設(shè)置DPDK驅(qū)動(dòng)類型與數(shù)據(jù)通道類型。
NeutronDpdkDriverType: "vfio-pci"
NeutronDatapathType: "netdev"
- 在
parameter_defaults下設(shè)置OVS的vhost-user socket目錄。
NeutronVhostuserSocketDir: "/var/run/openvswitch"
- 在
parameter_defaults下預(yù)留給主機(jī)進(jìn)程的RAM。
NovaReservedHostMemory: 2048
- 在
parameter_defaults下,設(shè)置預(yù)留給虛擬機(jī)進(jìn)程的物理CPU核范圍,以逗號(hào)分隔。
NovaVcpuPinSet: "8,10,12,14,18,24,26,28,30"
- 在
parameter_defaults下,列出使用的過濾器。
Nova scheduler使用這些列出來的過濾器。優(yōu)先列出最有拘束力的過濾器,以使節(jié)點(diǎn)的過濾進(jìn)程更加高效運(yùn)行。
NovaSchedulerDefaultFilters: "RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter,NUMATopologyFilter"
- 在
parameter_defaults下,增加ComputeKernelArgs參數(shù),以在初次啟動(dòng)時(shí)增加這些參數(shù)到默認(rèn)的grub文件中。
ComputeKernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on"
注意:這些大頁(yè)內(nèi)存會(huì)被虛擬機(jī)消耗使用,也會(huì)被OVS-DPDK使用,如在此步驟中的NeutronDpdkSocketMemory參數(shù)所示??梢员惶摂M機(jī)使用的大頁(yè)內(nèi)存頁(yè)數(shù)是引導(dǎo)參數(shù)減去NeutronDpdkSocketMemory。
需要在使用DPDK的虛擬機(jī)實(shí)例flavor中添加hw:mem_page_size=1GB。如果沒有做這一步,虛擬機(jī)實(shí)例會(huì)無法獲取DHCP分配(大頁(yè)內(nèi)存?)。
- 在
parameter_defaults下,設(shè)置需要調(diào)整的物理CPU核范圍。
參數(shù)在附錄調(diào)整文檔cpu-partitioning中。
HostIsolatedCoreList: "2,4,6,8,10,12,14,18,20,22,24,26,28,30"
- 在
parameter_defaults下,設(shè)置邏輯OVS-DPDK核列表。這些CPU核必須要手工從NeutronDpdkCoreList與NovaVcpuPinSet列表中排除出去。
HostCpusList: "'3,5,7,19,21,23'"
4.1.4. 修改 controller.yaml
- 創(chuàng)建一個(gè)獨(dú)立的provisioning接口。
-
type: interface
name: nic1
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: ExternalInterfaceDefaultRoute}
- 為隔離的網(wǎng)絡(luò)創(chuàng)建控制面Linux綁定。
-
type: linux_bond
name: bond_api
bonding_options: "mode=active-backup"
use_dhcp: false
dns_servers: {get_param: DnsServers}
members:
-
type: interface
name: nic2
primary: true
-
type: interface
name: nic3
- 為L(zhǎng)inux綁定分配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}
- 為計(jì)算節(jié)點(diǎn)創(chuàng)建VOS網(wǎng)橋。
-
type: ovs_bridge
name: br-link
use_dhcp: false
members:
-
type: interface
name: nic4
4.1.5. 修改compute.yaml
復(fù)制默認(rèn)的compute.yaml為compute-ovs-dpdk.yaml,并且修改一下內(nèi)容:
- 創(chuàng)建分離的provisioning接口。
-
type: interface
name: nic1
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}
- 為隔離的網(wǎng)絡(luò)創(chuàng)建控制面Linux綁定。
-
type: linux_bond
name: bond_api
bonding_options: "mode=active-backup"
use_dhcp: false
dns_servers: {get_param: DnsServers}
members:
-
type: interface
name: nic2
primary: true
-
type: interface
name: nic3
- 分配VLAN給這個(gè)Linux綁定。
-
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}
- 設(shè)置有DPDK接口的網(wǎng)橋,以連接到控制節(jié)點(diǎn)。
-
type: ovs_user_bridge
name: br-link
use_dhcp: false
members:
-
type: ovs_dpdk_port
name: dpdk0
members:
-
type: interface
name: nic4
注意:
如果有多個(gè)DPDK設(shè)備,為每個(gè)需要添加的DPDK設(shè)備復(fù)制一遍type字段即可。
注意:
使用OVS-DPDK時(shí),在同一個(gè)計(jì)算節(jié)點(diǎn)上的所有網(wǎng)橋類型應(yīng)該為ovs_user_bridge。當(dāng)不是這個(gè)類型時(shí),雖然Director可能會(huì)接受這個(gè)配置,但是Red Hat OpenStack Platform不支持同個(gè)節(jié)點(diǎn)上同時(shí)有ovs_bridge和ovs_user_bridge。
4.1.6. 執(zhí)行 overcloud_deploy.sh 腳本
以下例子定義bash腳本中的OVS-DPDK環(huán)境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 /home/stack/ospd-10-vlan-dpdk-single-port-ctlplane-bonding/network-environment.yaml
/usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dpdk.yaml是默認(rèn)neutron-ovs-dpdk.yaml文件的位置,這使能計(jì)算節(jié)點(diǎn)的OVS-DPDK參數(shù)。/home/stack/<relative-directory>/network-environment.yaml是network-environment.yaml文件的路徑。使用這個(gè)文件來覆蓋neutron-ovs-dpdk.yaml文件的默認(rèn)值。
注意:
overcloud部署后,需要重啟計(jì)算節(jié)點(diǎn)以執(zhí)行tuned文件。
注意:
此OVS-DPDK配置不支持安全組與熱遷移。