1 前言
近期在研究NFV的网络性能测试,考虑到NFV的网络性能的转发瓶颈,现在的商用NFV产品都会使用诸如DPDK、SR_IOV等网络加速技术,相应的也就需要对应的硬件支持。在尝试部署后本文总结一下使用OPNFV的E版本部署DPDK场景的过程,部署过程中需要修改配置文件以匹配硬件。
2 配置文件修改
2.1 部署节点配置修改
部署节点的配置文件修改主要是增加DPDK网卡的PCI地址和MAC地址,原配置文件参看Euphrates部署(二)的2.1节。
2.1.1 idf-pod1.yaml修改
在network字段下增加dpdk网卡名,总线地址,接口参数三项
1 | network: |
2.1.2 pod1.yaml修改
修改private网络接口为4,接口数按照idf-pod1.yaml的busaddr
字段下网卡总线地址顺序确定,从0开始计数。
1 | private: |
在compute节点上增加DPDK网卡的MAC地址,以及添加DPDK
特性字段,Fuel在部署过程中并不是按照节点名称来确定节点类型的,而是按照节点顺序来配置,前三个节点为控制节点,后两个节点为计算节点。
1 | - name: compute1 |
2.2 openstack部署相关配置文件修改
OPNFV的Fuel部署中目前只有一种策略默认支持DPDK,即os-nosdn-ovs-ha
,打开mcp/config/scenario/baremetal/os-nosdn-ovs-ha.yaml
文件开一看DPDK字样。
1 |
|
在部署DPDK场景前需要修改配置文件mcp/reclass/classes/cluster/baremetal-mcp-ocata-ovs-dpdk-ha/openstack/init.yml
[1],配置文件的内容如下:
1 |
|
配置文件的参数说明如下:
- neutron_tenant_network_types:表明openstack中将要使用的网络类型,vlan是指创建的虚拟机之间通信的网络类型;
- neutron_tenant_vlan_range:openstack创建的vlan网络vlan范围,需要在物理交换机上进行配置运行该段的vlan数据包通过,否则创建的虚拟机无法进行通信;
- nova_cpu_pinning:计算节点分配给openstack的cpu核心数目,本次部署使用的物理服务器核心为2(CPU)*4(core),共有8个核心,openvswitch和计算节点自身也需要占用cpu资源因此不能完全分配给openstack,同时考虑到dpdk策略下vswitch的核心独占,该项数值与compute_ovs_pmd_cpu_mask和compute_ovs_dpdk_lcore_mask是互斥的;
- compute_hugepages_size:计算节点的大页内存配置,默认一个页面是2M;
- compute_hugepages_count:大页内存页面个数,本次部署中计算节点的物理内存是32G,本次分配给计算资源的大页内存总数为8192*2M=16G内存;
- compute_kernel_isolcpu:计算节点cpu核心隔离,设置计算节点的内核不要使用这些核心;
- compute_dpdk_driver:dpdk使用的内核模块;
- compute_ovs_pmd_cpu_mask:为了保证转发性能需要给ovs的PMD分配核心独占,CPU核心的分配采用掩码的方式,如本文中将cpu7分配给OVS,则掩码为0x80,cpu数从0开始计算,同时尽量将DPDK和OVS分配的核心在同一个NUMA节点上,关于OVS下的DPDK配置可以查阅官方手册[2];
- compute_ovs_dpdk_socket_mem:分配给dpdk的大页内存数,每个NUMA节点各4个G;
- compute_ovs_dpdk_lcore_mask:ovs中dpdk占用核心,同样采用掩码计算方式,最好与dpdk网卡所在NUMA节点一致,可以通过查看
/sys/bus/pci/devices/
目录下对应网卡总线的numa_node值查看,如dpdk网卡总线值为0000:42:00.0则使用命令cat /sys/bus/pci/devices/0000\:42\:00.0/numa_node
查看所在NUMA节点; - compute_ovs_memory_channels:内存通道,对应的物理服务器内存所使用的通道数;
然后修改dpdk网卡所使用的驱动,配置文件mcp/reclass/classes/cluster/baremetal-mcp-ocata-ovs-dpdk-ha/openstack/compute.yml
默认使用的是igb_uio
[3]由于部署的系统中没有igb_uio
驱动,因此改为使用uio_pci_generic
驱动。
配置完上述文件后使用sudo ci/deploy.sh -b file:///home/opnfv/fuel/mcp/config/ -l bii -p pod1 -s os-nosdn-ovs-ha -B br-pxe,br-ctl -D
命令部署即可,推荐使用下述命令部署:
1 | sudo nohup ci/deploy.sh -b file:///home/opnfv/fuel/mcp/config/ -l bii -p pod1 -s os-nosdn-ovs-ha -B br-pxe,br-ctl -D > opnfv_install_date +%Y-%m-%d`.log 2>&1 & |
部署过程不占用终端,还可以通过tail -f opnfv_install_date[date].log
查看部署过程。
【NOTE】当前的部署完成后存在一个BUG,网络服务的外网不正常,通过service networking status
参看是否有错误。创建的虚拟机要想访问外网float-to-ex
网桥需要存在,或者使用route -n
查看是否存在能够访问外网的网关。
1 | root@cmp001:~# brctl show |
如不存在则需要重启网络服务service networking restart
错误1:
重启网络失败,通过journalctl -xe
查看错误原因
先将/etc/network/if-up.d/route-br-ex
中的路由配置注释,然后使用ip addr flush dev br-ctl
和ip addr flush dev br-ex
(注意若使用的是mgmt
网络访问会导致终端连接断开,在清除br-ctl
的网址时请使用pxe
网络的地址连接计算节点),随后使用service networking restart
重启网络。
错误2:
创建虚拟机错误,查看vim /var/log/nova/nova-compute.log
显示ovs权限不足,需要修改计算节点neutron插件中ovs配置/etc/neutron/plugins/ml2/openvswitch_agent.ini
将vhostuser_socket_dir = /var/run/openvswitch
改为vhostuser_socket_dir = /var/run/openvswitch-vhost
随后重启ovs服务service neutron-openvswitch-agent restart
。
3 使能第二个DPDK网口
当前Fuel部署DPDK仅支持一块网卡配置,一般来说DPDK网卡中网口个数都是成对的,因此需要手动配置第二个DPDK网口。
3.1 控制节点neutron配置修改
3.1.1 新增网络MTU修改
修改controller节点的/etc/neutron/plugins/ml2/ml2_conf.ini
中
1 | [ml2] |
改为physical_network_mtus = physnet1:1500,physnet2:1500,physnet3:1500
3.1.2 vlan配置
修改controller节点的/etc/neutron/plugins/ml2/ml2_conf.ini
中
1 | [ml2_type_vlan] |
改为network_vlan_ranges = physnet2:1000:1030,physnet3:1031:1060
同时需要在物理交换机上配置1031~1060段的vlan支持。
修改完成后使用service neutron-server restart
重启neutron服务。
【Tips】因为需要修改三个控制节点,可以使用如下命令修改
1 | sed -i 's/^physical_network_mtus =.*$/physical_network_mtus = physnet1:1500,physnet2:1500,physnet3:1500/g' /etc/neutron/plugins/ml2/ml2_conf.ini |
配合saltstack命令可以更便捷的修改三个控制节点,登录到cfg01节点使用salt命令修改控制节点
1 | root@cfg01:~# salt -C "ctl*" cmd.run "sed -i 's/^physical_network_mtus =.*$/physical_network_mtus = physnet1:1500,physnet2:1500,physnet3:1500/g' /etc/neutron/plugins/ml2/ml2_conf.ini" |
3.2 计算节点neutron配置修改
修改节点节点的/etc/neutron/plugins/ml2/openvswitch_agent.ini
中ovs段
1 | [ovs] |
改为bridge_mappings = physnet1:br-floating,physnet2:br-prv,physnet3:br-prv1
,随后重启neutron服务service neutron-openvswitch-agent restart
[Tips]使用如下命令修改,同样的配合saltstack的命令可以更便捷的修改两个控制节点
1 | sed -i 's/^bridge_mappings = .*$/bridge_mappings = physnet1:br-floating,physnet2:br-prv,physnet3:br-prv1/g' /etc/neutron/plugins/ml2/openvswitch_agent.ini |
重启完neutron服务后通过ovs-vsctl show
可以看到已经生成了一个br-prv1的网桥,如果没有生成,在控制节点上检查网络代理服务是否正常
1 | root@ctl01:~# openstack network agent list |
br-prv1成功创建后需要手动添加dpdk网卡,首先为第二个网卡加载驱动
1 | root@cmp001:~# ifconfig enp66s0f1 down |
随后在ovs中配置dpdk网卡
1 | root@cmp001:~# ovs-vsctl add-port br-prv1 dpdk1 -- set interface dpdk0 type=dpdk options:dpdk-devargs=0000:42:00.1 options:n_rxq=2 |
【NOTE】在创建虚拟机时需要在虚拟机类型中额外添加大页内存特性设置,如
1 | root@ctl01:~# source keystonercv3 |
【参考链接】
1)dpdk配置
3)DPDK网卡驱动