作者:Maxwell Li
日期:2017/05/31
未经作者允许,禁止转载本文任何内容。如需转载请留言。
OpenStack Mitaka 版本已全面支持 OVS 使用 DPDK 提升网络交换性能,本文将详细介绍基于 Compass4NFV 部署的 OpenStack Mitaka 版本集成 DPDK 的操作过程(除特殊说明,以下操作均在计算节点上进行)。以下是此次配置的各个版本信息。
OpenStack Version: Mitaka
OS Version: Ubuntu 16.04
Open vSwitch Version: 2.5.0
Installer: Compass4NFV Colorado
Step1 配置大页
在所有需要配置 DPDK 的计算节点上开启 Intel VT-d 配置。
将以下参数添加到 /etc/default/grub
中的 GRUB_CMDLINE_LINUX 配置项中。
default_hugepagesz=2M hugepagesz=2M hugepages=4096 iommu=pt intel_iommu=on
本环境只作为测试使用,实际生产环境可配置 1GB 大页。
hugepages 为需要使用的大页数量
default_hugepagesz hugepagesz 配置大页大小,默认值为 2M
执行命令 update-grub
,然后重启计算节点。
然后执行以下命令挂载大页到系统中。
$ mkdir -p /mnt/huge
$ mount -t hugetlbfs hugetlbfs /mnt/huge
挂载后,可以通过以下命令检查是否配置成功:
$ grep Huge /proc/meminfo
AnonHugePages: 116736 kB
HugePages_Total: 4096
HugePages_Free: 4096
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Step2 切换 OVS 到 DPDK 版本
OVS 集成 DPDK 和没有集成 DPDK 使用不同的二进制版本,使用以下命令将 OVS 切换为集成 DPDK 版本:
$ update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk
update-alternatives: using /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk to provide /usr/sbin/ovs-vswitchd (ovs-vswitchd) in manual mode
可以通过以下命令检查是否切换成功:
$ update-alternatives --query ovs-vswitchd
Name: ovs-vswitchd
Link: /usr/sbin/ovs-vswitchd
Status: manual
Best: /usr/lib/openvswitch-switch/ovs-vswitchd
Value: /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk
Alternative: /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk
Priority: 50
Alternative: /usr/lib/openvswitch-switch/ovs-vswitchd
Priority: 100
Step3 配置网卡绑定用户态驱动
DPDK 支持三种用户态网卡驱动:uio_pci_generic, igb_uio, vfio-pci。这里我们使用 uio_pci_generic。
Step3.1 加载驱动模块
$ modprobe uio_pci_generic
Step3.2 查询被绑网卡的 pci 号
$ lspci | grep Eth | awk '{print "ID=\"0000:"$1"\", NAME=\"eth"count++"\""}'
ID="0000:00:04.0", NAME="eth0"
ID="0000:00:05.0", NAME="eth1"
ID="0000:00:06.0", NAME="eth2"
Step3.3 绑定网卡驱动
设置要使用 DPDK 网卡的 PCI 地址信息。
$ echo "pci 0000:00:06.0 uio_pci_generic" >> /etc/dpdk/interfaces
$ service dpdk restart
Step4 配置 OVS-DPDK 运行参数
$ echo "DPDK_OPTS='--dpdk -c 0x1 -n 4 -m 2048 -w 0000:00:06.0 --vhost-owner libvirt-qemu:kvm --vhost-perm 0666'" >> /etc/default/openvswitch-switch
$ service openvswitch-switch restart
$ python /opt/setup_networks/setup_networks.py
其中 -c 为指定 OVS 运行时绑定哪些核,-m 为指定 OVS 使用的内存大小(单位 MB),具体根据业务需求配置。
Step5 配置 Neutron ML2
$ crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ovs datapath_type netdev
$ crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ovs vhostuser_socket_dir /var/run/openvswitch
$ crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs datapath_type netdev
$ crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs vhostuser_socket_dir /var/run/openvswitch
$ service neutron-openvswitch-agent restart
Step6 配置 OVS 使用 DPDK 网卡
$ ovs-vsctl del-port br-physnet2 eth2
$ ovs-vsctl add-port br-physnet2 dpdk0 -- set Interface dpdk0 type=dpdk
Step7 配置实例可使用的 CPU 核(此步骤可选)
$ crudini --set /etc/nova/nova.conf DEFAULT vcpu_pin_set 0-2
$ service nova-compute restart
若不配置,则实例默认使用所有 CPU 核。
Step8 配置控制节点
在控制节点上打开 metadata 相关配置(以下命令在所有控制节点上执行)。执行以下命令之前可以先检查一下相关配置是否已经开启,如果已经开启,可以跳过此步骤。
$ crudini --set /etc/neutron/dhcp_agent.ini DEFAULT enable_isolated_metadata True
$ crudini --set /etc/neutron/dhcp_agent.ini DEFAULT force_metadata True
$ for i in $(cat /opt/service | grep neutron); do service $i restart; done
Step9 测试验证
Step9.1 Source RC 文件
$ source /opt/admin-openrc.sh
Step9.2 创建 aggregate group 并且加入配置了 DPDK 的计算节点
$ openstack aggregate create --zone=dpdk dpdk
$ openstack aggregate add host dpdk host4
$ openstack aggregate add host dpdk host5
Step9.3 上传 image
$ wget 10.1.0.12/image/cirros-0.3.3-x86_64-disk.img
$ glance image-create --name "cirros" --file cirros-0.3.3-x86_64-disk.img --disk-format qcow2 --container-format bare
Step9.4 创建配置 flavor
$ openstack flavor create m1.tiny_huge --ram 512 --disk 1 --vcpus 1
$ openstack flavor set \
--property hw:mem_page_size=large \
--property hw:cpu_policy=dedicated \
--property hw:cpu_thread_policy=require \
--property hw:numa_mempolicy=preferred \
--property hw:numa_nodes=1 \
--property hw:numa_cpus.0=0 \
--property hw:numa_mem.0=512 \
m1.tiny_huge
Step9.5 创建 DPDK 网络
$ neutron net-create dpdk-net \
--provider:network_type flat \
--provider:physical_network physnet2 \
--router:external "False"
$ neutron subnet-create \
--name dpdk-subnet \
--gateway 22.22.22.1 \
dpdk-net 22.22.22.0/24
Step9.6 创建 router
$ neutron router-create dpdk-router
$ neutron router-interface-add dpdk-router dpdk-subnet
$ neutron router-gateway-set dpdk-router ext-net
Step9.7 利用 DPDK 网络起实例
$ openstack server create \
--flavor m1.tiny_huge \
--image cirros \
--nic net-id=$(neutron net-list | grep dpdk-net | awk '{print $2}') \
--availability-zone dpdk dpdk-demo
Step9.8 给实例分配 floating ip
floating_ip=$(neutron floatingip-create ext-net | grep floating_ip_address | awk '{print $4}')
nova floating-ip-associate dpdk-demo $floating_ip
在不同的计算节点上起实例,可以相互 ping 通,并且在计算节点上可以看到实例绑核成功:
$ virsh vcpuinfo 1
VCPU: 0
CPU: 0
State: running
CPU time: 25.9s
CPU Affinity: y---
如果不需要绑核,在 flavor 设置中,只需要配置大页即可。
$ openstack flavor set --property hw:mem_page_size=large m1.tiny_huge
网友评论