summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--samples/lmbench.yaml20
-rw-r--r--samples/ping-serial.yaml11
-rw-r--r--samples/pktgen.yaml22
-rwxr-xr-xyardstick/benchmark/runners/arithmetic.py91
4 files changed, 97 insertions, 47 deletions
diff --git a/samples/lmbench.yaml b/samples/lmbench.yaml
index 2b8e99084..8baa81477 100644
--- a/samples/lmbench.yaml
+++ b/samples/lmbench.yaml
@@ -9,16 +9,18 @@ scenarios:
type: Lmbench
options:
test_type: "latency"
- stride: 64
stop_size: 32
host: demeter.demo
runner:
type: Arithmetic
- name: stride
- stop: 128
- step: 64
+ iterators:
+ -
+ name: stride
+ start: 64
+ stop: 128
+ step: 64
sla:
max_latency: 35
@@ -27,16 +29,18 @@ scenarios:
type: Lmbench
options:
test_type: "bandwidth"
- size: 500
benchmark: "wr"
host: demeter.demo
runner:
type: Arithmetic
- name: size
- stop: 2000
- step: 500
+ iterators:
+ -
+ name: size
+ start: 500
+ stop: 2000
+ step: 500
sla:
min_bandwidth: 10000
diff --git a/samples/ping-serial.yaml b/samples/ping-serial.yaml
index 37ea715a2..9c492e481 100644
--- a/samples/ping-serial.yaml
+++ b/samples/ping-serial.yaml
@@ -20,16 +20,17 @@ scenarios:
action: monitor
-
type: Ping
- options:
- packetsize: 100
host: apollo.demo
target: artemis.demo
runner:
type: Arithmetic
- name: packetsize
interval: 0.2
- stop: 6000
- step: 100
+ iterators:
+ -
+ name: packetsize
+ start: 100
+ stop: 6000
+ step: 100
context:
name: demo
diff --git a/samples/pktgen.yaml b/samples/pktgen.yaml
index 11d62795e..d621cb730 100644
--- a/samples/pktgen.yaml
+++ b/samples/pktgen.yaml
@@ -1,6 +1,8 @@
---
# Sample benchmark task config file
# measure network throughput using pktgen
+# with 2 stepping parameters. One stepping
+# in positive and the other in negative direction
schema: "yardstick:task:0.1"
@@ -8,8 +10,6 @@ scenarios:
-
type: Pktgen
options:
- packetsize: 60
- number_of_ports: 10
duration: 20
host: demeter.demo
@@ -17,10 +17,20 @@ scenarios:
runner:
type: Arithmetic
- name: number_of_ports
- # run twice with values 10 and 20
- stop: 20
- step: 10
+ interval: 2
+ iter_type: nested_for_loops
+ # run with packetsize/number_of_ports: 60,20; 60,10; ... 70,10
+ iterators:
+ -
+ name: packetsize
+ start: 60
+ stop: 70
+ step: 5
+ -
+ name: number_of_ports
+ start: 20
+ stop: 10
+ step: -10
sla:
max_ppm: 1000
diff --git a/yardstick/benchmark/runners/arithmetic.py b/yardstick/benchmark/runners/arithmetic.py
index 4eab6643e..b1446e01c 100755
--- a/yardstick/benchmark/runners/arithmetic.py
+++ b/yardstick/benchmark/runners/arithmetic.py
@@ -7,8 +7,12 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
-'''A runner that every run arithmetically steps a specified input value to
-the scenario. This just means a step value is added to the previous value.
+'''A runner that every run arithmetically steps specified input value(s) to
+the scenario. This just means step value(s) is added to the previous value(s).
+It is possible to combine several named input values and run with those either
+as nested for loops or combine each i:th index of each "input value list"
+until the end of the shortest list is reached (optimally all lists should be
+defined with the same number of values when using such iter_type).
'''
import os
@@ -16,6 +20,7 @@ import multiprocessing
import logging
import traceback
import time
+import itertools
from yardstick.benchmark.runners import base
@@ -30,16 +35,15 @@ def _worker_process(queue, cls, method_name, scenario_cfg,
runner_cfg = scenario_cfg['runner']
interval = runner_cfg.get("interval", 1)
- arg_name = runner_cfg.get('name')
- stop = runner_cfg.get('stop')
- step = runner_cfg.get('step')
- options = scenario_cfg['options']
- start = options.get(arg_name, 0)
+ if 'options' in scenario_cfg:
+ options = scenario_cfg['options']
+ else: # options must be instatiated if not present in yaml
+ options = {}
+ scenario_cfg['options'] = options
runner_cfg['runner_id'] = os.getpid()
- LOG.info("worker START, step(%s, %d, %d, %d), class %s",
- arg_name, start, stop, step, cls)
+ LOG.info("worker START, class %s", cls)
benchmark = cls(scenario_cfg, context_cfg)
benchmark.setup()
@@ -52,18 +56,39 @@ def _worker_process(queue, cls, method_name, scenario_cfg,
sla_action = None
if "sla" in scenario_cfg:
sla_action = scenario_cfg["sla"].get("action", "assert")
- margin = 1 if step > 0 else -1
- for value in range(start, stop+margin, step):
+ # To both be able to include the stop value and handle backwards stepping
+ margin = lambda start, stop: -1 if start > stop else 1
+
+ param_iters = \
+ [xrange(d['start'], d['stop'] + margin(d['start'], d['stop']),
+ d['step']) for d in runner_cfg['iterators']]
+ param_names = [d['name'] for d in runner_cfg['iterators']]
+
+ iter_type = runner_cfg.get("iter_type", "nested_for_loops")
+
+ if iter_type == 'nested_for_loops':
+ # Create a complete combination set of all parameter lists
+ loop_iter = itertools.product(*param_iters)
+ elif iter_type == 'tuple_loops':
+ # Combine each i;th index of respective parameter list
+ loop_iter = itertools.izip(*param_iters)
+ else:
+ LOG.warning("iter_type unrecognized: %s", iter_type)
+ raise
+
+ # Populate options and run the requested method for each value combination
+ for comb_values in loop_iter:
if aborted.is_set():
break
- options[arg_name] = value
-
LOG.debug("runner=%(runner)s seq=%(sequence)s START" %
{"runner": runner_cfg["runner_id"], "sequence": sequence})
+ for i, value in enumerate(comb_values):
+ options[param_names[i]] = value
+
data = {}
errors = ""
@@ -107,29 +132,39 @@ def _worker_process(queue, cls, method_name, scenario_cfg,
class ArithmeticRunner(base.Runner):
- '''Run a scenario arithmetically stepping an input value
+ '''Run a scenario arithmetically stepping input value(s)
Parameters
interval - time to wait between each scenario invocation
type: int
unit: seconds
default: 1 sec
- name - name of scenario option that will be increased for each invocation
+ iter_type: - Iteration type of input parameter(s): nested_for_loops
+ or tuple_loops
type: string
unit: na
- default: none
- start - value to use in first invocation of scenario
- type: int
- unit: na
- default: none
- step - value added to start value in next invocation of scenario
- type: int
- unit: na
- default: none
- stop - value indicating end of invocation
- type: int
- unit: na
- default: none
+ default: nested_for_loops
+ -
+ name - name of scenario option that will be increased for each invocation
+ type: string
+ unit: na
+ default: na
+ start - value to use in first invocation of scenario
+ type: int
+ unit: na
+ default: none
+ stop - value indicating end of invocation. Can be set to same
+ value as start for one single value.
+ type: int
+ unit: na
+ default: none
+ step - value added to start value in next invocation of scenario.
+ Must not be set to zero. Can be set negative if start > stop
+ type: int
+ unit: na
+ default: none
+ -
+ name - and so on......
'''
__execution_type__ = 'Arithmetic'