After packet classification, packets are queued in to batches depending
on the matching netdev flow. Thereafter each batch is processed to
execute the related actions. This becomes particularly inefficient if
there are few packets in each batch as rte_eth_tx_burst() incurs expensive
MMIO writes.

This patch series implements intermediate queue for DPDK and vHost User ports.
Packets are queued and burst when the packet count exceeds threshold. Also
drain logic is implemented to handle cases where packets can get stuck in
the tx queues at low rate traffic conditions. Care has been taken to see
that latency is well with in the acceptable limits. Testing shows significant
performance gains with this implementation.

This path series combines the earlier 2 patches posted below.
  DPDK patch: 
https://mail.openvswitch.org/pipermail/ovs-dev/2017-April/331039.html
  vHost User patch: 
https://mail.openvswitch.org/pipermail/ovs-dev/2017-May/332271.html

Performance Numbers with intermediate queue:

                      DPDK ports
                     ===========

  Throughput for P2P scenario, for two 82599ES 10G port with 64 byte packets

  Number
  flows       MASTER     With PATCH
  ======    =========    =========
    10       10727283    13393844
    32        7042253    11228799
    50        7515491     9607791
   100        5838699     9430730
   500        5285066     7845807
  1000        5226477     7135601

   Latency test

   MASTER
   =======
   Pkt size  min(ns)  avg(ns)  max(ns)
    512      4,631      5,022    309,914
   1024      5,545      5,749    104,294
   1280      5,978      6,159     45,306
   1518      6,419      6,774    946,850

   PATCH
   =====
   Pkt size  min(ns)  avg(ns)  max(ns)
    512      4,711      5,064    182,477
   1024      5,601      5,888    701,654
   1280      6,018      6,491    533,037
   1518      6,467      6,734    312,471

               vHost User ports
              ==================

  Throughput for PV scenario, with 64 byte packets

   Number
   flows       MASTER    With PATCH
  ========  =========   =========
    10        5945899     7833914
    32        3872211     6530133
    50        3283713     6618711
   100        3132540     5857226
   500        2964499     5273006
  1000        2931952     5178038

  Latency test.

  MASTER
  =======
  Pkt size  min(ns)  avg(ns)  max(ns)
   512      10,011   12,100   281,915
  1024       7,870    9,313   193,116
  1280       7,862    9,036   194,439
  1518       8,215    9,417   204,782

  PATCH
  =======
  Pkt size  min(ns)  avg(ns)  max(ns)
   512      10,492   13,655   281,538
  1024       8,407    9,784   205,095
  1280       8,399    9,750   194,888
  1518       8,367    9,722   196,973

Performance number reported by Eelco Chaudron <eechaudro at redhat.com> at
  https://mail.openvswitch.org/pipermail/ovs-dev/2017-June/333949.html
  https://mail.openvswitch.org/pipermail/ovs-dev/2017-May/332271.html
  https://mail.openvswitch.org/pipermail/ovs-dev/2017-April/331039.html

-----------------------------------
v3->v4
  * Merge patches 1/6 and 2/6. 
  * Move all the dpif layer changes in 4/6 to 6/6 to avoid build error with 
-Werror.
  * Updated the commit logs accordingly.
  * Verified with dpdk-stable-17.05.1.
v2->v3
  * Modified dpdk_do_tx_copy to buffer the packets.
  * Moved "Intermediate queue support" patch towards the end of series.
  * Flush the queues of non-pmd thread in dpif_netdev_run().
  * Removed the invalid comment for netdev_dpdk_vhost_txq_flush().
  * Updated vhost_txq_flush() to do extra validation and increment the drop 
count
    and free the memory.
  * Updated vring_state_changed() with flush function and appropriate comments.
  * Did sanity testing
    - (P2P, PVP(testpmd, linux forwarding)
    - Inter VM (VM2VM) 
    - PVP MQ test (with Queue enabled/disabled)
    - Tested flush logic on non PMD ports by pinging internal ports.
v1->v2
  * Add Acked-by tag from Eelco Chaudron.
  * Rebased on master due to HW offload changes.
  * Introduced union for packet count and buffers and changed the variable
    names appropriately.
  * No functional change changes.

Bhanuprakash Bodireddy (5):
  netdev: Add netdev_txq_flush function.
  netdev-dpdk: Add netdev_dpdk_vhost_txq_flush function.
  netdev-dpdk: Add intermediate queue support.
  netdev-dpdk: Enable intermediate queue for vHost User port.
  dpif-netdev: Flush the packets in intermediate queue.

 lib/dpif-netdev.c     |  52 +++++++++++-
 lib/netdev-bsd.c      |   1 +
 lib/netdev-dpdk.c     | 227 +++++++++++++++++++++++++++++++++++++++++++-------
 lib/netdev-dummy.c    |   1 +
 lib/netdev-linux.c    |   1 +
 lib/netdev-provider.h |   8 ++
 lib/netdev-vport.c    |   2 +-
 lib/netdev.c          |   9 ++
 lib/netdev.h          |   1 +
 9 files changed, 272 insertions(+), 30 deletions(-)

-- 
2.4.11

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to