[dpdk-dev] [PATCH v2 2/2] doc: add svg for debug and troubleshoot guide

Vipin Varghese vipin.varghese at intel.com
Fri Nov 9 11:06:02 CET 2018


Add svg for debug and troubleshoot guide for single or
multi stage applications.

Signed-off-by: Vipin Varghese <vipin.varghese at intel.com>
Acked-by: Marko Kovacevic <marko.kovacevic at intel.com>
---

V2:
 - add ACK from Marko - Vipin Varghese
---
 doc/guides/howto/debug_troubleshoot_guide.rst | 264 +++++++++---------
 doc/guides/howto/img/dtg_consumer_ring.svg    |  19 ++
 doc/guides/howto/img/dtg_crypto.svg           |  16 ++
 .../howto/img/dtg_distributor_worker.svg      |  31 ++
 doc/guides/howto/img/dtg_mempool.svg          |  22 ++
 doc/guides/howto/img/dtg_pdump.svg            |  28 ++
 doc/guides/howto/img/dtg_producer_ring.svg    |  19 ++
 doc/guides/howto/img/dtg_qos_tx.svg           |  24 ++
 doc/guides/howto/img/dtg_rx_rate.svg          |  20 ++
 doc/guides/howto/img/dtg_rx_tx_drop.svg       |  28 ++
 doc/guides/howto/img/dtg_sample_app_model.svg | 105 +++++++
 doc/guides/howto/img/dtg_service.svg          |  15 +
 doc/guides/howto/index.rst                    |   2 +-
 13 files changed, 461 insertions(+), 132 deletions(-)
 create mode 100644 doc/guides/howto/img/dtg_consumer_ring.svg
 create mode 100644 doc/guides/howto/img/dtg_crypto.svg
 create mode 100644 doc/guides/howto/img/dtg_distributor_worker.svg
 create mode 100644 doc/guides/howto/img/dtg_mempool.svg
 create mode 100644 doc/guides/howto/img/dtg_pdump.svg
 create mode 100644 doc/guides/howto/img/dtg_producer_ring.svg
 create mode 100644 doc/guides/howto/img/dtg_qos_tx.svg
 create mode 100644 doc/guides/howto/img/dtg_rx_rate.svg
 create mode 100644 doc/guides/howto/img/dtg_rx_tx_drop.svg
 create mode 100644 doc/guides/howto/img/dtg_sample_app_model.svg
 create mode 100644 doc/guides/howto/img/dtg_service.svg

diff --git a/doc/guides/howto/debug_troubleshoot_guide.rst b/doc/guides/howto/debug_troubleshoot_guide.rst
index a76000231..7b0452582 100644
--- a/doc/guides/howto/debug_troubleshoot_guide.rst
+++ b/doc/guides/howto/debug_troubleshoot_guide.rst
@@ -10,10 +10,10 @@ DPDK applications can be designed to run as single thread simple stage to
 multiple threads with complex pipeline stages. These application can use poll
 mode devices which helps in offloading CPU cycles. A few models are
 
-	*  single primary
-	*  multiple primary
-	*  single primary single secondary
-	*  single primary multiple secondary
+  *  single primary
+  *  multiple primary
+  *  single primary single secondary
+  *  single primary multiple secondary
 
 In all the above cases, it is a tedious task to isolate, debug and understand
 odd behaviour which can occurring random or periodic. The goal of guide is to
@@ -60,21 +60,22 @@ RX Port and associated core :numref:`dtg_rx_rate`.
    RX send rate compared against Receieved rate
 
 #. are generic configuration correct?
-	-  What is port Speed, Duplex? rte_eth_link_get()
-	-  Is packet of higher sizes are dropped? rte_eth_get_mtu()
-	-  Are only specific MAC are received? rte_eth_promiscuous_get()
+    -  What is port Speed, Duplex? rte_eth_link_get()
+    -  Is packet of higher sizes are dropped? rte_eth_get_mtu()
+    -  Are only specific MAC are received? rte_eth_promiscuous_get()
 
 #. are there NIC specific drops?
-	-  Check rte_eth_rx_queue_info_get() for nb_desc, scattered_rx,
-	-  Check rte_eth_dev_stats() for Stats per queue
-	-  Is stats of other queues shows no change via
-	   rte_eth_dev_dev_rss_hash_conf_get()
+    -  Check rte_eth_rx_queue_info_get() for nb_desc and scattered_rx
+    -  Check the offload flags.
+    -  Check rte_eth_dev_stats() for Stats per queue
+    -  Is stats of other queues shows no change via
+       rte_eth_dev_dev_rss_hash_conf_get()
 
 #. If problem still persists, this might be at RX lcore thread
-	-  Check if RX thread, distributor or event rx adapter is holding or
-	   processing more than required
-	-  try using rte_prefetch_non_temporal() to intimate the mbuf in pulled
-	   to cache for temporary
+    -  Check if RX thread, distributor or event rx adapter is holding or
+       processing more than required
+    -  try using rte_prefetch_non_temporal() to intimate the mbuf in pulled
+       to cache for temporary
 
 
 Are there packet drops (receive|transmit)?
@@ -89,13 +90,14 @@ RX-TX Port and associated cores :numref:`dtg_rx_tx_drop`.
    RX-TX drops
 
 #. at RX
-	-  Get the rx queues by rte_eth_dev_info_get() for nb_rx_queues
-	-  Check for miss, errors, qerros by rte_eth_dev_stats() for imissed,
-	   ierrors, q_erros, rx_nombuf, rte_mbuf_ref_count
+    -  Get the rx queues by rte_eth_dev_info_get() for nb_rx_queues
+    -  Check for miss, errors, qerros by rte_eth_dev_stats() for imissed,
+       ierrors, q_erros, rx_nombuf, rte_mbuf_ref_count
 
 #. at TX
-	-  Are we doing in bulk to reduce the TX descriptor overhead?
-	-  Check rte_eth_dev_stats() for oerrors, qerros, rte_mbuf_ref_count
+    -  Are we doing in bulk to reduce the TX descriptor overhead?
+    -  Check rte_eth_dev_stats() for oerrors, qerros, rte_mbuf_ref_count
+    -  Check offload flag for MULTI segment offload.
 
 Are there object drops in producer point for ring?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -109,11 +111,11 @@ Producer point for ring :numref:`dtg_producer_ring`.
    Producer point for Rings
 
 #. Performance for Producer
-	-  Fetch the type of RING 'rte_ring_dump()' for flags (RING_F_SP_ENQ)
-	-  If '(burst enqueue - actual enqueue) > 0' check rte_ring_count() or
-	   rte_ring_free_count()
-	-  If 'burst or single enqueue is 0', then there is no more space check
-	   rte_ring_full() or not
+    -  Fetch the type of RING 'rte_ring_dump()' for flags (RING_F_SP_ENQ)
+    -  If '(burst enqueue - actual enqueue) > 0' check rte_ring_count() or
+       rte_ring_free_count()
+    -  If 'burst or single enqueue is 0', then there is no more space check
+       rte_ring_full() or not
 
 Are there object drops in consumer point for ring?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -127,10 +129,10 @@ Consumer point for ring :numref:`dtg_consumer_ring`.
    Consumer point for Rings
 
 #. Performance for Consumer
-	-  Fetch the type of RING – rte_ring_dump() for flags (RING_F_SC_DEQ)
-	-  If '(burst dequeue - actual dequeue) > 0' for rte_ring_free_count()
-	-  If 'burst or single enqueue' always results 0 check the ring is empty
-	   via rte_ring_empty()
+    -  Fetch the type of RING – rte_ring_dump() for flags (RING_F_SC_DEQ)
+    -  If '(burst dequeue - actual dequeue) > 0' for rte_ring_free_count()
+    -  If 'burst or single enqueue' always results 0 check the ring is empty
+       via rte_ring_empty()
 
 Is packets or objects are not processed at desired rate?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -144,36 +146,36 @@ Memory objects close to NUMA :numref:`dtg_mempool`.
    Memory objects has to be close to device per NUMA
 
 #. Is the performance low?
-	-  Are packets received from multiple NIC? rte_eth_dev_count_all()
-	-  Are NIC interfaces on different socket? use rte_eth_dev_socket_id()
-	-  Is mempool created with right socket? rte_mempool_create() or
-	   rte_pktmbuf_pool_create()
-	-  Are we seeing drop on specific socket? It might require more
-	   mempool objects; try allocating more objects
-	-  Is there single RX thread for multiple NIC? try having multiple
-	   lcore to read from fixed interface or we might be hitting cache
-	   limit, so Increase cache_size for pool_create()
+    -  Are packets received from multiple NIC? rte_eth_dev_count_all()
+    -  Are NIC interfaces on different socket? use rte_eth_dev_socket_id()
+    -  Is mempool created with right socket? rte_mempool_create() or
+       rte_pktmbuf_pool_create()
+    -  Are we seeing drop on specific socket? It might require more
+       mempool objects; try allocating more objects
+    -  Is there single RX thread for multiple NIC? try having multiple
+       lcore to read from fixed interface or we might be hitting cache
+       limit, so Increase cache_size for pool_create()
 
 #. Are we are still seeing low performance
-        -  Check if sufficient objects in mempool by rte_mempool_avail_count()
-        -  Is failure in some pkt? we might be getting pkts with size > mbuf
-	   data size. Check rte_pktmbuf_is_continguous()
-        -  If user pthread is used to access object access
-	   rte_mempool_cache_create()
-        -  Try using 1GB huge pages instead of 2MB. If there is difference,
-           try then rte_mem_lock_page() for 2MB pages
+    -  Check if sufficient objects in mempool by rte_mempool_avail_count()
+    -  Is failure in some pkt? we might be getting pkts with size > mbuf
+       data size. Check rte_pktmbuf_is_continguous()
+    -  If user pthread is used to access object access
+       rte_mempool_cache_create()
+    -  Try using 1GB huge pages instead of 2MB. If there is difference,
+       try then rte_mem_lock_page() for 2MB pages
 
 .. note::
   Stall in release of MBUF can be because
 
-	*  Processing pipeline is too heavy
-	*  Number of stages are too many
-	*  TX is not transferred at desired rate
-	*  Multi segment is not offloaded at TX device.
-	*  Application misuse scenarios can be
-		-  not freeing packets
-		-  invalid rte_pktmbuf_refcnt_set
-		-  invalid rte_pktmbuf_prefree_seg
+  *  Processing pipeline is too heavy
+  *  Number of stages are too many
+  *  TX is not transferred at desired rate
+  *  Multi segment is not offloaded at TX device.
+  *  Application misuse scenarios can be
+      -  not freeing packets
+      -  invalid rte_pktmbuf_refcnt_set
+      -  invalid rte_pktmbuf_prefree_seg
 
 Is there difference in performance for crypto?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -187,25 +189,25 @@ Crypto device and PMD :numref:`dtg_crypto`.
    CRYPTO and interaction with PMD device
 
 #. are generic configuration correct?
-	-  Get total crypto devices – rte_cryptodev_count()
-	-  Cross check SW or HW flags are configured properly
-	   rte_cryptodev_info_get() for feature_flags
+    -  Get total crypto devices – rte_cryptodev_count()
+    -  Cross check SW or HW flags are configured properly
+       rte_cryptodev_info_get() for feature_flags
 
 #. If enqueue request > actual enqueue (drops)?
-	-  Is the queue pair setup for proper node
-	   rte_cryptodev_queue_pair_setup() for socket_id
-	-  Is the session_pool created from same socket_id as queue pair?
-	-  Is enqueue thread same socket_id?
-	-  rte_cryptodev_stats() for drops err_count for enqueue or dequeue
-	-  Are there multiple threads enqueue or dequeue from same queue pair?
+    -  Is the queue pair setup for proper node
+       rte_cryptodev_queue_pair_setup() for socket_id
+    -  Is the session_pool created from same socket_id as queue pair?
+    -  Is enqueue thread same socket_id?
+    -  rte_cryptodev_stats() for drops err_count for enqueue or dequeue
+    -  Are there multiple threads enqueue or dequeue from same queue pair?
 
 #. If enqueue rate > dequeue rate?
-	-  Is dequeue lcore thread is same socket_id?
-	-  If SW crypto is in use, check if the CRYPTO Library build with
-	   right (SIMD) flags Or check if the queue pair using CPU ISA by
-	   rte_cryptodev_info_get() for feature_flags for AVX|SSE
-	-  If we are using HW crypto – Is the card on same NUMA socket as
-	   queue pair and session pool?
+    -  Is dequeue lcore thread is same socket_id?
+    -  If SW crypto is in use, check if the CRYPTO Library build with
+       right (SIMD) flags Or check if the queue pair using CPU ISA by
+       rte_cryptodev_info_get() for feature_flags for AVX|SSE
+    -  If we are using HW crypto – Is the card on same NUMA socket as
+       queue pair and session pool?
 
 worker functions not giving performance?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -219,21 +221,21 @@ Custom worker function :numref:`dtg_distributor_worker`.
    Custom worker function performance drops
 
 #. Performance
-	-  Threads context switches more frequently? Identify lcore with
-	   rte_lcore() and lcore index mapping with rte_lcore_index(). Best
-	   performance when mapping of thread and core is 1:1.
-	-  Check lcore role type and state? rte_eal_lcore_role for
-	   rte, off and service. User function on service core might be
-	   sharing timeslots with other functions.
-	-  Check the cpu core? check rte_thread_get_affinity() and
-	   rte_eal_get_lcore_state() for run state.
+    -  Threads context switches more frequently? Identify lcore with
+       rte_lcore() and lcore index mapping with rte_lcore_index(). Best
+       performance when mapping of thread and core is 1:1.
+    -  Check lcore role type and state? rte_eal_lcore_role for
+       rte, off and service. User function on service core might be
+       sharing timeslots with other functions.
+    -  Check the cpu core? check rte_thread_get_affinity() and
+       rte_eal_get_lcore_state() for run state.
 
 #. Debug
-	-  Mode of operation? rte_eal_get_configuration() for master, fetch
-	   lcore|service|numa count, process_type.
-	-  Check lcore run mode? rte_eal_lcore_role() for rte, off, service.
-	-  process details? rte_dump_stack(), rte_dump_registers() and
-	   rte_memdump() will give insights.
+    -  Mode of operation? rte_eal_get_configuration() for master, fetch
+       lcore|service|numa count, process_type.
+    -  Check lcore run mode? rte_eal_lcore_role() for rte, off, service.
+    -  process details? rte_dump_stack(), rte_dump_registers() and
+       rte_memdump() will give insights.
 
 service functions are not frequent enough?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -247,36 +249,36 @@ service functions on service cores :numref:`dtg_service`.
    functions running on service cores
 
 #. Performance
-	-  Get service core count? rte_service_lcore_count() and compare with
-	   result of rte_eal_get_configuration()
-	-  Check if registered service is available?
-	   rte_service_get_by_name(), rte_service_get_count() and
-	   rte_service_get_name()
-	-  Is given service running parallel on multiple lcores?
-	   rte_service_probe_capability() and rte_service_map_lcore_get()
-	-  Is service running? rte_service_runstate_get()
+    -  Get service core count? rte_service_lcore_count() and compare with
+       result of rte_eal_get_configuration()
+    -  Check if registered service is available?
+       rte_service_get_by_name(), rte_service_get_count() and
+       rte_service_get_name()
+    -  Is given service running parallel on multiple lcores?
+       rte_service_probe_capability() and rte_service_map_lcore_get()
+    -  Is service running? rte_service_runstate_get()
 
 #. Debug
-	-  Find how many services are running on specific service lcore by
-	   rte_service_lcore_count_services()
-	-  Generic debug via rte_service_dump()
+    -  Find how many services are running on specific service lcore by
+       rte_service_lcore_count_services()
+    -  Generic debug via rte_service_dump()
 
 Is there bottleneck in eventdev?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 #. are generic configuration correct?
-	-  Get event_dev devices? rte_event_dev_count()
-	-  Are they created on correct socket_id? - rte_event_dev_socket_id()
-	-  Check if HW or SW capabilities? - rte_event_dev_info_get() for
-	   event_qos, queue_all_types, burst_mode, multiple_queue_port,
-	   max_event_queue|dequeue_depth
-	-  Is packet stuck in queue? check for stages (event qeueue) where
-	   packets are looped back to same or previous stages.
+    -  Get event_dev devices? rte_event_dev_count()
+    -  Are they created on correct socket_id? - rte_event_dev_socket_id()
+    -  Check if HW or SW capabilities? - rte_event_dev_info_get() for
+       event_qos, queue_all_types, burst_mode, multiple_queue_port,
+       max_event_queue|dequeue_depth
+    -  Is packet stuck in queue? check for stages (event qeueue) where
+       packets are looped back to same or previous stages.
 
 #. Performance drops in enqueue (event count > actual enqueue)?
-	-  Dump the event_dev information? rte_event_dev_dump()
-	-  Check stats for queue and port for eventdev
-	-  Check the inflight, current queue element for enqueue|deqeue
+    -  Dump the event_dev information? rte_event_dev_dump()
+    -  Check stats for queue and port for eventdev
+    -  Check the inflight, current queue element for enqueue|deqeue
 
 How to debug QoS via TM?
 ~~~~~~~~~~~~~~~~~~~~~~~~
@@ -290,25 +292,25 @@ TM on TX interface :numref:`dtg_qos_tx`.
    Traffic Manager just before TX
 
 #. Is configuration right?
-	-  Get current capabilities for DPDK port rte_tm_capabilities_get()
-	   for max nodes, level, shaper_private, shaper_shared, sched_n_children
-	   and stats_mask
-	-  Check if current leaf are configured identically rte_tm_capabilities_get()
-	   for lead_nodes_identicial
-	-  Get leaf nodes for a dpdk port – rte_tn_get_number_of_leaf_node()
-	-  Check level capabilities by rte_tm_level_capabilities_get for n_nodes
-		-  Max, nonleaf_max, leaf_max
-		-  identical, non_identical
-		-  Shaper_private_supported
-		-  Stats_mask
-		-  Cman wred packet|byte supported
-		-  Cman head drop supported
-	-  Check node capabilities by rte_tm_node_capabilities_get for n_nodes
-		-  Shaper_private_supported
-		-  Stats_mask
-		-  Cman wred packet|byte supported
-		-  Cman head drop supported
-	-  Debug via stats – rte_tm_stats_update() and rte_tm_node_stats_read()
+    -  Get current capabilities for DPDK port rte_tm_capabilities_get()
+       for max nodes, level, shaper_private, shaper_shared, sched_n_children
+       and stats_mask
+    -  Check if current leaf are configured identically rte_tm_capabilities_get()
+       for lead_nodes_identicial
+    -  Get leaf nodes for a dpdk port - rte_tn_get_number_of_leaf_node()
+    -  Check level capabilities by rte_tm_level_capabilities_get for n_nodes
+        -  Max, nonleaf_max, leaf_max
+        -  identical, non_identical
+        -  Shaper_private_supported
+        -  Stats_mask
+        -  Cman wred packet|byte supported
+        -  Cman head drop supported
+    -  Check node capabilities by rte_tm_node_capabilities_get for n_nodes
+        -  Shaper_private_supported
+        -  Stats_mask
+        -  Cman wred packet|byte supported
+        -  Cman head drop supported
+    -  Debug via stats - rte_tm_stats_update() and rte_tm_node_stats_read()
 
 Packet is not of right format?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -326,24 +328,24 @@ Packet capture before and after processing :numref:`dtg_pdump`.
 
 .. note::
   Need to explore:
-	*  if secondary shares same interface can we enable from secondary
-	   for rx|tx happening on primary
-	*  Specific PMD private data dump the details
-	*  User private data if present, dump the details
+    *  if secondary shares same interface can we enable from secondary
+       for rx|tx happening on primary
+    *  Specific PMD private data dump the details
+    *  User private data if present, dump the details
 
 How to develop custom code to debug?
 ------------------------------------
 
--  For single process – the debug functionality is to be added in same
+-  For single process - the debug functionality is to be added in same
    process
--  For multiple process – the debug functionality can be added to
+-  For multiple process - the debug functionality can be added to
    secondary multi process
 
 ..
 
-These can be achieved by Primary’s Debug functions invoked via
+These can be achieved by Primary's Debug functions invoked via
 
-	#. Timer call-back
-	#. Service function under service core
-	#. USR1 or USR2 signal handler
+  #. Timer call-back
+  #. Service function under service core
+  #. USR1 or USR2 signal handler
 
diff --git a/doc/guides/howto/img/dtg_consumer_ring.svg b/doc/guides/howto/img/dtg_consumer_ring.svg
new file mode 100644
index 000000000..d0e0b30f8
--- /dev/null
+++ b/doc/guides/howto/img/dtg_consumer_ring.svg
@@ -0,0 +1,19 @@
+<svg width="634" height="97" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>consumer ring</title>
+  <rect fill="#fff" id="canvas_background" height="99" width="636" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_1" height="95" width="135" y="0" x="0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#9ACEE6"/>
+  <rect id="svg_2" height="95" width="135" y="2" x="252" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#9ACEE6"/>
+  <rect id="svg_3" height="95" width="135" y="2" x="499" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#9ACEE6"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_4" y="45" x="10" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Stage 1</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_5" y="52" x="268" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Stage 2</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_6" y="53" x="517" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Stage 3</text>
+  <path transform="rotate(90.19324493408203 177.864990234375,48.89100646972658) " id="svg_7" d="m155.364991,48.766198l22.499998,-51.875196l22.499998,51.875196l-11.25,0l0,52.12481l-22.499996,0l0,-52.12481l-11.25,0z" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#4D2425"/>
+  <path transform="rotate(90.19324493408203 434.864990234375,48.89100646972656) " id="svg_8" d="m412.364991,48.766198l22.499998,-51.875196l22.499998,51.875196l-11.25,0l0,52.12481l-22.499996,0l0,-52.12481l-11.25,0z" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#4D2425"/>
+  <path id="svg_10" d="m225.937481,47.95781l0,0c0,-10.493411 8.282734,-19 18.500005,-19l0,0c4.906504,0 9.612052,2.00178 13.081477,5.564971c3.469424,3.563191 5.418523,8.395917 5.418523,13.435029l0,0c0,10.493408 -8.282732,18.999998 -18.5,18.999998l0,0c-10.217271,0 -18.500005,-8.506591 -18.500005,-18.999998zm18.500005,-19l0,37.999998m-18.500005,-18.999998l37.000005,0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8CD79F"/>
+  <path id="svg_11" d="m475.937481,46.95781l0,0c0,-10.493411 8.282734,-19.000001 18.500005,-19.000001l0,0c4.906504,0 9.612052,2.00178 13.081477,5.564972c3.469424,3.563191 5.418523,8.395916 5.418523,13.435029l0,0c0,10.493408 -8.282732,18.999997 -18.5,18.999997l0,0c-10.217271,0 -18.500005,-8.50659 -18.500005,-18.999997zm18.500005,-19.000001l0,37.999998m-18.500005,-18.999997l37.000005,0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8CD79F"/>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_crypto.svg b/doc/guides/howto/img/dtg_crypto.svg
new file mode 100644
index 000000000..7687aaa4a
--- /dev/null
+++ b/doc/guides/howto/img/dtg_crypto.svg
@@ -0,0 +1,16 @@
+<svg width="180" height="230" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>crypto</title>
+  <rect fill="#fff" id="canvas_background" height="232" width="182" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_21" height="1" width="0" y="369.4375" x="838.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#A0D58A"/>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_25" y="222.4375" x="39.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Core 7</text>
+  <rect stroke="#000" id="svg_26" height="44.000003" width="155.000001" y="151.437497" x="6.499997" fill-opacity="null" stroke-opacity="null" stroke-width="0" fill="#7AD6CA"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_27" y="179.4375" x="13.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">CRYPTO PMD</text>
+  <ellipse stroke="#000" ry="41.5" rx="66.500001" id="svg_28" cy="48.9375" cx="87.999997" fill-opacity="null" stroke-opacity="null" stroke-width="0" fill="#7AD6CA"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_29" y="57.4375" x="45.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Device</text>
+  <path stroke="#000" transform="rotate(-90.19718170166016 85.76751708984375,119.45785522460936) " id="svg_30" d="m40.743289,119.457895l26.106598,-13.915756l0,6.95786l37.835289,0l0,-6.95786l26.106586,13.915756l-26.106586,13.915682l0,-6.957842l-37.835289,0l0,6.957842l-26.106598,-13.915682z" stroke-opacity="null" stroke-width="0" fill="#845335"/>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_distributor_worker.svg b/doc/guides/howto/img/dtg_distributor_worker.svg
new file mode 100644
index 000000000..3df758fa6
--- /dev/null
+++ b/doc/guides/howto/img/dtg_distributor_worker.svg
@@ -0,0 +1,31 @@
+<svg width="600" height="235" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>dsitributor and worker</title>
+  <rect fill="#fff" id="canvas_background" height="237" width="602" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect stroke="#000" id="svg_1" height="89.999991" width="202.000004" y="21.000003" x="4" stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start"
+   font-family="'Courier New', Courier, monospace" font-size="24" id="svg_4" y="47" x="7"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">PKT classify</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_12" y="96.5" x="25.992188" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Distribute</text>
+  <path id="svg_13" d="m334.224445,98.046256l16.252783,-5.432074l-16.252783,-5.429993l-16.256262,-5.427952l0,6.038517c-4.264321,-0.004069 -11.331234,-0.004069 -13.334561,-0.004069c-5.919233,-0.081711 -9.804243,-1.153783 -13.847174,-3.073397c-6.02597,-2.865095 -11.16889,-8.021466 -17.371313,-12.989922c-3.154554,-2.470933 -6.669049,-4.921502 -11.349751,-6.892119c-4.633926,-1.978838 -10.68815,-3.351144 -17.41807,-3.324591l-29.170102,0l0,9.646983l29.170102,0c4.056131,0.042884 6.623169,0.808657 10.124445,2.70786c5.179989,2.824261 10.230311,8.223602 17.195784,13.339136c6.826056,5.066481 17.329865,10.182006 32.564612,10.231017l13.436029,0l0,6.0385l16.256262,-5.427896zm-68.759273,-36.535597c0.184389,0.075572 0.379369,0.14089 0.559297,0.218526c5.559349,2.340242 9.573988,5.211493 12.751502,7.709001c0.730423,0.584013 1.377934,1.145611 2.071302,1.719456l37.120911,0l0,6.040581l16.256262,-5.42798l16.252783,-5.429962l-16.252783,-5.432037l-16.256262,-5.434093l0,6.036509l-52.503011,0z"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#FFAC8D"/>
+  <rect stroke="#000" id="svg_17" height="110.999999" width="180" y="3.4375" x="353.5"
+   stroke-opacity="null" stroke-width="0" fill="#FABA6F"/>
+  <rect stroke="#000" id="svg_14" height="110.999999" width="180" y="31.4375" x="369.5"
+   stroke-opacity="null" stroke-width="0" fill="#FFB27C"/>
+  <rect stroke="#000" id="svg_15" height="110.999999" width="180" y="58.4375" x="392.5"
+   stroke-opacity="null" stroke-width="0" fill="#FFF093"/>
+  <rect stroke="#000" id="svg_16" height="110.999999" width="180" y="90.4375" x="413.5"
+   stroke-opacity="null" stroke-width="0" fill="#FFE7A2"/>
+  <text stroke="#000" transform="matrix(0.678871691226959,0,0,0.7037037014961243,142.60348030924797,64.2037038393319) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_18" y="71.490132" x="413.769676" stroke-opacity="null" stroke-width="0" fill="#000000">worker 1</text>
+  <text stroke="#000" transform="matrix(0.678871691226959,0,0,0.7037037014961243,121.60348030924797,9.203703839331922) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_19" y="101.332237" x="406.404514" stroke-opacity="null" stroke-width="0" fill="#000000">worker 2</text>
+  <text stroke="#000" transform="matrix(0.678871691226959,0,0,0.7037037014961243,121.60348030924797,9.203703839331922) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_20" y="58.700658" x="376.943866" stroke-opacity="null" stroke-width="0" fill="#000000">worker 3</text>
+  <text style="cursor: move;" stroke="#000" transform="matrix(0.678871691226959,0,0,0.7037037014961243,121.60348030924797,9.203703839331922) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_22" y="18.911184" x="350.429283" stroke-opacity="null" stroke-width="0" fill="#000000">worker 4</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_23" y="139.4375" x="49.5"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 1</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_24" y="226.4375" x="404.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 2,3,4,5</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_mempool.svg b/doc/guides/howto/img/dtg_mempool.svg
new file mode 100644
index 000000000..f3d31a96e
--- /dev/null
+++ b/doc/guides/howto/img/dtg_mempool.svg
@@ -0,0 +1,22 @@
+<svg width="955" height="185" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>mempool</title>
+  <rect fill="#fff" id="canvas_background" height="187" width="957" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_21" height="1" width="0" y="370.4375" x="839.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#A0D58A"/>
+  <rect stroke="#000" id="svg_31" height="181.000002" width="951.000029" y="2.4375" x="3.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" fill="#7AD6CA"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_32" y="167.4375" x="14.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">MBUF pool</text>
+  <rect id="svg_38" height="71" width="859" y="15.4375" x="18.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8B4D4B"/>
+  <rect id="svg_39" height="71" width="859" y="32.4375" x="33.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8B4D4B"/>
+  <rect id="svg_40" height="71" width="859" y="47.4375" x="52.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8B4D4B"/>
+  <rect id="svg_41" height="71" width="859" y="62.4375" x="71.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8B4D4B"/>
+  <rect stroke="#000" id="svg_42" height="55.999999" width="403.000005" y="69.4375" x="486.499995" stroke-opacity="null" stroke-width="0" fill="#FFAC8D"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_43" y="103.4375" x="631.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Payload</text>
+  <rect stroke="#000" id="svg_44" height="56" width="140.999999" y="68.4375" x="292.500001" stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_45" y="105.4375" x="303.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Metadata</text>
+  <rect stroke="#000" id="svg_46" height="53" width="185.999997" y="70.4375" x="90.5" stroke-opacity="null" stroke-width="0" fill="#EDFFFF"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_47" y="104.4375" x="105.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">struct mbuf</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_pdump.svg b/doc/guides/howto/img/dtg_pdump.svg
new file mode 100644
index 000000000..1dc63bed7
--- /dev/null
+++ b/doc/guides/howto/img/dtg_pdump.svg
@@ -0,0 +1,28 @@
+<svg width="860" height="140" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>pdump</title>
+  <rect fill="#fff" id="canvas_background" height="142" width="862" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect stroke="#000" id="svg_15" height="127.999992" width="568" y="7" x="8.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" fill="#B1FFFF"/>
+  <rect id="svg_2" height="51" width="100" y="23" x="22.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#CC7C65"/>
+  <rect id="svg_3" height="51" width="100" y="26" x="455.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#CC7C65"/>
+  <path id="svg_7" d="m208.364769,78.968848l12.704559,-5.623238l12.697917,-5.625551l-12.704644,-5.629525l-12.697836,-5.625202l0,6.255891c-3.112384,0 -6.729051,0 -7.940704,0c-5.776899,0.124913 -12.907107,-3.365352 -20.492742,-7.864703c-2.827801,-1.577599 -5.680695,-3.313223 -8.704363,-4.88042c3.023667,-1.569118 5.872475,-3.302747 8.704363,-4.880295c7.585635,-4.493132 14.715839,-7.98967 20.485292,-7.862546l7.94815,-0.002103l0,6.264275l12.697836,-5.627447l12.704644,-5.631775l-12.704644,-5.637807l-12.697836,-5.629547l0,6.260273l-7.944067,0c-11.799214,0.12679 -20.61742,5.506774 -28.333828,9.879239c-7.660201,4.613909 -14.545738,8.087381 -18.539115,7.862617l-22.780531,0l0,9.993806l22.788007,0c3.989952,-0.226969 10.878944,3.248761 18.53841,7.86254c7.71303,4.374678 16.52785,9.750196 28.330427,9.879312l7.940704,0l0,6.262203l0,0l0,0.000003z" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#559E84"/>
+  <path id="svg_8" d="m439.457308,43.77545l-10.478696,-7.306254l0,8.12971l-18.805519,0c-3.29272,0.296972 -8.977707,-4.212008 -15.298608,-10.195089c-6.365074,-5.675375 -13.639418,-12.638687 -23.37938,-12.824984l-6.552957,0l0,12.959904l6.552957,0c4.770151,-0.167389 10.652051,4.360514 16.914219,10.203329c2.334186,2.041106 4.688512,4.292919 7.183208,6.326016c-2.494696,2.035766 -4.846223,4.290275 -7.183208,6.331424c-6.262164,5.826551 -12.144067,10.365242 -16.908056,10.200515l-6.559117,0l0,12.978808l6.555749,0c9.719269,-0.1646 16.996426,-7.14678 23.382185,-12.814082c6.32147,-5.983193 12.003677,-10.494803 15.299177,-10.203221l18.799357,0l0,8.129634l10.478696,-7.298036l10.484823,-7.303408l-10.484823,-7.314263l-0.000006,-0.000004z" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#559E84"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_9" y="54" x="53.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">RX</text>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_10" y="57" x="486.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">TX</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_11" y="40" x="243.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Q1</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_12" y="77" x="243.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Q2</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_13" y="82" x="326.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Q4</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_14" y="40" x="327.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Q3</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_16" y="114.86203" x="234.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Primary</text>
+  <rect stroke="#000" id="svg_18" height="90.000001" width="201.999994" y="29.437499" x="654.5" stroke-opacity="null" stroke-width="0" fill="#7AD6CA"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_19" y="102.4375" x="684.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Secondary</text>
+  <rect stroke="#000" id="svg_20" height="42.000001" width="184.000001" y="34.437499" x="664.499994" stroke-opacity="null" stroke-width="0" fill="#A0D58A"/>
+  <rect id="svg_21" height="1" width="0" y="366.4375" x="835.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#A0D58A"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_22" y="59.4375" x="668.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Ring BufferQ</text>
+  <path stroke="#000" transform="rotate(89.78996276855469 615.4766845703124,74.49395751953122) " id="svg_24" d="m599.023803,74.414257l17.255478,-33.667333l15.650356,33.667333l-8.226459,0l0,33.826726l-16.452915,0l0,-33.826726l-8.226459,0z" fill-opacity="null" stroke-opacity="null" stroke-width="0" fill="#7AD6CA"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_25" y="22.4375" x="714.5" fill-opacity="null" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Core 0</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_producer_ring.svg b/doc/guides/howto/img/dtg_producer_ring.svg
new file mode 100644
index 000000000..5657702e5
--- /dev/null
+++ b/doc/guides/howto/img/dtg_producer_ring.svg
@@ -0,0 +1,19 @@
+<svg width="634" height="97" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>producer ring</title>
+  <rect fill="#fff" id="canvas_background" height="99" width="636" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_1" height="95" width="135" y="0" x="0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#9ACEE6"/>
+  <rect id="svg_2" height="95" width="135" y="2" x="252" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#9ACEE6"/>
+  <rect id="svg_3" height="95" width="135" y="2" x="499" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#9ACEE6"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_4" y="45" x="10" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Stage 1</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_5" y="52" x="268" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Stage 2</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_6" y="53" x="517" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Stage 3</text>
+  <path transform="rotate(90.19324493408203 197.864990234375,42.89100646972657) " id="svg_7" d="m175.364991,42.766198l22.499998,-51.875196l22.499998,51.875196l-11.25,0l0,52.12481l-22.499996,0l0,-52.12481l-11.25,0z" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#4D2425"/>
+  <path transform="rotate(90.19324493408203 445.864990234375,47.89100646972657) " id="svg_8" d="m423.364991,47.766198l22.499998,-51.875196l22.499998,51.875196l-11.25,0l0,52.12481l-22.499996,0l0,-52.12481l-11.25,0z" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#4D2425"/>
+  <path id="svg_10" d="m120.937481,42.95781l0,0c0,-10.493411 8.282734,-19 18.500005,-19l0,0c4.906504,0 9.612052,2.00178 13.081477,5.564971c3.469424,3.563191 5.418523,8.395917 5.418523,13.435029l0,0c0,10.493408 -8.282732,18.999998 -18.5,18.999998l0,0c-10.217271,0 -18.500005,-8.506591 -18.500005,-18.999998zm18.500005,-19l0,37.999998m-18.500005,-18.999998l37.000005,0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8CD79F"/>
+  <path id="svg_11" d="m373.937481,45.95781l0,0c0,-10.493411 8.282734,-19.000001 18.500005,-19.000001l0,0c4.906504,0 9.612052,2.00178 13.081477,5.564972c3.469424,3.563191 5.418523,8.395916 5.418523,13.435029l0,0c0,10.493408 -8.282732,18.999997 -18.5,18.999997l0,0c-10.217271,0 -18.500005,-8.50659 -18.500005,-18.999997zm18.500005,-19.000001l0,37.999998m-18.500005,-18.999997l37.000005,0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#8CD79F"/>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_qos_tx.svg b/doc/guides/howto/img/dtg_qos_tx.svg
new file mode 100644
index 000000000..6e46d188a
--- /dev/null
+++ b/doc/guides/howto/img/dtg_qos_tx.svg
@@ -0,0 +1,24 @@
+<svg width="287" height="180" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>qos</title>
+  <rect fill="#fff" id="canvas_background" height="182" width="289" y="-1" x="-1"/>
+  <g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
+   <rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
+  </g>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_21" height="180" width="287" y="0" x="0" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#CBFFFF"/>
+  <rect id="svg_10" height="82" width="78" y="17.808165" x="152.25" stroke-width="1.5" stroke="#000" fill="#CC7C65"/>
+  <rect id="svg_11" height="82" width="78" y="36.808165" x="171.25" stroke-width="1.5" stroke="#000" fill="#CE7975"/>
+  <rect id="svg_12" height="82" width="78" y="59.808165" x="188.25" stroke-width="1.5" stroke="#000" fill="#8B4D4B"/>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_13" y="113.808165" x="211.25" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">TX</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_14" y="161.808165" x="161.25" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Core1</text>
+  <text stroke="#000" transform="matrix(0.47219348024375296,0,0,0.8034176367619965,-95.87709913037096,-156.57412588945806) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_15" y="235.775764" x="531.631651" stroke-opacity="null" stroke-width="0" fill="#000000">NIC1</text>
+  <text stroke="#000" transform="matrix(0.3615568424500273,0,0,0.9358925757041695,106.13283890389599,-107.01445723901463) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_16" y="173.881425" x="192.8023" stroke-opacity="null" stroke-width="0" fill="#000000">NIC2</text>
+  <text stroke="#000" transform="matrix(0.4371257876803068,0,0,0.6973431388181265,223.6990186363727,31.828115819425847) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_17" y="66.670315" x="-70.838675" stroke-opacity="null" stroke-width="0" fill="#000000">NIC3</text>
+  <rect id="svg_18" height="103" width="104" y="26" x="26" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#FABA6F"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_19" y="79" x="50" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">QoS</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_20" y="153" x="27" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 10</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_rx_rate.svg b/doc/guides/howto/img/dtg_rx_rate.svg
new file mode 100644
index 000000000..311c9c43f
--- /dev/null
+++ b/doc/guides/howto/img/dtg_rx_rate.svg
@@ -0,0 +1,20 @@
+<svg width="116" height="152" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>rx rate</title>
+  <rect fill="#fff" id="canvas_background" height="154" width="118" y="-1" x="-1"/>
+  <g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
+   <rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
+  </g>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_1" height="82" width="78" y="0.812613" x="0.75" stroke-width="1.5" stroke="#000" fill="#CC7C65"/>
+  <rect id="svg_2" height="82" width="78" y="19.812613" x="19.75" stroke-width="1.5" stroke="#000" fill="#CE7975"/>
+  <rect id="svg_3" height="82" width="78" y="42.812613" x="36.75" stroke-width="1.5" stroke="#000" fill="#8B4D4B"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_4" y="96.812613" x="59.75" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">RX</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_5" y="144.812613" x="9.75" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Core0</text>
+  <text stroke="#000" transform="matrix(0.47219348024375296,0,0,0.8034176367619965,-95.87709913037096,-156.57412588945806) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_7" y="214.621694" x="210.788594" stroke-opacity="null" stroke-width="0" fill="#000000">NIC1</text>
+  <text stroke="#000" transform="matrix(0.36155684245002745,0,0,0.9358925757041695,-60.867161096103985,-178.0100101290174) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_8" y="231.580355" x="235.672461" stroke-opacity="null" stroke-width="0" fill="#000000">NIC2</text>
+  <text stroke="#000" transform="matrix(0.4371257876803068,0,0,0.6973431388181265,223.6990186363727,31.828115819425847) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_9" y="42.29845" x="-417.420836" stroke-opacity="null" stroke-width="0" fill="#000000">NIC3</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_rx_tx_drop.svg b/doc/guides/howto/img/dtg_rx_tx_drop.svg
new file mode 100644
index 000000000..2f4e9d587
--- /dev/null
+++ b/doc/guides/howto/img/dtg_rx_tx_drop.svg
@@ -0,0 +1,28 @@
+<svg width="275" height="154" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>rx-tx drops</title>
+  <rect fill="#fff" id="canvas_background" height="156" width="277" y="-1" x="-1"/>
+  <g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
+   <rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
+  </g>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect id="svg_1" height="82" width="78" y="0.808165" x="0.75" stroke-width="1.5" stroke="#000" fill="#CC7C65"/>
+  <rect id="svg_2" height="82" width="78" y="19.808165" x="19.75" stroke-width="1.5" stroke="#000" fill="#CE7975"/>
+  <rect id="svg_3" height="82" width="78" y="42.808165" x="36.75" stroke-width="1.5" stroke="#000" fill="#8B4D4B"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_4" y="96.808165" x="59.75" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">RX</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_5" y="144.808165" x="9.75" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Core0</text>
+  <text stroke="#000" transform="matrix(0.47219348024375296,0,0,0.8034176367619965,-95.87709913037096,-156.57412588945806) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_7" y="214.616159" x="210.788594" stroke-opacity="null" stroke-width="0" fill="#000000">NIC1</text>
+  <text stroke="#000" transform="matrix(0.3615568424500274,0,0,0.9358925757041695,-60.867161096103985,-178.01445723901463) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_8" y="231.580355" x="235.672461" stroke-opacity="null" stroke-width="0" fill="#000000">NIC2</text>
+  <text stroke="#000" transform="matrix(0.4371257876803068,0,0,0.6973431388181265,223.6990186363727,31.828115819425847) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_9" y="42.292073" x="-417.420836" stroke-opacity="null" stroke-width="0" fill="#000000">NIC3</text>
+  <rect id="svg_10" height="82" width="78" y="2.808165" x="159.75" stroke-width="1.5" stroke="#000" fill="#CC7C65"/>
+  <rect id="svg_11" height="82" width="78" y="21.808165" x="178.75" stroke-width="1.5" stroke="#000" fill="#CE7975"/>
+  <rect id="svg_12" height="82" width="78" y="44.808165" x="195.75" stroke-width="1.5" stroke="#000" fill="#8B4D4B"/>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_13" y="98.808165" x="218.75" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">TX</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_14" y="146.808165" x="168.75" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">Core1</text>
+  <text stroke="#000" transform="matrix(0.47219348024375296,0,0,0.8034176367619965,-95.87709913037096,-156.57412588945806) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_15" y="217.105524" x="547.514971" stroke-opacity="null" stroke-width="0" fill="#000000">NIC1</text>
+  <text stroke="#000" transform="matrix(0.36155684245002734,0,0,0.9358925757041695,98.13283890389599,-176.01445723901463) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_16" y="231.580355" x="235.672461" stroke-opacity="null" stroke-width="0" fill="#000000">NIC2</text>
+  <text stroke="#000" transform="matrix(0.4371257876803068,0,0,0.6973431388181265,223.6990186363727,31.828115819425847) " font-style="italic" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_17" y="45.160101" x="-53.681142" stroke-opacity="null" stroke-width="0" fill="#000000">NIC3</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_sample_app_model.svg b/doc/guides/howto/img/dtg_sample_app_model.svg
new file mode 100644
index 000000000..ad3b0995d
--- /dev/null
+++ b/doc/guides/howto/img/dtg_sample_app_model.svg
@@ -0,0 +1,105 @@
+<svg width="1418" height="379" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>sample application model</title>
+  <rect fill="#fff" id="canvas_background" height="381" width="1420" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect stroke="#000" id="svg_84" height="378.999996" width="1417.999937" y="0" x="0" stroke-opacity="null" stroke-width="0" fill="#B1FFFF"/>
+  <rect stroke="#000" id="svg_1" height="79.999993" width="187.000011" y="267" x="635.499996" stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <rect stroke="#000" id="svg_14" height="28.000001" width="175.000003" y="271.437495" x="641" stroke-opacity="null" stroke-width="0" fill="#FFB27C"/>
+  <rect stroke="#000" id="svg_16" height="36.000002" width="142" y="304.437495" x="659" stroke-opacity="null" stroke-width="0" fill="#FFE7A2"/>
+  <text stroke="#000" transform="matrix(0.7497134942573729,0,0,0.7607963681117937,149.70768863149087,72.0554119542491) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_18" y="335.740664" x="684.214296"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Health Check</text>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_23" y="368.437495" x="685"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 7</text>
+  <text stroke="#000" transform="matrix(0.7446371555386645,0,0,0.7004599746900311,157.05848471617847,107.2548065316271) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_25" y="261.052167" x="658.840014"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Stats Collector</text>
+  <rect id="svg_26" height="91" width="88" y="89.4375" x="2"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#FFA9A2"/>
+  <rect id="svg_27" height="91" width="88" y="107.4375" x="24"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#CE7975"/>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_28" y="166.4375" x="52"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">RX</text>
+  <text stroke="#000" transform="matrix(0.6111111044883728,0,0,0.6666666865348816,14.972222477197647,39.14583100005984) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_30" y="96.937501" x="-11.409091"
+   stroke-opacity="null" stroke-width="0" fill="#000000">NIC 1</text>
+  <text stroke="#000" transform="matrix(0.6111111044883728,0,0,0.6666666865348816,14.972222477197647,39.14583100005984) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_33" y="128.4375" x="27.863636"
+   stroke-opacity="null" stroke-width="0" fill="#000000">NIC 2</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_34" y="216.4375" x="26"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core0</text>
+  <rect id="svg_35" height="91" width="88" y="55.4375" x="1303"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#FFA9A2"/>
+  <rect id="svg_36" height="91" width="88" y="73.4375" x="1325"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#CE7975"/>
+  <text style="cursor: move;" xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_37" y="132.4375" x="1352"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">TX</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_40" y="184.4375" x="1327"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core1</text>
+  <text stroke="#000" transform="matrix(0.6111111044883728,0,0,0.6296296119689941,200.86111453175545,24.236112266778946) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_43" y="74.319853" x="1811.681832"
+   stroke-opacity="null" stroke-width="0" fill="#000000">NIC 1</text>
+  <text stroke="#000" transform="matrix(0.6958672408102909,0,0,0.6184720487972513,537.7539486343405,-28.040291137315034) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_44" y="191.620936" x="1140.58332"
+   stroke-opacity="null" stroke-width="0" fill="#000000">NIC 2</text>
+  <rect stroke="#000" id="svg_45" height="62" width="83.000003" y="101.4375" x="1096"
+   stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_46" y="135.4375" x="1115"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">QoS</text>
+  <rect stroke="#000" id="svg_48" height="61" width="107" y="110.4375" x="649"
+   stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_49" y="145.4375" x="661"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#ffffff">Crypto</text>
+  <rect stroke="#000" id="svg_50" height="70.999998" width="84.000002" y="65.4375" x="422"
+   stroke-opacity="null" stroke-width="0" fill="#FFE7A2"/>
+  <rect stroke="#000" id="svg_51" height="74.000003" width="90.000002" y="92.4375" x="444"
+   stroke-opacity="null" stroke-width="0" fill="#FFB27C"/>
+  <rect stroke="#000" id="svg_52" height="71.999998" width="92" y="120.4375" x="468"
+   stroke-opacity="null" stroke-width="0" fill="#C48157"/>
+  <text stroke="#000" transform="matrix(0.6528342962265015,0,0,0.5925925970077515,63.70490664243698,168.43749817460775) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_53" y="-145.374996" x="553.425418"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Worker 1</text>
+  <text stroke="#000" transform="matrix(0.678871691226959,0,0,0.6666666865348816,166.69894686341286,-165.52084343507886) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_54" y="417.437503" x="420.257696" stroke-opacity="null" stroke-width="0" fill="#000000">Worker 2</text>
+  <text stroke="#000" transform="matrix(0.7483048439025879,0,0,0.7407407164573669,76.38947987556458,153.33566251024604) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_55" y="-19.012521" x="530.011964"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Worker 3</text>
+  <rect stroke="#000" id="svg_62" height="70.999998" width="84.000002" y="67.4375" x="865"
+   stroke-opacity="null" stroke-width="0" fill="#FFE7A2"/>
+  <rect stroke="#000" id="svg_63" height="74.000003" width="90.000002" y="94.4375" x="887"
+   stroke-opacity="null" stroke-width="0" fill="#FFB27C"/>
+  <rect stroke="#000" id="svg_64" height="71.999998" width="92" y="122.4375" x="911"
+   stroke-opacity="null" stroke-width="0" fill="#C48157"/>
+  <text stroke="#000" transform="matrix(0.6528342962265015,0,0,0.5925925970077515,63.70490664243698,168.43749817460775) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_65" y="-143.687496" x="1238.132093"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Worker 1</text>
+  <text stroke="#000" transform="matrix(0.678871691226959,0,0,0.6666666865348816,166.69894686341286,-165.52084343507886) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_66" y="420.437503" x="1072.811052"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Worker 2</text>
+  <text stroke="#000" transform="matrix(0.7483048439025879,0,0,0.7407407164573669,76.38947987556458,153.33566251024604) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_67" y="-16.312521" x="1122.016685"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Worker 3</text>
+  <path stroke="#000" id="svg_68" d="m653.747516,12.862181l19.36745,-10.781877l77.632553,0l0,53.999988l-97.000004,0l0,-43.218111z"
+   stroke-opacity="null" stroke-width="0" fill="#805064"/>
+  <text stroke="#000" transform="matrix(0.733815550804138,0,0,0.9629629850387573,306.63544338941574,-1.3912058547139168) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_69" y="33.322117" x="496.534253"
+   stroke-opacity="null" stroke-width="0" fill="#ffffff">Device</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_70" y="217.4375" x="457"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 2,3,4</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_71" y="197.4375" x="653"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 5</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_72" y="186.4375" x="1097"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 6</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_73" y="220.4375" x="885"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 2,3,4</text>
+  <rect stroke="#000" id="svg_74" height="88.000002" width="110.999999" y="104" x="206.000001"
+   stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <text stroke="#000" transform="matrix(0.5661651903991256,0,0,1,107.56695064249905,0) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_75" y="133" x="182.901935"
+   stroke-opacity="null" stroke-width="0" fill="#000000">PKT classify</text>
+  <text stroke="#000" transform="matrix(0.5444634556770325,0,0,1,115.93405053019524,0) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_76" y="170" x="196.644877"
+   stroke-opacity="null" stroke-width="0" fill="#000000">Distribute</text>
+  <path id="svg_77" d="m189.755816,142.38346l-9.615746,-5.572568l0,6.200627l-17.256831,0c-3.021555,0.226504 -8.238368,-3.212549 -14.038725,-7.775916c-5.840892,-4.328677 -12.516173,-9.639678 -21.454022,-9.781769l-6.013302,0l0,9.884674l6.013302,0c4.377316,-0.12767 9.774825,3.325816 15.521285,7.782201c2.14196,1.556776 4.3024,3.274261 6.59165,4.824928c-2.28925,1.552703 -4.447123,3.272244 -6.59165,4.829053c-5.746457,4.44398 -11.143969,7.905694 -15.51563,7.780055l-6.018955,0l0,9.899092l6.015865,0c8.91886,-0.125542 15.596722,-5.450935 21.456596,-9.773453c5.800879,-4.563453 11.01514,-8.004512 14.039247,-7.782119l17.251176,0l0,6.200569l9.615746,-5.566299l9.621368,-5.570396l-9.621368,-5.578676l-0.000005,-0.000003z"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#619E73"/>
+  <path id="svg_78" d="m417.79301,181.072084l13.604178,-5.205736l-13.604178,-5.203742l-13.60709,-5.201786l0,5.786911c-3.569394,-0.003899 -9.48466,-0.003899 -11.161519,-0.003899c-4.954616,-0.078306 -8.206513,-1.105708 -11.590595,-2.945338c-5.043959,-2.745716 -9.348773,-7.687237 -14.54043,-12.448672c-2.640478,-2.367977 -5.58224,-4.716439 -9.50016,-6.604946c-3.878767,-1.896386 -8.946375,-3.211512 -14.579566,-3.186066l-24.41645,0l0,9.245023l24.41645,0c3.395131,0.041097 5.543836,0.774963 8.474533,2.595032c4.335842,2.706583 8.563147,7.88095 14.393505,12.783335c5.71366,4.855376 14.505736,9.757754 27.25778,9.804723l11.246452,0l0,5.786895l13.60709,-5.201732zm-57.554046,-35.013272c0.15434,0.072423 0.317546,0.135019 0.468152,0.209421c4.65338,2.242732 8.013781,4.994346 10.673477,7.387791c0.611391,0.559679 1.153382,1.097877 1.733756,1.647811l31.071571,0l0,5.788888l13.60709,-5.201813l13.604178,-5.203713l-13.604178,-5.205701l-13.60709,-5.207671l0,5.784986l-43.946955,0z"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#619E73"/>
+  <path stroke="#000" transform="rotate(89.46277618408203 605.7476806640625,144.42587280273435) " id="svg_79" d="m590.864808,144.339395l14.882874,-35.951591l14.882874,35.951591l-7.441438,0l0,36.124583l-14.882873,0l0,-36.124583l-7.441438,0z" stroke-opacity="null" stroke-width="0" fill="#619E73"/>
+  <path stroke="#000" transform="rotate(89.74066925048828 697.6382446289062,81.67762756347659) " id="svg_80" d="m661.638136,81.677665l20.874103,-13.000079l0,6.500022l30.252035,0l0,-6.500022l20.874093,13.000079l-20.874093,13.000009l0,-6.500005l-30.252035,0l0,6.500005l-20.874103,-13.000009z" fill-opacity="null"
+   stroke-opacity="null" stroke-width="0" fill="#619E73"/>
+  <path id="svg_81" d="m858.79301,172.072084l13.604178,-5.205736l-13.604178,-5.203742l-13.60709,-5.201786l0,5.786911c-3.569394,-0.0039 -9.48466,-0.0039 -11.161519,-0.0039c-4.954616,-0.078305 -8.206513,-1.105708 -11.590595,-2.945338c-5.043959,-2.745715 -9.348773,-7.687236 -14.54043,-12.448672c-2.640477,-2.367977 -5.58224,-4.716438 -9.50016,-6.604945c-3.878767,-1.896387 -8.946375,-3.211513 -14.579566,-3.186067l-24.416451,0l0,9.245023l24.416451,0c3.395131,0.041097 5.543836,0.774963 8.474533,2.595032c4.335842,2.706583 8.563147,7.88095 14.393505,12.783335c5.713661,4.855376 14.505736,9.757754 27.257781,9.804723l11.246451,0l0,5.786894l13.60709,-5.201732zm-57.554045,-35.013272c0.15434,0.072424 0.317546,0.135019 0.468152,0.209421c4.65338,2.242731 8.013781,4.994346 10.673477,7.38779c0.61139,0.559679 1.153381,1.097878 1.733756,1.647812l31.07157,0l0,5.788888l13.60709,-5.201812l13.604178,-5.203713l-13.604178,-5.205701l-13.60709,-5.207671l0,5.784986l-43.946955,0z"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#619E73"/>
+  <path id="svg_82" d="m1080.755816,127.38346l-9.615746,-5.572567l0,6.200627l-17.256831,0c-3.021555,0.226504 -8.238368,-3.212549 -14.038725,-7.775916c-5.840892,-4.328677 -12.516173,-9.639678 -21.454022,-9.78177l-6.013302,0l0,9.884674l6.013302,0c4.377316,-0.12767 9.774825,3.325816 15.521285,7.782201c2.141959,1.556776 4.3024,3.274261 6.59165,4.824928c-2.28925,1.552704 -4.447123,3.272244 -6.59165,4.829053c-5.746457,4.443981 -11.143969,7.905694 -15.51563,7.780055l-6.018955,0l0,9.899093l6.015865,0c8.91886,-0.125543 15.596723,-5.450935 21.456596,-9.773454c5.800879,-4.563453 11.01514,-8.004512 14.039246,-7.782119l17.251177,0l0,6.20057l9.615746,-5.566299l9.621368,-5.570397l-9.621368,-5.578676l-0.000006,-0.000003z"
+   stroke-opacity="null" stroke-width="0" stroke="#000" fill="#619E73"/>
+  <path stroke="#000" id="svg_83" d="m1269.963506,163.318859l13.567973,-4.653717l13.56088,-4.655631l-13.568064,-4.658919l-13.560793,-4.655342l0,5.177292c-3.323905,0 -7.186364,0 -8.480362,0c-6.169502,0.103377 -13.784287,-2.785121 -21.885448,-6.508723c-3.019981,-1.3056 -6.066761,-2.741979 -9.295919,-4.03897c3.229159,-1.298581 6.271574,-2.733309 9.295919,-4.038867c8.101162,-3.718456 15.715942,-6.612144 21.877492,-6.506938l8.488314,-0.001741l0,5.18423l13.560793,-4.6572l13.568064,-4.660782l-13.568064,-4.665774l-13.560793,-4.658938l0,5.180918l-8.483954,0c-12.6011,0.104929 -22.018599,4.557333 -30.259422,8.175926c-8.180795,3.81841 -15.53428,6.693008 -19.799052,6.506997l-24.328718,0l0,8.27074l24.336702,0c4.261113,-0.187837 11.618288,2.688631 19.798299,6.506933c8.237215,3.620425 17.651098,8.069132 30.25579,8.175987l8.480362,0l0,5.182516l0,0l0,0.000002z" fill-opacity="null"
+  stroke-opacity="null" stroke-width="0" fill="#619E73"/>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/dtg_service.svg b/doc/guides/howto/img/dtg_service.svg
new file mode 100644
index 000000000..2d876a3a1
--- /dev/null
+++ b/doc/guides/howto/img/dtg_service.svg
@@ -0,0 +1,15 @@
+<svg width="254" height="145" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <title>service</title>
+  <rect fill="#fff" id="canvas_background" height="147" width="256" y="-1" x="-1"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <rect stroke="#000" id="svg_1" height="109.999987" width="254.000014" y="0" x="0" stroke-opacity="null" stroke-width="0" fill="#9ACEE6"/>
+  <rect stroke="#000" id="svg_14" height="37.000001" width="225" y="7.437494" x="4.5" stroke-opacity="null" stroke-width="0" fill="#FFB27C"/>
+  <rect stroke="#000" id="svg_16" height="45.000002" width="186.000003" y="58.437493" x="33.5" stroke-opacity="null" stroke-width="0" fill="#FFE7A2"/>
+  <text stroke="#000" transform="matrix(1.0013854504218995,0,0,1.0926463039877063,73.76856116958965,-122.08861649089796) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_18" y="193.234194" x="-35.792216" stroke-opacity="null" stroke-width="0" fill="#000000">Health Check</text>
+  <text xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_23" y="138.437495" x="45.5" stroke-opacity="null" stroke-width="0" stroke="#000" fill="#000000">core 6</text>
+  <text stroke="#000" transform="matrix(1.0013854504218995,0,0,1.0926463039877063,73.76856116958965,-122.08861649089796) " xml:space="preserve" text-anchor="start" font-family="'Courier New', Courier, monospace" font-size="24" id="svg_25" y="141.982476" x="-63.753477" stroke-opacity="null" stroke-width="0" fill="#000000">Stats Collector</text>
+ </g>
+</svg>
diff --git a/doc/guides/howto/index.rst b/doc/guides/howto/index.rst
index ca4905e29..9527fa84d 100644
--- a/doc/guides/howto/index.rst
+++ b/doc/guides/howto/index.rst
@@ -18,4 +18,4 @@ HowTo Guides
     virtio_user_as_exceptional_path
     packet_capture_framework
     telemetry
-    debug_troubleshoot_guide.rst
+    debug_troubleshoot_guide
-- 
2.17.1



More information about the dev mailing list