PAL: Latency by percentile 64/24864/15
authorTibor Frank <tifrank@cisco.com>
Fri, 7 Feb 2020 13:07:07 +0000 (14:07 +0100)
committerTibor Frank <tifrank@cisco.com>
Mon, 10 Feb 2020 10:50:49 +0000 (11:50 +0100)
Change-Id: I413271f4b1fad801463fb7f8f16112aedc0d058b
Signed-off-by: Tibor Frank <tifrank@cisco.com>
docs/report/index.html.template
docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst [new file with mode: 0644]
docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst [new file with mode: 0644]
docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst [new file with mode: 0644]
docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst [new file with mode: 0644]
docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst [new file with mode: 0644]
docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst [new file with mode: 0644]
docs/report/vpp_performance_tests/index.rst
resources/tools/presentation/generator_plots.py
resources/tools/presentation/specification.yaml
resources/tools/presentation/specification_parser.py

index cbbde1e..9541fa0 100644 (file)
@@ -22,6 +22,7 @@ CSIT-2001
     vpp_performance_tests/packet_latency_graphs/index
     vpp_performance_tests/hdrh_packet_latency_graphs/index
     vpp_performance_tests/hdrh_packet_latency_percentile_graphs/index
+    vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index
     vpp_performance_tests/soak_tests/index
     vpp_performance_tests/reconf_tests/index
     vpp_performance_tests/nf_service_density/index
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_clx.rst
new file mode 100644 (file)
index 0000000..6667f95
--- /dev/null
@@ -0,0 +1,3 @@
+2n-clx
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/2n_skx.rst
new file mode 100644 (file)
index 0000000..61baf8f
--- /dev/null
@@ -0,0 +1,3 @@
+2n-skx
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_hsw.rst
new file mode 100644 (file)
index 0000000..53c253c
--- /dev/null
@@ -0,0 +1,3 @@
+3n-hsw
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_skx.rst
new file mode 100644 (file)
index 0000000..60840bb
--- /dev/null
@@ -0,0 +1,3 @@
+3n-skx
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/3n_tsh.rst
new file mode 100644 (file)
index 0000000..7fe4262
--- /dev/null
@@ -0,0 +1,3 @@
+3n-tsh
+======
+
diff --git a/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst b/docs/report/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs/index.rst
new file mode 100644 (file)
index 0000000..1ffc2d6
--- /dev/null
@@ -0,0 +1,33 @@
+
+.. raw:: latex
+
+    \clearpage
+
+.. _VPP_HDRH_Packet_Latency_by_Percentile:
+
+Latency by Percentile Distribution
+==================================
+
+Latency results are generated from a single execution of NDRPDR discovery
+test across physical testbeds hosted LF FD.io labs: 3n-hsw, 2n-skx, 3n-
+skx, 3n-tsh, 2n-clx.
+
+.. note::
+
+    Test results have been generated by
+    `FD.io test executor vpp performance job 2n-skx`_,
+    `FD.io test executor vpp performance job 3n-skx`_,
+    `FD.io test executor vpp performance job 2n-skx`_,
+    `FD.io test executor vpp performance job 3n-hsw`_ and
+    `FD.io test executor vpp performance job 3n-tsh`_ with RF
+    result files csit-vpp-perf-|srelease|-\*.zip
+    `archived here <../../_static/archive/>`_.
+
+.. toctree::
+    :maxdepth: 3
+
+    2n_skx
+    3n_skx
+    2n_clx
+    3n_hsw
+    3n_tsh
index 042ee4f..52a9b19 100644 (file)
@@ -10,6 +10,7 @@ VPP Performance
     packet_latency_graphs/index
     hdrh_packet_latency_graphs/index
     hdrh_packet_latency_percentile_graphs/index
+    hdrh_packet_latency_by_percentile_graphs/index
     soak_tests/index
     reconf_tests/index
     nf_service_density/index
index 729c2cc..285e7ab 100644 (file)
@@ -40,7 +40,7 @@ COLORS = [u"SkyBlue", u"Olive", u"Purple", u"Coral", u"Indigo", u"Pink",
           u"LightGreen", u"LightSeaGreen", u"LightSkyBlue", u"Maroon",
           u"MediumSeaGreen", u"SeaGreen", u"LightSlateGrey"]
 
-REGEX_NIC = re.compile(r'\d*ge\dp\d\D*\d*-')
+REGEX_NIC = re.compile(r'(\d*ge\dp\d\D*\d*)-')
 
 
 def generate_plots(spec, data):
@@ -199,9 +199,17 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
         f"    Creating the data set for the {plot.get(u'type', u'')} "
         f"{plot.get(u'title', u'')}."
     )
-    data = input_data.filter_tests_by_name(
-        plot, params=[u"latency", u"throughput", u"parent", u"tags", u"type"])
-    if data is None or len(data[0][0]) == 0:
+    if plot.get(u"include", None):
+        data = input_data.filter_tests_by_name(
+            plot,
+            params=[u"latency", u"throughput", u"parent", u"tags", u"type"]
+        )[0][0]
+    else:
+        job = list(plot[u"data"].keys())[0]
+        build = str(plot[u"data"][job][0])
+        data = input_data.tests(job, build)
+
+    if data is None or len(data) == 0:
         logging.error(u"No data.")
         return
 
@@ -209,64 +217,64 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
         u"LAT0",
         u"PDR10",
         u"PDR50",
-        u"PDR90",
-        u"NDR",
-        u"PDR"
+        u"PDR90"
     ]
 
-    for test in data[0][0]:
+    file_links = plot.get(u"output-file-links", None)
+    target_links = plot.get(u"target-links", None)
+
+    for test in data:
         try:
             if test[u"type"] not in (u"NDRPDR",):
                 logging.warning(f"Invalid test type: {test[u'type']}")
                 continue
             name = re.sub(REGEX_NIC, u"", test[u"parent"].
                           replace(u'-ndrpdr', u'').replace(u'2n1l-', u''))
+            try:
+                nic = re.search(REGEX_NIC, test[u"parent"]).group(1)
+            except IndexError:
+                nic = u""
+            name_link = f"{nic}-{test[u'name']}"
 
-            logging.info(f"    Generating the graph: {name}")
-
-            pdr = test[u"throughput"][u"PDR"][u"LOWER"]
-            ndr = test[u"throughput"][u"NDR"][u"LOWER"]
+            logging.info(f"    Generating the graph: {name_link}")
 
             desc = {
-                u"LAT0": u"No load",
-                u"PDR10": f"10% PDR background traffic ({(pdr*1e-7):.2f}Mpps)",
-                u"PDR50": f"50% PDR background traffic ({(pdr*5e-7):.2f}Mpps)",
-                u"PDR90": f"90% PDR background traffic ({(pdr*9e-7):.2f}Mpps)",
-                u"PDR": f"100% PDR background traffic ({(pdr*1e-6):.2f}Mpps)",
-                u"NDR10": f"10% NDR background traffic ({(ndr*1e-7):.2f}Mpps)",
-                u"NDR50": f"50% NDR background traffic ({(ndr*5e-7):.2f}Mpps)",
-                u"NDR90": f"90% NDR background traffic ({(ndr*9e-7):.2f}Mpps)",
-                u"NDR": f"100% NDR background traffic ({(ndr*1e-6):.2f}Mpps)"
+                u"LAT0": u"No-load.",
+                u"PDR10": u"Low-load, 10% PDR.",
+                u"PDR50": u"Mid-load, 50% PDR.",
+                u"PDR90": u"High-load, 90% PDR.",
+                u"PDR": u"Full-load, 100% PDR.",
+                u"NDR10": u"Low-load, 10% NDR.",
+                u"NDR50": u"Mid-load, 50% NDR.",
+                u"NDR90": u"High-load, 90% NDR.",
+                u"NDR": u"Full-load, 100% NDR."
             }
 
-            fig = make_subplots(
-                rows=1,
-                cols=2,
-                column_widths=[0.5, 0.5],
-                shared_xaxes=True,
-                subplot_titles=(
-                    u"<b>Direction: W-E</b>",
-                    u"<b>Direction: E-W</b>"
-                ),
-                specs=[[{"type": "scatter"}, {"type": "scatter"}], ]
-            )
+            fig = plgo.Figure()
             layout = deepcopy(plot[u"layout"])
 
             for color, graph in enumerate(graphs):
                 for idx, direction in enumerate((u"direction1", u"direction2")):
-                    xaxis = list()
-                    yaxis = list()
-                    hovertext = list()
+                    xaxis = [0.0, ]
+                    yaxis = [0.0, ]
+                    hovertext = [
+                        f"<b>{desc[graph]}</b><br>"
+                        f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
+                        f"Percentile: 0.0%<br>"
+                        f"Latency: 0.0uSec"
+                    ]
                     decoded = hdrh.histogram.HdrHistogram.decode(
                         test[u"latency"][graph][direction][u"hdrh"]
                     )
                     for item in decoded.get_recorded_iterator():
                         percentile = item.percentile_level_iterated_to
-                        xaxis.append((100.0 / (100.0 - percentile))
-                                     if percentile != 100.0 else 1e6)
+                        if percentile > 99.9:
+                            continue
+                        xaxis.append(percentile)
                         yaxis.append(item.value_iterated_to)
                         hovertext.append(
                             f"<b>{desc[graph]}</b><br>"
+                            f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
                             f"Percentile: {percentile:.5f}%<br>"
                             f"Latency: {item.value_iterated_to}uSec"
                         )
@@ -279,46 +287,37 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
                             legendgroup=desc[graph],
                             showlegend=bool(idx),
                             line=dict(
-                                color=COLORS[color]
+                                color=COLORS[color],
+                                dash=u"solid" if idx % 2 else u"dash"
                             ),
                             hovertext=hovertext,
                             hoverinfo=u"text"
-                        ),
-                        row=1,
-                        col=idx + 1,
-                    )
-                    fig.update_xaxes(
-                        row=1,
-                        col=idx + 1,
-                        **layout[u"xaxis"]
-                    )
-                    fig.update_yaxes(
-                        row=1,
-                        col=idx + 1,
-                        **layout[u"yaxis"]
+                        )
                     )
-            try:
-                del layout[u"xaxis"]
-            except KeyError:
-                pass
-            try:
-                del layout[u"yaxis"]
-            except KeyError:
-                pass
 
             layout[u"title"][u"text"] = f"<b>Latency:</b> {name}"
             fig.update_layout(layout)
 
             # Create plot
-            file_name = (f"{plot[u'output-file']}-"
-                         f"{name}"
-                         f"{plot.get(u'output-file-type', u'.html')}")
+            file_name = f"{plot[u'output-file']}-{name_link}.html"
             logging.info(f"    Writing file {file_name}")
 
             try:
                 # Export Plot
                 ploff.plot(fig, show_link=False, auto_open=False,
                            filename=file_name)
+                # Add link to the file:
+                if file_links and target_links:
+                    with open(file_links, u"a") as fw:
+                        fw.write(
+                            f"- `{name_link} "
+                            f"<{target_links}/{file_name.split(u'/')[-1]}>`_\n"
+                        )
+            except FileNotFoundError as err:
+                logging.error(
+                    f"Not possible to write the link to the file "
+                    f"{file_links}\n{err}"
+                )
             except PlotlyError as err:
                 logging.error(f"   Finished with error: {repr(err)}")
 
index 7f4b1c1..f58c4b9 100644 (file)
@@ -76,6 +76,9 @@
     DIR[DTO,PERF,VPP,3N,DNV]: "{DIR[DTO]}/vpp_performance_operational_data_3n_dnv"
     DIR[DTO,PERF,VPP,2N,DNV]: "{DIR[DTO]}/vpp_performance_operational_data_2n_dnv"
 
+    # Latencies:
+    DIR[LAT,VPP]: "{DIR[WORKING,SRC]}/vpp_performance_tests/hdrh_packet_latency_by_percentile_graphs"
+
     # .css patch file to fix tables generated by Sphinx
     DIR[CSS_PATCH_FILE]: "{DIR[STATIC]}/theme_overrides.css"
     DIR[CSS_PATCH_FILE2]: "{DIR[WORKING,SRC,STATIC]}/theme_overrides.css"
 ################################################################################
 
 - type: "plot"
-  title: "Latency by percentile: 2n-skx-xxv710"
+  title: "Latency by percentile: 2n-skx"
   algorithm: "plot_hdrh_lat_by_percentile"
-  output-file: "{DIR[STATIC,VPP]}/2n-skx-xxv710-hdrh-lat-percentile"
+  output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-2n-skx"
+  output-file-links: "{DIR[LAT,VPP]}/2n_skx.rst"
+  target-links: "../../_static/vpp"
   data: "plot-vpp-hdrh-lat-2n-skx"
-  include:
-    - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Dot1Q-Ip4Base-Ndrpdr.64B-2t1c-dot1q-ip4base-ndrpdr"
-    - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Base-Ndrpdr.64B-2t1c-ethip4-ip4base-ndrpdr"
-    - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Scale20K-Ndrpdr.64B-2t1c-ethip4-ip4scale20k-ndrpdr"
-    - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Scale200K-Ndrpdr.64B-2t1c-ethip4-ip4scale200k-ndrpdr"
-    - "Tests.Vpp.Perf.Ip4.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Scale2M-Ndrpdr.64B-2t1c-ethip4-ip4scale2m-ndrpdr"
-    - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Eth-L2Xcbase-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-eth-l2xcbase-eth-2memif-1dcr-ndrpdr"
-    - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Dot1Q-L2Bdbasemaclrn-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-dot1q-l2bdbasemaclrn-eth-2memif-1dcr-ndrpdr"
-    - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Eth-L2Bdbasemaclrn-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-eth-2memif-1dcr-ndrpdr"
-    - "Tests.Vpp.Perf.Container Memif.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Base-Eth-2Memif-1Dcr-Ndrpdr.64B-2t1c-ethip4-ip4base-eth-2memif-1dcr-ndrpdr"
-    - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Avf-Eth-L2Xcbase-Ndrpdr.64B-2t1c-avf-eth-l2xcbase-ndrpdr"
-    - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Avf-Dot1Q-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-avf-dot1q-l2bdbasemaclrn-ndrpdr"
-    - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Avf-Eth-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-avf-eth-l2bdbasemaclrn-ndrpdr"
-    - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Dot1Q-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-dot1q-l2bdbasemaclrn-ndrpdr"
-    - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Eth-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-ndrpdr"
-    - "Tests.Vpp.Perf.L2.2N1L-10Ge2P1X710-Eth-L2Bdscale1Mmaclrn-Ndrpdr.64B-2t1c-eth-l2bdscale1mmaclrn-ndrpdr"
-    - "Tests.Vpp.Perf.L2.25Ge2P1Xxv710-Eth-L2Bdbasemaclrn-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-ndrpdr"
-    - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Eth-L2Xcbase-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-eth-l2xcbase-eth-2vhostvr1024-1vm-ndrpdr"
-    - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Dot1Q-L2Bdbasemaclrn-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-dot1q-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdr"
-    - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Eth-L2Bdbasemaclrn-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-eth-l2bdbasemaclrn-eth-2vhostvr1024-1vm-ndrpdr"
-    - "Tests.Vpp.Perf.Vm Vhost.2N1L-25Ge2P1Xxv710-Ethip4-Ip4Base-Eth-2Vhostvr1024-1Vm-Ndrpdr.64B-2t1c-ethip4-ip4base-eth-2vhostvr1024-1vm-ndrpdr"
-    - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Dot1Q-Ip6Base-Ndrpdr.78B-2t1c-dot1q-ip6base-ndrpdr"
-    - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Base-Ndrpdr.78B-2t1c-ethip6-ip6base-ndrpdr"
-    - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Scale20K-Ndrpdr.78B-2t1c-ethip6-ip6scale20k-ndrpdr"
-    - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Scale200K-Ndrpdr.78B-2t1c-ethip6-ip6scale200k-ndrpdr"
-    - "Tests.Vpp.Perf.Ip6.2N1L-25Ge2P1Xxv710-Ethip6-Ip6Scale2M-Ndrpdr.78B-2t1c-ethip6-ip6scale2m-ndrpdr"
+  layout:
+    layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+  title: "Latency by percentile: 3n-skx"
+  algorithm: "plot_hdrh_lat_by_percentile"
+  output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-3n-skx"
+  output-file-links: "{DIR[LAT,VPP]}/3n_skx.rst"
+  target-links: "../../_static/vpp"
+  data: "plot-vpp-hdrh-lat-3n-skx"
+  layout:
+    layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+  title: "Latency by percentile: 2n-clx"
+  algorithm: "plot_hdrh_lat_by_percentile"
+  output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-2n-clx"
+  output-file-links: "{DIR[LAT,VPP]}/2n_clx.rst"
+  target-links: "../../_static/vpp"
+  data: "plot-vpp-hdrh-lat-2n-clx"
+  layout:
+    layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+  title: "Latency by percentile: 3n-hsw"
+  algorithm: "plot_hdrh_lat_by_percentile"
+  output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-3n-hsw"
+  output-file-links: "{DIR[LAT,VPP]}/3n_hsw.rst"
+  target-links: "../../_static/vpp"
+  data: "plot-vpp-hdrh-lat-3n-hsw"
+  layout:
+    layout: "plot-hdrh-latency-by-percentile"
+
+- type: "plot"
+  title: "Latency by percentile: 3n-tsh"
+  algorithm: "plot_hdrh_lat_by_percentile"
+  output-file: "{DIR[STATIC,VPP]}/hdrh-lat-percentile-3n-tsh"
+  output-file-links: "{DIR[LAT,VPP]}/3n_tsh.rst"
+  target-links: "../../_static/vpp"
+  data: "plot-vpp-hdrh-lat-3n-tsh"
   layout:
     layout: "plot-hdrh-latency-by-percentile"
index ef2fafc..2360b78 100644 (file)
@@ -756,6 +756,13 @@ class Specification:
             except KeyError:
                 pass
 
+            try:
+                element[u"output-file-links"] = self._replace_tags(
+                    element[u"output-file-links"],
+                    self._specification[u"environment"][u"paths"])
+            except KeyError:
+                pass
+
             # Add data sets to the elements:
             if isinstance(element.get(u"data", None), str):
                 data_set = element[u"data"]