Signed-off-by: Sameh Gobriel <sameh.gobr...@intel.com> Signed-off-by: Pablo de Lara <pablo.de.lara.gua...@intel.com> --- MAINTAINERS | 1 + doc/guides/sample_app_ug/flow_distributor.rst | 492 ++++++++++++++++++++++ doc/guides/sample_app_ug/img/flow_distributor.svg | 417 ++++++++++++++++++ doc/guides/sample_app_ug/index.rst | 1 + 4 files changed, 911 insertions(+) create mode 100644 doc/guides/sample_app_ug/flow_distributor.rst create mode 100644 doc/guides/sample_app_ug/img/flow_distributor.svg
diff --git a/MAINTAINERS b/MAINTAINERS index 66e9466..0d3b247 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -535,6 +535,7 @@ F: lib/librte_efd/ F: doc/guides/prog_guide/efd_lib.rst F: app/test/test_efd* F: examples/flow_distributor/ +F: doc/guides/sample_app_ug/flow_distributor.rst Hashes M: Bruce Richardson <bruce.richard...@intel.com> diff --git a/doc/guides/sample_app_ug/flow_distributor.rst b/doc/guides/sample_app_ug/flow_distributor.rst new file mode 100644 index 0000000..39820f0 --- /dev/null +++ b/doc/guides/sample_app_ug/flow_distributor.rst @@ -0,0 +1,492 @@ +.. BSD LICENSE + Copyright(c) 2010-2016 Intel Corporation. All rights reserved. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Flow Distributor Sample Application +=================================== + +This sample application demonstrates the use of EFD library as a flow-level +load balancer, for more information about the EFD Library please refer to the +DPDK programmer's guide. + +This sample application is a variant of the :ref:`client-server sample application <multi_process_app>` +where a specific target node is specified for every and each flow +(not in a round-robin fashion as the original load balancing sample application). + +Overview +-------- + +The architecture of the EFD flow-based load balancer sample application is +presented in the following figure. + +.. _figure_efd_sample_app_overview: + +.. figure:: img/flow_distributor.* + + Using EFD as a Flow-Level Load Balancer + +As shown in figure, the sample application consists of a front end node +(distributor) using the EFD library to create a load-balancing table for flows, +for each flow a target backend worker node is specified. The EFD table does not +store the flow key (unlike a regular hash table), and hence, it can +individually load-balance millions of flows (number of targets * maximum number +of flows fit in a flow table per target) while still fitting in CPU cache. + +It should be noted that although they are referred to as nodes, the frontend +distributor and worker nodes are processes running on the same platform. + +Front-end Distributor +~~~~~~~~~~~~~~~~~~~~~ + +Upon initializing, the frontend distributor node (process) creates a flow +distributor table (based on the EFD library) which is populated with flow +information and its intended target node. + +The sample application assigns a specific target node_id (process) for each of +the IP destination addresses as follows: + +.. code-block:: c + + node_id = i % num_nodes; /* Target node id is generated */ + ip_dst = rte_cpu_to_be_32(i); /* Specific ip destination address is + assigned to this target node */ + +then the pair of <key,target> is inserted into the flow distribution table. + +The main loop of the the distributor node receives a burst of packets, then for +each packet a flow key (IP destination address) is extracted. The flow +distributor table is looked up and the target node id is returned. Packets are +then enqueued to the specified target node id. + +It should be noted that flow distributor table is not a membership test table. +I.e. if the key has already been inserted the target node id will be correct, +but for new keys the flow distributor table will return a value (which can be +valid). + +Backend Worker Nodes +~~~~~~~~~~~~~~~~~~~~ + +Upon initializing, the worker node (process) creates a flow table (a regular +hash table that stores the key default size 1M flows) which is populated with +only the flow information that are serviced at this node. This flow key is +essential to point out new keys that have not been inserted before. + +The worker node's main loop is simply receiving packets then doing a hash table +lookup. If a match occurs then statistics are updated for flows serviced by +this node. If no match is found in the local hash table then this indicates +that this is a new flows which is dropped. + + +Compiling the Application +------------------------- + +The sequence of steps used to build the application is: + +#. Export the required environment variables: + + .. code-block:: console + + export RTE_SDK=/path/to/rte_sdk + export RTE_TARGET=x86_64-native-linuxapp-gcc + +#. Build the application executable file: + + .. code-block:: console + + cd ${RTE_SDK}/examples/flow_distributor/ + make + + For more details on how to build the DPDK libraries and sample + applications, + please refer to the *DPDK Getting Started Guide.* + + +Running the Application +----------------------- + +The application has two binaries to be run: the front-end distributor +and the back-end node. + +The frontend distributor (distributor) has the following command line options:: + + ./distributor [EAL options] -- -p PORTMASK -n NUM_NODES -f NUM_FLOWS + +Where, + +* ``-p PORTMASK:`` Hexadecimal bitmask of ports to configure +* ``-n NUM_NODES:`` Number of back-end nodes that will be used +* ``-f NUM_FLOWS:`` Number of flows to be added in the EFD table (1 million, by default) + +The back-end node (node) has the following command line options:: + + ./node [EAL options] -- -n NODE_ID + +Where, + +* ``-n NODE_ID:`` Node ID, which cannot be equal or higher than NUM_MODES + + +First, the distributor app must be run, with the number of nodes that will be run. +Once it has been started, the node instances can be run, with different NODE_ID. +These instances have to be run as secondary processes, with `--proc-type=secondary` +in the EAL options, which will attach to the primary process memory, and therefore, +they can access the queues created by the primary process to distribute packets. + +To successfully run the application, the command line used to start the +application has to be in sync with the traffic flows configured on the traffic +generator side. + +For examples of application command lines and traffic generator flows, please +refer to the DPDK Test Report. For more details on how to set up and run the +sample applications provided with DPDK package, please refer to the +:ref:`DPDK Getting Started Guide for Linux <linux_gsg>` and +:ref:`DPDK Getting Started Guide for FreeBSD <freebsd_gsg>`. + + +Explanation +----------- + +As described in previous sections, there are two processes in this example. + +The first process, the front-end distributor, creates and populates the EFD table, +which is used to distribute packets to nodes, which the number of flows +specified in the command line (1 million, by default). + + +.. code-block:: c + + static void + create_flow_distributor_table(void) + { + uint8_t socket_id = rte_socket_id(); + + /* create table */ + efd_table = rte_efd_create("flow table", num_flows * 2, sizeof(uint32_t), + 1 << socket_id, socket_id); + + if (efd_table == NULL) + rte_exit(EXIT_FAILURE, "Problem creating the flow table\n"); + } + + static void + populate_flow_distributor_table(void) + { + unsigned int i; + int32_t ret; + uint32_t ip_dst; + uint8_t socket_id = rte_socket_id(); + uint64_t node_id; + + /* Add flows in table */ + for (i = 0; i < num_flows; i++) { + node_id = i % num_nodes; + + ip_dst = rte_cpu_to_be_32(i); + ret = rte_efd_update(efd_table, socket_id, + (void *)&ip_dst, (efd_value_t)node_id); + if (ret < 0) + rte_exit(EXIT_FAILURE, "Unable to add entry %u in " + "flow distributor table\n", i); + } + + printf("EFD table: Adding 0x%x keys\n", num_flows); + } + +After initialization, packets are received from the enabled ports, and the IPv4 +address from the packets is used as a key to look up in the EFD table, +which tells the node where the packet has to be distributed. + +.. code-block:: c + + static void + process_packets(uint32_t port_num __rte_unused, struct rte_mbuf *pkts[], + uint16_t rx_count, unsigned int socket_id) + { + uint16_t i; + uint8_t node; + efd_value_t data[EFD_BURST_MAX]; + const void *key_ptrs[EFD_BURST_MAX]; + + struct ipv4_hdr *ipv4_hdr; + uint32_t ipv4_dst_ip[EFD_BURST_MAX]; + + for (i = 0; i < rx_count; i++) { + /* Handle IPv4 header.*/ + ipv4_hdr = rte_pktmbuf_mtod_offset(pkts[i], struct ipv4_hdr *, + sizeof(struct ether_hdr)); + ipv4_dst_ip[i] = ipv4_hdr->dst_addr; + key_ptrs[i] = (void *)&ipv4_dst_ip[i]; + } + + rte_efd_lookup_bulk(efd_table, socket_id, rx_count, + (const void **) key_ptrs, data); + for (i = 0; i < rx_count; i++) { + node = (uint8_t) ((uintptr_t)data[i]); + + if (node >= num_nodes) { + /* + * Node is out of range, which means that + * flow has not been inserted + */ + flow_dist_stats.drop++; + rte_pktmbuf_free(pkts[i]); + } else { + flow_dist_stats.distributed++; + enqueue_rx_packet(node, pkts[i]); + } + } + + for (i = 0; i < num_nodes; i++) + flush_rx_queue(i); + } + +The burst of packets received is enqueued in temporary buffers (per node), +and enqueued in the shared ring between the distributor and the node. +After this, a new burst of packets is received and this process is +repeated infinitely. + +.. code-block:: c + + static void + flush_rx_queue(uint16_t node) + { + uint16_t j; + struct node *cl; + + if (cl_rx_buf[node].count == 0) + return; + + cl = &nodes[node]; + if (rte_ring_enqueue_bulk(cl->rx_q, (void **)cl_rx_buf[node].buffer, + cl_rx_buf[node].count) != 0){ + for (j = 0; j < cl_rx_buf[node].count; j++) + rte_pktmbuf_free(cl_rx_buf[node].buffer[j]); + cl->stats.rx_drop += cl_rx_buf[node].count; + } else + cl->stats.rx += cl_rx_buf[node].count; + + cl_rx_buf[node].count = 0; + } + +The second process, the back-end node, receives the packets from the shared +ring with the distributor and send them out, if they belong to the node. + +At initialization, it attaches to the distributor process memory, to have +access to the shared ring, parameters and statistics. + +.. code-block:: c + + rx_ring = rte_ring_lookup(get_rx_queue_name(node_id)); + if (rx_ring == NULL) + rte_exit(EXIT_FAILURE, "Cannot get RX ring - " + "is distributor process running?\n"); + + mp = rte_mempool_lookup(PKTMBUF_POOL_NAME); + if (mp == NULL) + rte_exit(EXIT_FAILURE, "Cannot get mempool for mbufs\n"); + + mz = rte_memzone_lookup(MZ_SHARED_INFO); + if (mz == NULL) + rte_exit(EXIT_FAILURE, "Cannot get port info structure\n"); + info = mz->addr; + tx_stats = &(info->tx_stats[node_id]); + filter_stats = &(info->filter_stats[node_id]); + +Then, the hash table that contains the flows that will be handled +by the node is created and populated. + +.. code-block:: c + + static struct rte_hash * + create_hash_table(const struct shared_info *info) + { + uint32_t num_flows_node = info->num_flows / info->num_nodes; + char name[RTE_HASH_NAMESIZE]; + struct rte_hash *h; + + /* create table */ + struct rte_hash_parameters hash_params = { + .entries = num_flows_node * 2, /* table load = 50% */ + .key_len = sizeof(uint32_t), /* Store IPv4 dest IP address */ + .socket_id = rte_socket_id(), + .hash_func_init_val = 0, + }; + + snprintf(name, sizeof(name), "hash_table_%d", node_id); + hash_params.name = name; + h = rte_hash_create(&hash_params); + + if (h == NULL) + rte_exit(EXIT_FAILURE, + "Problem creating the hash table for node %d\n", + node_id); + return h; + } + + static void + populate_hash_table(const struct rte_hash *h, const struct shared_info *info) + { + unsigned int i; + int32_t ret; + uint32_t ip_dst; + uint32_t num_flows_node = 0; + uint64_t target_node; + + /* Add flows in table */ + for (i = 0; i < info->num_flows; i++) { + target_node = i % info->num_nodes; + if (target_node != node_id) + continue; + + ip_dst = rte_cpu_to_be_32(i); + + ret = rte_hash_add_key(h, (void *) &ip_dst); + if (ret < 0) + rte_exit(EXIT_FAILURE, "Unable to add entry %u " + "in hash table\n", i); + else + num_flows_node++; + + } + + printf("Hash table: Adding 0x%x keys\n", num_flows_node); + } + +After initialization, packets are dequeued from the shared ring (from the distributor) and, +like in the distributor process, the IPv4 address from the packets is used as +a key to look up in the hash table. +If there is a hit, packet is stored in a buffer, to be eventually transmitted +in one of the enabled ports. If key is not there, packet is dropped, since the +flow is not handled by the node. + +.. code-block:: c + + static inline void + handle_packets(struct rte_hash *h, struct rte_mbuf **bufs, uint16_t num_packets) + { + struct ipv4_hdr *ipv4_hdr; + uint32_t ipv4_dst_ip[PKT_READ_SIZE]; + const void *key_ptrs[PKT_READ_SIZE]; + unsigned int i; + int32_t positions[PKT_READ_SIZE] = {0}; + + for (i = 0; i < num_packets; i++) { + /* Handle IPv4 header.*/ + ipv4_hdr = rte_pktmbuf_mtod_offset(bufs[i], struct ipv4_hdr *, + sizeof(struct ether_hdr)); + ipv4_dst_ip[i] = ipv4_hdr->dst_addr; + key_ptrs[i] = &ipv4_dst_ip[i]; + } + /* Check if packets belongs to any flows handled by this node */ + rte_hash_lookup_bulk(h, key_ptrs, num_packets, positions); + + for (i = 0; i < num_packets; i++) { + if (likely(positions[i] >= 0)) { + filter_stats->passed++; + transmit_packet(bufs[i]); + } else { + filter_stats->drop++; + /* Drop packet, as flow is not handled by this node */ + rte_pktmbuf_free(bufs[i]); + } + } + } + +Finally, note that both processes updates statistics, such as transmitted, received +and dropped packets, which are shown and refreshed by the distributor app. + +.. code-block:: c + + static void + do_stats_display(void) + { + unsigned int i, j; + const char clr[] = {27, '[', '2', 'J', '\0'}; + const char topLeft[] = {27, '[', '1', ';', '1', 'H', '\0'}; + uint64_t port_tx[RTE_MAX_ETHPORTS], port_tx_drop[RTE_MAX_ETHPORTS]; + uint64_t node_tx[MAX_NODES], node_tx_drop[MAX_NODES]; + + /* to get TX stats, we need to do some summing calculations */ + memset(port_tx, 0, sizeof(port_tx)); + memset(port_tx_drop, 0, sizeof(port_tx_drop)); + memset(node_tx, 0, sizeof(node_tx)); + memset(node_tx_drop, 0, sizeof(node_tx_drop)); + + for (i = 0; i < num_nodes; i++) { + const struct tx_stats *tx = &info->tx_stats[i]; + + for (j = 0; j < info->num_ports; j++) { + const uint64_t tx_val = tx->tx[info->id[j]]; + const uint64_t drop_val = tx->tx_drop[info->id[j]]; + + port_tx[j] += tx_val; + port_tx_drop[j] += drop_val; + node_tx[i] += tx_val; + node_tx_drop[i] += drop_val; + } + } + + /* Clear screen and move to top left */ + printf("%s%s", clr, topLeft); + + printf("PORTS\n"); + printf("-----\n"); + for (i = 0; i < info->num_ports; i++) + printf("Port %u: '%s'\t", (unsigned int)info->id[i], + get_printable_mac_addr(info->id[i])); + printf("\n\n"); + for (i = 0; i < info->num_ports; i++) { + printf("Port %u - rx: %9"PRIu64"\t" + "tx: %9"PRIu64"\n", + (unsigned int)info->id[i], info->rx_stats.rx[i], + port_tx[i]); + } + + printf("\nFLOW DISTRIBUTOR\n"); + printf("-----\n"); + printf("distributed: %9"PRIu64", drop: %9"PRIu64"\n", + flow_dist_stats.distributed, flow_dist_stats.drop); + + printf("\nNODES\n"); + printf("-------\n"); + for (i = 0; i < num_nodes; i++) { + const unsigned long long rx = nodes[i].stats.rx; + const unsigned long long rx_drop = nodes[i].stats.rx_drop; + const struct filter_stats *filter = &info->filter_stats[i]; + + printf("Node %2u - rx: %9llu, rx_drop: %9llu\n" + " tx: %9"PRIu64", tx_drop: %9"PRIu64"\n" + " filter_passed: %9"PRIu64", " + "filter_drop: %9"PRIu64"\n", + i, rx, rx_drop, node_tx[i], node_tx_drop[i], + filter->passed, filter->drop); + } + + printf("\n"); + } diff --git a/doc/guides/sample_app_ug/img/flow_distributor.svg b/doc/guides/sample_app_ug/img/flow_distributor.svg new file mode 100644 index 0000000..b35faad --- /dev/null +++ b/doc/guides/sample_app_ug/img/flow_distributor.svg @@ -0,0 +1,417 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export Drawing1.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="7.0721in" height="4.43701in" + viewBox="0 0 509.191 319.465" xml:space="preserve" color-interpolation-filters="sRGB" class="st2"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="19" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(18.375,-18.375)"> + <title>Sheet.1</title> + <rect v:rectContext="foreign" x="0" y="36.75" width="472.441" height="282.715" class="st1"/> + <image x="0" y="36.75" width="472.441" height="282.715" preserveAspectRatio="none" xlink:href="data:image/png;base64, + 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 + Dg//f9NW31MZe1iBAAAAAElFTkSuQmCC"/> + <rect v:rectContext="foreign" x="0" y="36.75" width="472.441" height="282.715" class="st1"/> + </g> + </g> +</svg> diff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst index 775e2f7..260f6a5 100644 --- a/doc/guides/sample_app_ug/index.rst +++ b/doc/guides/sample_app_ug/index.rst @@ -57,6 +57,7 @@ Sample Applications User Guides l3_forward_virtual link_status_intr load_balancer + flow_distributor multi_process qos_metering qos_scheduler -- 2.7.4