diff options
author | Tibor Frank <tifrank@cisco.com> | 2020-02-07 14:07:07 +0100 |
---|---|---|
committer | Tibor Frank <tifrank@cisco.com> | 2020-02-10 11:50:49 +0100 |
commit | c1335b81c08aeeb5d45af39d45ce02dc1a7d4235 (patch) | |
tree | 04c014b69fed9defb1362abb2556c074255da676 /resources | |
parent | 8605f3f406468f57bb9b2eac12a4421f65965300 (diff) |
PAL: Latency by percentile
Change-Id: I413271f4b1fad801463fb7f8f16112aedc0d058b
Signed-off-by: Tibor Frank <tifrank@cisco.com>
Diffstat (limited to 'resources')
-rw-r--r-- | resources/tools/presentation/generator_plots.py | 123 | ||||
-rw-r--r-- | resources/tools/presentation/specification.yaml | 75 | ||||
-rw-r--r-- | resources/tools/presentation/specification_parser.py | 7 |
3 files changed, 115 insertions, 90 deletions
diff --git a/resources/tools/presentation/generator_plots.py b/resources/tools/presentation/generator_plots.py index 729c2cc72c..285e7ab51d 100644 --- a/resources/tools/presentation/generator_plots.py +++ b/resources/tools/presentation/generator_plots.py @@ -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)}") diff --git a/resources/tools/presentation/specification.yaml b/resources/tools/presentation/specification.yaml index 7f4b1c135f..f58c4b9989 100644 --- a/resources/tools/presentation/specification.yaml +++ b/resources/tools/presentation/specification.yaml @@ -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" @@ -26863,35 +26866,51 @@ ################################################################################ - 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" diff --git a/resources/tools/presentation/specification_parser.py b/resources/tools/presentation/specification_parser.py index ef2fafccae..2360b78f2d 100644 --- a/resources/tools/presentation/specification_parser.py +++ b/resources/tools/presentation/specification_parser.py @@ -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"] |