aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Mikus <pmikus@cisco.com>2018-02-28 10:13:12 +0100
committerPeter Mikus <pmikus@cisco.com>2018-03-05 05:52:24 +0000
commit4c75804c85ffa7ef236fff24ea8d159ca2dc73b7 (patch)
tree9784bcfc6ae78f6ddf150ddef1336f7660cc5af9
parenta4cdbf05722f6e880f465121a416828278195bd7 (diff)
Performance KW optimizations II
Currently Binary Search is using TRex warmup time for every lookup trial. This patch is suppose to optimize Binary Search to not use warmup time for each trial apart from first one. Change-Id: I9b914cfac3ce558557133c266335c1f550c0b52a Signed-off-by: Peter Mikus <pmikus@cisco.com>
-rw-r--r--resources/libraries/python/DropRateSearch.py36
-rw-r--r--resources/libraries/python/TrafficGenerator.py16
2 files changed, 29 insertions, 23 deletions
diff --git a/resources/libraries/python/DropRateSearch.py b/resources/libraries/python/DropRateSearch.py
index 354e7d493c..2de8e3c174 100644
--- a/resources/libraries/python/DropRateSearch.py
+++ b/resources/libraries/python/DropRateSearch.py
@@ -109,7 +109,7 @@ class DropRateSearch(object):
@abstractmethod
def measure_loss(self, rate, frame_size, loss_acceptance,
- loss_acceptance_type, traffic_type):
+ loss_acceptance_type, traffic_type, skip_warmup=False):
"""Send traffic from TG and measure count of dropped frames.
:param rate: Offered traffic load.
@@ -117,11 +117,13 @@ class DropRateSearch(object):
:param loss_acceptance: Permitted drop ratio or frames count.
:param loss_acceptance_type: Type of permitted loss.
:param traffic_type: Traffic profile ([2,3]-node-L[2,3], ...).
+ :param skip_warmup: Start TRex without warmup traffic if true.
:type rate: int
:type frame_size: str
:type loss_acceptance: float
:type loss_acceptance_type: LossAcceptanceType
:type traffic_type: str
+ :type traffic_type: bool
:returns: Drop threshold exceeded? (True/False)
:rtype bool
"""
@@ -415,12 +417,11 @@ class DropRateSearch(object):
if prev_rate is None:
self._search_result = SearchResults.FAILURE
self._search_result_rate = None
- return
# else we found the rate, which is value from previous run
else:
self._search_result = SearchResults.SUCCESS
self._search_result_rate = prev_rate
- return
+ return
# there was no loss / loss below acceptance criteria
elif res:
prev_rate = rate
@@ -480,17 +481,20 @@ class DropRateSearch(object):
SearchResults.SUSPICIOUS]:
return self._search_result_rate, self.get_latency()
- def binary_search(self, b_min, b_max, traffic_type, skip_max_rate=False):
+ def binary_search(self, b_min, b_max, traffic_type, skip_max_rate=False,
+ skip_warmup=False):
"""Binary search of rate with loss below acceptance criteria.
:param b_min: Min range rate.
:param b_max: Max range rate.
:param traffic_type: Traffic profile.
:param skip_max_rate: Start with max rate first
+ :param skip_warmup: Start TRex without warmup traffic if true.
:type b_min: float
:type b_max: float
:type traffic_type: str
:type skip_max_rate: bool
+ :type skip_warmup: bool
:returns: nothing
:raises: ValueError if input values are not valid
"""
@@ -502,22 +506,17 @@ class DropRateSearch(object):
if float(b_max) < float(b_min):
raise ValueError("Min rate is greater than max rate")
- # binary search
- if skip_max_rate:
- # rate is half of interval + start of interval
- rate = ((float(b_max) - float(b_min)) / 2) + float(b_min)
- else:
- # rate is max of interval
- rate = float(b_max)
+ # rate is half of interval + start of interval if not using max rate
+ rate = ((float(b_max) - float(b_min)) / 2) + float(b_min) \
+ if skip_max_rate else float(b_max)
+
# rate diff with previous run
rate_diff = abs(self._last_binary_rate - rate)
# convergence criterium
if float(rate_diff) < float(self._binary_convergence_threshold):
- if not self._search_result_rate:
- self._search_result = SearchResults.FAILURE
- else:
- self._search_result = SearchResults.SUCCESS
+ self._search_result = SearchResults.SUCCESS \
+ if self._search_result_rate else SearchResults.FAILURE
return
self._last_binary_rate = rate
@@ -527,17 +526,17 @@ class DropRateSearch(object):
res.append(self.measure_loss(rate, self._frame_size,
self._loss_acceptance,
self._loss_acceptance_type,
- traffic_type))
+ traffic_type, skip_warmup=skip_warmup))
res = self._get_res_based_on_search_type(res)
# loss occurred and it was above acceptance criteria
if not res:
- self.binary_search(b_min, rate, traffic_type, True)
+ self.binary_search(b_min, rate, traffic_type, True, True)
# there was no loss / loss below acceptance criteria
else:
self._search_result_rate = rate
- self.binary_search(rate, b_max, traffic_type, True)
+ self.binary_search(rate, b_max, traffic_type, True, True)
def combined_search(self, start_rate, traffic_type):
"""Combined search of rate with loss below acceptance criteria.
@@ -608,4 +607,3 @@ class DropRateSearch(object):
return abs(num_b - num_a) <= max(rel_tol * max(abs(num_a), abs(num_b)),
abs_tol)
-
diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py
index f363fe3f55..b7c8d6ef4e 100644
--- a/resources/libraries/python/TrafficGenerator.py
+++ b/resources/libraries/python/TrafficGenerator.py
@@ -33,7 +33,7 @@ class TGDropRateSearchImpl(DropRateSearch):
super(TGDropRateSearchImpl, self).__init__()
def measure_loss(self, rate, frame_size, loss_acceptance,
- loss_acceptance_type, traffic_type):
+ loss_acceptance_type, traffic_type, skip_warmup=False):
"""Runs the traffic and evaluate the measured results.
:param rate: Offered traffic load.
@@ -41,11 +41,13 @@ class TGDropRateSearchImpl(DropRateSearch):
:param loss_acceptance: Permitted drop ratio or frames count.
:param loss_acceptance_type: Type of permitted loss.
:param traffic_type: Traffic profile ([2,3]-node-L[2,3], ...).
+ :param skip_warmup: Start TRex without warmup traffic if true.
:type rate: int
:type frame_size: str
:type loss_acceptance: float
:type loss_acceptance_type: LossAcceptanceType
:type traffic_type: str
+ :type skip_warmup: bool
:returns: Drop threshold exceeded? (True/False)
:rtype: bool
:raises: NotImplementedError if TG is not supported.
@@ -60,9 +62,15 @@ class TGDropRateSearchImpl(DropRateSearch):
raise RuntimeError('TG subtype not defined')
elif tg_instance.node['subtype'] == NodeSubTypeTG.TREX:
unit_rate = str(rate) + self.get_rate_type_str()
- tg_instance.trex_stl_start_remote_exec(self.get_duration(),
- unit_rate, frame_size,
- traffic_type)
+ if skip_warmup:
+ tg_instance.trex_stl_start_remote_exec(self.get_duration(),
+ unit_rate, frame_size,
+ traffic_type,
+ warmup_time=0)
+ else:
+ tg_instance.trex_stl_start_remote_exec(self.get_duration(),
+ unit_rate, frame_size,
+ traffic_type)
loss = tg_instance.get_loss()
sent = tg_instance.get_sent()
if self.loss_acceptance_type_is_percentage():