add ovs-dpdk docs
- This change extends the networking-guide to describe how to enable the newly added support for deploying ovs-dpdk. Change-Id: I43405760ff315497f9396bfb0b36d6aa7fc5462a Partially-Implements: blueprint ovs-dpdk
This commit is contained in:
parent
0a1e7f6d86
commit
05b4ac1a59
@ -221,3 +221,130 @@ containers on network/opendaylight node.
|
|||||||
For the source code, please refer to the following link:
|
For the source code, please refer to the following link:
|
||||||
|
|
||||||
https://github.com/openstack/networking-odl
|
https://github.com/openstack/networking-odl
|
||||||
|
|
||||||
|
|
||||||
|
OVS with DPDK
|
||||||
|
=============
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
Open vSwitch (ovs) is an open source software virtual switch developed
|
||||||
|
and distributed via openvswitch.org.
|
||||||
|
The Data Plane Development Kit (dpdk) is a collection of userspace
|
||||||
|
libraries and tools that facilitate the development of high-performance
|
||||||
|
userspace networking applications.
|
||||||
|
|
||||||
|
As of the ovs 2.2 release, the ovs netdev datapath has supported integration
|
||||||
|
with dpdk for accelerated userspace networking. As of the pike release
|
||||||
|
of kolla support for deploying ovs with dpdk (ovs-dpdk) has been added
|
||||||
|
to kolla ansible. The ovs-dpdk role introduced in the pike release has been
|
||||||
|
tested on centos 7 and ubuntu 16.04 hosts, however, ubuntu is recommended due
|
||||||
|
to conflicts with the cgroup configuration created by the default systemd
|
||||||
|
version shipped with centos 7.
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
|
||||||
|
DPDK is a high-performance userspace networking library, as such it has
|
||||||
|
several requirements to function correctly that are not required when
|
||||||
|
deploying ovs without dpdk.
|
||||||
|
|
||||||
|
To function efficiently one of the mechanisms dpdk uses to accelerate
|
||||||
|
memory access is the utilisation of kernel hugepages. The use of hugepage
|
||||||
|
memory minimises the chance of a translation lookaside buffer(TLB) miss when
|
||||||
|
translating virtual to physical memory as it increases the total amount of
|
||||||
|
addressable memory that can be cached via the TLB. Hugepage memory pages are
|
||||||
|
unswappable contiguous blocks of memory of typically 2MiB or 1GiB in size,
|
||||||
|
that can be used to facilitate efficient sharing of memory between guests and
|
||||||
|
a vSwitch or DMA mapping between physical nics and the userspace ovs datapath.
|
||||||
|
|
||||||
|
To deploy ovs-dpdk on a platform a proportion of system memory should
|
||||||
|
be allocated hugepages. While it is possible to allocate hugepages at runtime
|
||||||
|
it is advised to allocate them via the kernel command line instead to prevent
|
||||||
|
memory fragmentation. This can be achieved by adding the following to the grub
|
||||||
|
config and regenerating your grub file.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
default_hugepagesz=2M hugepagesz=2M hugepages=25000
|
||||||
|
|
||||||
|
|
||||||
|
As dpdk is a userspace networking library it requires userspace compatible
|
||||||
|
drivers to be able to control the physical interfaces on the platform.
|
||||||
|
dpdk technically support 3 kernel drivers igb_uio,uio_pci_generic and vfio_pci.
|
||||||
|
While it is technically possible to use all 3 only uio_pci_generic and vfio_pci
|
||||||
|
are recommended for use with kolla. igb_uio is BSD licenced and distributed
|
||||||
|
as part of the dpdk library. While it has some advantages over uio_pci_generic
|
||||||
|
loading the igb_uio module will taint the kernel and possibly invalidate
|
||||||
|
distro support. To successfully deploy ovs-dpdk, vfio_pci or uio_pci_generic
|
||||||
|
kernel module must be present on the platform. Most distros include vfio_pci
|
||||||
|
or uio_pci_generic as part of the default kernel though on some distros you
|
||||||
|
may need to install kernel-modules-extra or the distro equivalent prior to
|
||||||
|
running kolla-ansible deploy.
|
||||||
|
|
||||||
|
Install
|
||||||
|
-------
|
||||||
|
|
||||||
|
To enable ovs-dpdk add the following to /etc/kolla/globals.yml
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
ovs_datapath: "netdev"
|
||||||
|
enable_ovs_dpdk: yes
|
||||||
|
enable_openvswitch: yes
|
||||||
|
tunnel_interface: "dpdk_bridge"
|
||||||
|
neutron_bridge_name: "dpdk_bridge"
|
||||||
|
|
||||||
|
Unlike standard Open vSwitch deployments, the interface specified by
|
||||||
|
neutron_external_interface should have an ip address assigned.
|
||||||
|
The ip address assigned to neutron_external_interface will be moved to
|
||||||
|
the "dpdk_bridge" as part of deploy action.
|
||||||
|
When using ovs-dpdk the tunnel_interface must be an ovs bridge with a physical
|
||||||
|
interfaces attached for tunnelled traffic to be accelerated by dpdk.
|
||||||
|
Note that due to a limitation in ansible variable names which excluded
|
||||||
|
the use of - in a variable name it is not possible to use the default
|
||||||
|
br-ex name for the neutron_bridge_name or tunnel_interface.
|
||||||
|
|
||||||
|
At present, the tunnel interface ip is configured using network manager on
|
||||||
|
on ubuntu and systemd on centos family operating systems. systemd is used
|
||||||
|
to work around a limitation of the centos network manager implementation which
|
||||||
|
does not consider the creation of an ovs bridge to be a hotplug event. In
|
||||||
|
the future, a new config option will be introduced to allow systemd to be used
|
||||||
|
on all host distros for those who do not wish to enable the network manager
|
||||||
|
service on ubuntu.
|
||||||
|
|
||||||
|
To manage ovs-dpdk the neutron ovs agent must be configured to use
|
||||||
|
the netdev datapath_type in the ml2.conf. At present this is not automated
|
||||||
|
and must be set via kolla's external config support. To set the datapath_type
|
||||||
|
create a file with the following content at
|
||||||
|
/etc/kolla/config/neutron/ml2_conf.ini
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
[ovs]
|
||||||
|
datapath_type = netdev
|
||||||
|
|
||||||
|
|
||||||
|
In the future, the requirement to use the external config will be removed by
|
||||||
|
automatically computing the value of ovs_datapath based on the value of
|
||||||
|
enable_ovs_dpdk and then using the ovs_datapath variable to template out this
|
||||||
|
setting in the ml2_conf.ini automatically.
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Reconfiguration from kernel ovs to ovs dpdk is currently not supported.
|
||||||
|
Changing ovs datapaths on a deployed node requires neutron config changes
|
||||||
|
and libvirt xml changes for all running instances including a hard reboot
|
||||||
|
of the vm.
|
||||||
|
|
||||||
|
When upgrading ovs-dpdk it should be noted that this will always involve
|
||||||
|
a dataplane outage. Unlike kernel OVS the dataplane for ovs-dpdk executes in
|
||||||
|
the ovs-vswitchd process. This means the lifetime of the dpdk dataplane is
|
||||||
|
tied to the lifetime of the ovsdpdk_vswitchd container. As such it is
|
||||||
|
recommended to always evacuate all vm workloads from a node running ovs-dpdk
|
||||||
|
prior to upgrading.
|
||||||
|
|
||||||
|
On ubuntu network manager is required for tunnel networking.
|
||||||
|
This requirement will be removed in the future.
|
||||||
|
Loading…
Reference in New Issue
Block a user