IperfFlowMeasurement can measure multiple Flows at the same time and will
produce multiple FlowMeasurementResults.
To be able to report and evaluate sum of the flows a new method
aggregate_multi_flow_results is added to support these actions.
The method creates a new AggregatedFlowMeasurementResults object
that will collect iteration data results of each Flow and
transform the data into additional ParallelPerfResult layer.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
.../Perf/Measurements/BaseFlowMeasurement.py | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
index e2e86ab2..8dc36fd1 100644
--- a/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
@@ -313,3 +313,49 @@ class BaseFlowMeasurement(BaseMeasurement):
return (result.std_deviation/result.average) * 100
except ZeroDivisionError:
return float('inf') if result.std_deviation >= 0 else
float("-inf")
+
+ @staticmethod
+ def aggregate_multi_flow_results(results):
+ if len(results) == 1:
+ return results
+
+ sample_result = results[0]
+ sample_flow = sample_result.flow
+ dummy_flow = Flow(
+ type=sample_flow.type,
+ generator=sample_flow.generator,
+ generator_bind=sample_flow.generator_bind,
+ generator_nic=sample_flow.generator_nic,
+ receiver=sample_flow.receiver,
+ receiver_bind=sample_flow.receiver_bind,
+ receiver_nic=sample_flow.receiver_nic,
+ receiver_port=None,
+ msg_size=sample_flow.msg_size,
+ duration=sample_flow.duration,
+ parallel_streams=sample_flow.parallel_streams,
+ cpupin=None
+ )
+
+ aggregated_result = AggregatedFlowMeasurementResults(
+ sample_result.measurement, dummy_flow)
+
+ nr_iterations = len(sample_result.individual_results)
+ for i in range(nr_iterations):
+ parallel_result = FlowMeasurementResults(
+ measurement=sample_result.measurement,
+ flow=dummy_flow)
+ parallel_result.generator_results = ParallelPerfResult()
+ parallel_result.generator_cpu_stats = ParallelPerfResult()
+ parallel_result.receiver_results = ParallelPerfResult()
+ parallel_result.receiver_cpu_stats = ParallelPerfResult()
+
+ for result in results:
+ flow_result = result.individual_results[i]
+ parallel_result.generator_results.append(flow_result.generator_results)
+ parallel_result.receiver_results.append(flow_result.receiver_results)
+
parallel_result.generator_cpu_stats.append(flow_result.generator_cpu_stats)
+
parallel_result.receiver_cpu_stats.append(flow_result.receiver_cpu_stats)
+
+ aggregated_result.add_results(parallel_result)
+
+ return [aggregated_result]
--
2.26.2