diff options
author | Ben Pfaff <blp@ovn.org> | 2018-07-06 13:53:13 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2018-07-06 13:53:13 -0700 |
commit | b3ed0e1e058cba8eadebaf7fab10d0a6e1219175 (patch) | |
tree | 2e28a5705466f5f287442166658f561dcf63f628 /Documentation | |
parent | 771680d96fb6f996987630cb85bb749478512268 (diff) | |
parent | 43307ad0e2543c9c8443f3ab1150ab03f4eb551c (diff) | |
download | openvswitch-b3ed0e1e058cba8eadebaf7fab10d0a6e1219175.tar.gz |
Merge branch 'dpdk_merge' of https://github.com/istokes/ovs into HEAD
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/automake.mk | 1 | ||||
-rw-r--r-- | Documentation/faq/releases.rst | 4 | ||||
-rw-r--r-- | Documentation/howto/dpdk.rst | 22 | ||||
-rw-r--r-- | Documentation/intro/install/dpdk.rst | 14 | ||||
-rw-r--r-- | Documentation/topics/dpdk/index.rst | 1 | ||||
-rw-r--r-- | Documentation/topics/dpdk/memory.rst | 216 | ||||
-rw-r--r-- | Documentation/topics/dpdk/vhost-user.rst | 6 |
7 files changed, 255 insertions, 9 deletions
diff --git a/Documentation/automake.mk b/Documentation/automake.mk index bc728dff3..244479490 100644 --- a/Documentation/automake.mk +++ b/Documentation/automake.mk @@ -36,6 +36,7 @@ DOC_SOURCE = \ Documentation/topics/dpdk/index.rst \ Documentation/topics/dpdk/bridge.rst \ Documentation/topics/dpdk/jumbo-frames.rst \ + Documentation/topics/dpdk/memory.rst \ Documentation/topics/dpdk/pdump.rst \ Documentation/topics/dpdk/phy.rst \ Documentation/topics/dpdk/pmd.rst \ diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst index fab93b188..7021cec59 100644 --- a/Documentation/faq/releases.rst +++ b/Documentation/faq/releases.rst @@ -163,9 +163,9 @@ Q: What DPDK version does each Open vSwitch release work with? 2.4.x 2.0 2.5.x 2.2 2.6.x 16.07.2 - 2.7.x 16.11.6 + 2.7.x 16.11.7 2.8.x 17.05.2 - 2.9.x 17.11.2 + 2.9.x 17.11.3 ============ ======= Q: Are all the DPDK releases that OVS versions work with maintained? diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index 380181db0..82596f557 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -358,6 +358,28 @@ devices to bridge ``br0``. Once complete, follow the below steps: $ cat /proc/interrupts | grep virtio +.. _dpdk-flow-hardware-offload: + +Flow Hardware Offload (Experimental) +------------------------------------ + +The flow hardware offload is disabled by default and can be enabled by:: + + $ ovs-vsctl set Open_vSwitch . other_config:hw-offload=true + +So far only partial flow offload is implemented. Moreover, it only works +with PMD drivers have the rte_flow action "MARK + RSS" support. + +The validated NICs are: + +- Mellanox (ConnectX-4, ConnectX-4 Lx, ConnectX-5) +- Napatech (NT200B01) + +Supported protocols for hardware offload are: +- L2: Ethernet, VLAN +- L3: IPv4, IPv6 +- L4: TCP, UDP, SCTP, ICMP + Further Reading --------------- diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst index 085e47990..2468c641b 100644 --- a/Documentation/intro/install/dpdk.rst +++ b/Documentation/intro/install/dpdk.rst @@ -40,7 +40,7 @@ Build requirements In addition to the requirements described in :doc:`general`, building Open vSwitch with DPDK will require the following: -- DPDK 17.11.2 +- DPDK 17.11.3 - A `DPDK supported NIC`_ @@ -69,9 +69,9 @@ Install DPDK #. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``:: $ cd /usr/src/ - $ wget http://fast.dpdk.org/rel/dpdk-17.11.2.tar.xz - $ tar xf dpdk-17.11.2.tar.xz - $ export DPDK_DIR=/usr/src/dpdk-stable-17.11.2 + $ wget http://fast.dpdk.org/rel/dpdk-17.11.3.tar.xz + $ tar xf dpdk-17.11.3.tar.xz + $ export DPDK_DIR=/usr/src/dpdk-stable-17.11.3 $ cd $DPDK_DIR #. (Optional) Configure DPDK as a shared library @@ -170,6 +170,12 @@ Mount the hugepages, if not already mounted by default:: $ mount -t hugetlbfs none /dev/hugepages`` +.. note:: + + The amount of hugepage memory required can be affected by various + aspects of the datapath and device configuration. Refer to + :doc:`/topics/dpdk/memory` for more details. + .. _dpdk-vfio: Setup DPDK devices using VFIO diff --git a/Documentation/topics/dpdk/index.rst b/Documentation/topics/dpdk/index.rst index 181f61abb..cf24a7b6d 100644 --- a/Documentation/topics/dpdk/index.rst +++ b/Documentation/topics/dpdk/index.rst @@ -40,3 +40,4 @@ The DPDK Datapath /topics/dpdk/qos /topics/dpdk/pdump /topics/dpdk/jumbo-frames + /topics/dpdk/memory diff --git a/Documentation/topics/dpdk/memory.rst b/Documentation/topics/dpdk/memory.rst new file mode 100644 index 000000000..e5fb166d5 --- /dev/null +++ b/Documentation/topics/dpdk/memory.rst @@ -0,0 +1,216 @@ +.. + Copyright (c) 2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + + Convention for heading levels in Open vSwitch documentation: + + ======= Heading 0 (reserved for the title in a document) + ------- Heading 1 + ~~~~~~~ Heading 2 + +++++++ Heading 3 + ''''''' Heading 4 + + Avoid deeper levels because they do not render well. + +========================= +DPDK Device Memory Models +========================= + +DPDK device memory can be allocated in one of two ways in OVS DPDK, +**shared memory** or **per port memory**. The specifics of both are +detailed below. + +Shared Memory +------------- + +By default OVS DPDK uses a shared memory model. This means that multiple +ports can share the same mempool. For example when a port is added it will +have a given MTU and socket ID associated with it. If a mempool has been +created previously for an existing port that has the same MTU and socket ID, +that mempool is used for both ports. If there is no existing mempool +supporting these parameters then a new mempool is created. + +Per Port Memory +--------------- + +In the per port memory model, mempools are created per device and are not +shared. The benefit of this is a more transparent memory model where mempools +will not be exhausted by other DPDK devices. However this comes at a potential +increase in cost for memory dimensioning for a given deployment. Users should +be aware of the memory requirements for their deployment before using this +model and allocate the required hugepage memory. + +Per port mempool support may be enabled via a global config value, +```per-port-memory```. Setting this to true enables the per port memory +model for all DPDK devices in OVS:: + + $ ovs-vsctl set Open_vSwitch . other_config:per-port-memory=true + +.. important:: + + This value should be set before setting dpdk-init=true. If set after + dpdk-init=true then the daemon must be restarted to use per-port-memory. + +Calculating Memory Requirements +------------------------------- + +The amount of memory required for a given mempool can be calculated by the +**number mbufs in the mempool \* mbuf size**. + +Users should be aware of the following: + +* The **number of mbufs** per mempool will differ between memory models. + +* The **size of each mbuf** will be affected by the requested **MTU** size. + +.. important:: + + An mbuf size in bytes is always larger than the requested MTU size due to + alignment and rounding needed in OVS DPDK. + +Below are a number of examples of memory requirement calculations for both +shared and per port memory models. + +Shared Memory Calculations +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the shared memory model the number of mbufs requested is directly +affected by the requested MTU size as described in the table below. + ++--------------------+-------------+ +| MTU Size | Num MBUFS | ++====================+=============+ +| 1500 or greater | 262144 | ++--------------------+-------------+ +| Less than 1500 | 16384 | ++------------+-------+-------------+ + +.. Important:: + + If a deployment does not have enough memory to provide 262144 mbufs then + the requested amount is halved up until 16384. + +Example 1 ++++++++++ +:: + + MTU = 1500 Bytes + Number of mbufs = 262144 + Mbuf size = 3008 Bytes + Memory required = 262144 * 3008 = 788 MB + +Example 2 ++++++++++ +:: + + MTU = 1800 Bytes + Number of mbufs = 262144 + Mbuf size = 3008 Bytes + Memory required = 262144 * 3008 = 788 MB + +.. note:: + + Assuming the same socket is in use for example 1 and 2 the same mempool + would be shared. + +Example 3 ++++++++++ +:: + + MTU = 6000 Bytes + Number of mbufs = 262144 + Mbuf size = 8128 Bytes + Memory required = 262144 * 8128 = 2130 MB + +Example 4 ++++++++++ +:: + + MTU = 9000 Bytes + Number of mbufs = 262144 + Mbuf size = 10176 Bytes + Memory required = 262144 * 10176 = 2667 MB + +Per Port Memory Calculations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The number of mbufs requested in the per port model is more complicated and +accounts for multiple dynamic factors in the datapath and device +configuration. + +A rough estimation of the number of mbufs required for a port is: +:: + + packets required to fill the device rxqs + + packets that could be stuck on other ports txqs + + packets on the pmd threads + + additional corner case memory. + +The algorithm in OVS used to calculate this is as follows: +:: + + requested number of rxqs * requested rxq size + + requested number of txqs * requested txq size + + min(RTE_MAX_LCORE, requested number of rxqs) * netdev_max_burst + + MIN_NB_MBUF. + +where: + +* **requested number of rxqs**: Number of requested receive queues for a + device. +* **requested rxq size**: The number of descriptors requested for a rx queue. +* **requested number of txqs**: Number of requested transmit queues for a + device. Calculated as the number of PMDs configured +1. +* **requested txq size**: the number of descriptors requested for a tx queue. +* **min(RTE_MAX_LCORE, requested number of rxqs)**: Compare the maximum + number of lcores supported by DPDK to the number of requested receive + queues for the device and use the variable of lesser value. +* **NETDEV_MAX_BURST**: Maximum number of of packets in a burst, defined as + 32. +* **MIN_NB_MBUF**: Additional memory for corner case, defined as 16384. + +For all examples below assume the following values: + +* requested_rxq_size = 2048 +* requested_txq_size = 2048 +* RTE_MAX_LCORE = 128 +* netdev_max_burst = 32 +* MIN_NB_MBUF = 16384 + +Example 1: (1 rxq, 1 PMD, 1500 MTU) ++++++++++++++++++++++++++++++++++++ +:: + + MTU = 1500 + Number of mbufs = (1 * 2048) + (2 * 2048) + (1 * 32) + (16384) = 22560 + Mbuf size = 3008 Bytes + Memory required = 22560 * 3008 = 67 MB + +Example 2: (1 rxq, 2 PMD, 6000 MTU) ++++++++++++++++++++++++++++++++++++ +:: + + MTU = 6000 + Number of mbufs = (1 * 2048) + (3 * 2048) + (1 * 32) + (16384) = 24608 + Mbuf size = 8128 Bytes + Memory required = 24608 * 8128 = 200 MB + +Example 3: (2 rxq, 2 PMD, 9000 MTU) ++++++++++++++++++++++++++++++++++++ +:: + + MTU = 9000 + Number of mbufs = (2 * 2048) + (3 * 2048) + (1 * 32) + (16384) = 26656 + Mbuf size = 10176 Bytes + Memory required = 26656 * 10176 = 271 MB diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst index c5b69fabd..b1e2285dc 100644 --- a/Documentation/topics/dpdk/vhost-user.rst +++ b/Documentation/topics/dpdk/vhost-user.rst @@ -320,9 +320,9 @@ To begin, instantiate a guest as described in :ref:`dpdk-vhost-user` or DPDK sources to VM and build DPDK:: $ cd /root/dpdk/ - $ wget http://fast.dpdk.org/rel/dpdk-17.11.2.tar.xz - $ tar xf dpdk-17.11.2.tar.xz - $ export DPDK_DIR=/root/dpdk/dpdk-stable-17.11.2 + $ wget http://fast.dpdk.org/rel/dpdk-17.11.3.tar.xz + $ tar xf dpdk-17.11.3.tar.xz + $ export DPDK_DIR=/root/dpdk/dpdk-stable-17.11.3 $ export DPDK_TARGET=x86_64-native-linuxapp-gcc $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET $ cd $DPDK_DIR |