-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2021 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
REGEX_NIC = re.compile(r'(\d*ge\dp\d\D*\d*[a-z]*)-')
+# This value depends on latency stream rate (9001 pps) and duration (5s).
+PERCENTILE_MAX = 99.9995
+
def generate_plots(spec, data):
"""Generate all plots specified in the specification file.
u"plot_tsa_name": plot_tsa_name,
u"plot_http_server_perf_box": plot_http_server_perf_box,
u"plot_nf_heatmap": plot_nf_heatmap,
- u"plot_hdrh_lat_by_percentile": plot_hdrh_lat_by_percentile
+ u"plot_hdrh_lat_by_percentile": plot_hdrh_lat_by_percentile,
+ u"plot_hdrh_lat_by_percentile_x_log": plot_hdrh_lat_by_percentile_x_log
}
logging.info(u"Generating the plots ...")
for color, graph in enumerate(graphs):
for idx, direction in enumerate((u"direction1", u"direction2")):
- 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"
- ]
+ previous_x = 0.0
+ xaxis = list()
+ yaxis = list()
+ hovertext = list()
try:
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
- if percentile > 99.9:
- continue
+ xaxis.append(previous_x)
+ 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: {previous_x:.5f}-{percentile:.5f}%<br>"
+ f"Latency: {item.value_iterated_to}uSec"
+ )
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"Percentile: {previous_x:.5f}-{percentile:.5f}%<br>"
f"Latency: {item.value_iterated_to}uSec"
)
+ previous_x = percentile
fig.add_trace(
plgo.Scatter(
x=xaxis,
showlegend=bool(idx),
line=dict(
color=COLORS[color],
- dash=u"dash" if idx % 2 else u"solid"
+ dash=u"solid",
+ width=1 if idx % 2 else 2
),
hovertext=hovertext,
hoverinfo=u"text"
fig = plgo.Figure()
layout = deepcopy(plot[u"layout"])
- xaxis_max = 0
for color, graph in enumerate(graphs):
for idx, direction in enumerate((u"direction1", u"direction2")):
+ previous_x = 0.0
+ prev_perc = 0.0
xaxis = list()
yaxis = list()
hovertext = list()
continue
for item in decoded.get_recorded_iterator():
+ # The real value is "percentile".
+ # For 100%, we cut that down to "x_perc" to avoid
+ # infinity.
percentile = item.percentile_level_iterated_to
- if percentile > 99.9999999:
- continue
- xaxis.append(100.0 / (100.0 - percentile))
+ x_perc = min(percentile, PERCENTILE_MAX)
+ xaxis.append(previous_x)
+ 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: {prev_perc:.5f}-{percentile:.5f}%<br>"
+ f"Latency: {item.value_iterated_to}uSec"
+ )
+ next_x = 100.0 / (100.0 - x_perc)
+ xaxis.append(next_x)
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"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>"
f"Latency: {item.value_iterated_to}uSec"
)
+ previous_x = next_x
+ prev_perc = percentile
fig.add_trace(
plgo.Scatter(
x=xaxis,
showlegend=not(bool(idx)),
line=dict(
color=COLORS[color],
- dash=u"dash" if idx % 2 else u"solid"
+ dash=u"solid",
+ width=1 if idx % 2 else 2
),
hovertext=hovertext,
hoverinfo=u"text"
)
)
- xaxis_max = max(xaxis) if xaxis_max < max(
- xaxis) else xaxis_max
layout[u"title"][u"text"] = f"<b>Latency:</b> {name}"
- layout[u"xaxis"][u"range"] = [0, int(log(xaxis_max, 10)) + 1]
+ layout[u"xaxis"][u"range"] = [0, 5.302]
fig.update_layout(layout)
# Create plot
df_y = pd.DataFrame(y_vals)
df_y.head()
for i, col in enumerate(df_y.columns):
+
tst_name = re.sub(REGEX_NIC, u"",
- col.lower().replace(u'-ndrpdr', u'').
- replace(u'2n1l-', u''))
+ col.lower().replace(u'-reconf', u'').
+ replace(u'2n1l-', u'').replace(u'2n-', u'').
+ replace(u'-testpmd', u''))
traces.append(plgo.Box(
x=[str(i + 1) + u'.'] * len(df_y[col]),
- y=[y if y else None for y in df_y[col]],
+ y=df_y[col],
name=(
f"{i + 1}. "
f"({nr_of_samples[i]:02d} "
f"run{u's' if nr_of_samples[i] > 1 else u''}, "
f"packets lost average: {mean(loss[col]):.1f}) "
- f"{u'-'.join(tst_name.split(u'-')[3:-2])}"
+ f"{u'-'.join(tst_name.split(u'-')[2:])}"
),
hoverinfo=u"y+name"
))