summaryrefslogtreecommitdiffstats
path: root/nfvbench/traffic_gen
diff options
context:
space:
mode:
Diffstat (limited to 'nfvbench/traffic_gen')
-rw-r--r--nfvbench/traffic_gen/traffic_base.py30
-rw-r--r--nfvbench/traffic_gen/trex_gen.py4
2 files changed, 22 insertions, 12 deletions
diff --git a/nfvbench/traffic_gen/traffic_base.py b/nfvbench/traffic_gen/traffic_base.py
index df28772..30aec6e 100644
--- a/nfvbench/traffic_gen/traffic_base.py
+++ b/nfvbench/traffic_gen/traffic_base.py
@@ -15,10 +15,10 @@
import abc
import sys
-import bitmath
-
from nfvbench.log import LOG
from . import traffic_utils
+from hdrh.histogram import HdrHistogram
+from functools import reduce
class Latency(object):
@@ -34,11 +34,23 @@ class Latency(object):
self.avg_usec = 0
self.hdrh = None
if latency_list:
+ hdrh_list = []
for lat in latency_list:
if lat.available():
self.min_usec = min(self.min_usec, lat.min_usec)
self.max_usec = max(self.max_usec, lat.max_usec)
self.avg_usec += lat.avg_usec
+ if lat.hdrh_available():
+ hdrh_list.append(HdrHistogram.decode(lat.hdrh))
+
+ # aggregate histograms if any
+ if hdrh_list:
+ def add_hdrh(x, y):
+ x.add(y)
+ return x
+ decoded_hdrh = reduce(add_hdrh, hdrh_list)
+ self.hdrh = HdrHistogram.encode(decoded_hdrh).decode('utf-8')
+
# round to nearest usec
self.avg_usec = int(round(float(self.avg_usec) / len(latency_list)))
@@ -46,6 +58,9 @@ class Latency(object):
"""Return True if latency information is available."""
return self.min_usec != sys.maxsize
+ def hdrh_available(self):
+ """Return True if latency histogram information is available."""
+ return self.hdrh is not None
class TrafficGeneratorException(Exception):
"""Exception for traffic generator."""
@@ -133,15 +148,8 @@ class AbstractTrafficGenerator(object):
result = {}
- intf_speeds = self.get_port_speed_gbps()
- tg_if_speed = bitmath.parse_string(str(intf_speeds[0]) + 'Gb').bits
- intf_speed = tg_if_speed
-
- if hasattr(self.config, 'intf_speed') and self.config.intf_speed is not None:
- # in case of limitation due to config, TG speed is not accurate
- # value is overridden by conf
- if self.config.intf_speed != tg_if_speed:
- intf_speed = bitmath.parse_string(self.config.intf_speed.replace('ps', '')).bits
+ # actual interface speed? (may be a virtual override)
+ intf_speed = self.config.intf_speed_used
if hasattr(self.config, 'user_info') and self.config.user_info is not None:
if "extra_encapsulation_bytes" in self.config.user_info:
diff --git a/nfvbench/traffic_gen/trex_gen.py b/nfvbench/traffic_gen/trex_gen.py
index 21e79ae..d5625eb 100644
--- a/nfvbench/traffic_gen/trex_gen.py
+++ b/nfvbench/traffic_gen/trex_gen.py
@@ -168,6 +168,8 @@ class TRex(AbstractTrafficGenerator):
result["latency"] = in_stats["latency"]
# Merge HDRHistogram to have an overall value for all chains and ports
+ # (provided that the histogram exists in the stats returned by T-Rex)
+ # Of course, empty histograms will produce an empty (invalid) histogram.
try:
hdrh_list = []
if ifstats:
@@ -186,7 +188,7 @@ class TRex(AbstractTrafficGenerator):
x.add(y)
return x
decoded_hdrh = reduce(add_hdrh, hdrh_list)
- result["hdrh"] = HdrHistogram.encode(decoded_hdrh).decode('utf-8')
+ result["overall_hdrh"] = HdrHistogram.encode(decoded_hdrh).decode('utf-8')
except KeyError:
pass