diff --git a/execution/run_loop.sh b/execution/run_loop.sh index b139ad6ff3e1950baa3d7f4579f574f7231ecb5f..314599d391719788b8b8320cfdfce1d59e1a08b8 100755 --- a/execution/run_loop.sh +++ b/execution/run_loop.sh @@ -1,41 +1,25 @@ -#!/bin/bash +#!/usr/bin/env python -UC=$1 -IFS=', ' read -r -a DIM_VALUES <<< "$2" -IFS=', ' read -r -a REPLICAS <<< "$3" -PARTITIONS=${4:-40} -CPU_LIMIT=${5:-1000m} -MEMORY_LIMIT=${6:-4Gi} -KAFKA_STREAMS_COMMIT_INTERVAL_MS=${7:-100} -EXECUTION_MINUTES=${8:-5} +import sys +import os +from strategies.config import ExperimentConfig +import strategies.strategies.default_strategy as default_strategy +from strategies.experiment_execution import ExperimentExecutor +import strategies.subexperiment_execution.subexperiment_executor as subexperiment_executor -# Get and increment counter -EXP_ID=$(cat exp_counter.txt 2>/dev/null || echo "0") -echo $((EXP_ID+1)) > exp_counter.txt +uc=sys.argv[1] +dim_values=sys.argv[2].split(',') +replicas=sys.argv[3].split(',') +partitions=sys.argv[4] if len(sys.argv) >= 5 and sys.argv[4] else 40 +cpu_limit=sys.argv[5] if len(sys.argv) >= 6 and sys.argv[5] else "1000m" +memory_limit=sys.argv[6] if len(sys.argv) >= 7 and sys.argv[6] else "4Gi" +kafka_streams_commit_interval_ms=sys.argv[7] if len(sys.argv) >= 8 and sys.argv[7] else 100 +execution_minutes=sys.argv[8] if len(sys.argv) >= 9 and sys.argv[8] else 5 +benchmark_strategy=sys.argv[9] if len(sys.argv) >= 10 and sys.argv[9] else "default" -# Store meta information -IFS=$', '; echo \ -"UC=$UC -DIM_VALUES=${DIM_VALUES[*]} -REPLICAS=${REPLICAS[*]} -PARTITIONS=$PARTITIONS -CPU_LIMIT=$CPU_LIMIT -MEMORY_LIMIT=$MEMORY_LIMIT -KAFKA_STREAMS_COMMIT_INTERVAL_MS=$KAFKA_STREAMS_COMMIT_INTERVAL_MS -EXECUTION_MINUTES=$EXECUTION_MINUTES -" >> "exp${EXP_ID}_uc${UC}_meta.txt" +print("Chosen benchmarking strategy: "+benchmark_strategy) +print("Going to execute " + str(len(dim_values)*len(replicas)) + " subexperiments in total..") -SUBEXPERIMENTS=$((${#DIM_VALUES[@]} * ${#REPLICAS[@]})) -SUBEXPERIMENT_COUNTER=0 - -echo "Going to execute $SUBEXPERIMENTS subexperiments in total..." -for DIM_VALUE in "${DIM_VALUES[@]}" -do - for REPLICA in "${REPLICAS[@]}" - do - SUBEXPERIMENT_COUNTER=$((SUBEXPERIMENT_COUNTER+1)) - echo "Run subexperiment $SUBEXPERIMENT_COUNTER/$SUBEXPERIMENTS with config: $DIM_VALUE $REPLICA" - ./run_uc$UC-new.sh $EXP_ID $DIM_VALUE $REPLICA $PARTITIONS $CPU_LIMIT $MEMORY_LIMIT $KAFKA_STREAMS_COMMIT_INTERVAL_MS $EXECUTION_MINUTES - sleep 10s - done -done +experiment_config = ExperimentConfig(uc, dim_values, replicas, partitions, cpu_limit, memory_limit, kafka_streams_commit_interval_ms, execution_minutes, default_strategy, subexperiment_executor) +executor = ExperimentExecutor(experiment_config) +executor.execute() \ No newline at end of file diff --git a/execution/strategies/.gitignore b/execution/strategies/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..7e99e367f8443d86e5e8825b9fda39dfbb39630d --- /dev/null +++ b/execution/strategies/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file diff --git a/execution/strategies/__init__.py b/execution/strategies/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/execution/strategies/config.py b/execution/strategies/config.py new file mode 100644 index 0000000000000000000000000000000000000000..65daf712ed3e8f8c6978be238e0634c38ea20e4d --- /dev/null +++ b/execution/strategies/config.py @@ -0,0 +1,13 @@ +class ExperimentConfig: + """ Wrapper for the configuration of an experiment. """ + def __init__(self, use_case, dim_values, replicas, partitions, cpu_limit, memory_limit, kafka_streams_commit_interval_ms, execution_minutes, benchmarking_strategy, subexperiment_executor): + self.use_case=use_case + self.dim_values=dim_values + self.replicas=replicas + self.partitions=partitions + self.cpu_limit=cpu_limit + self.memory_limit=memory_limit + self.kafka_streams_commit_interval_ms=kafka_streams_commit_interval_ms + self.execution_minutes=execution_minutes + self.benchmarking_strategy=benchmarking_strategy + self.subexperiment_executor=subexperiment_executor \ No newline at end of file diff --git a/execution/strategies/experiment_execution.py b/execution/strategies/experiment_execution.py new file mode 100644 index 0000000000000000000000000000000000000000..7de16e941f750725fb181dc41d8eb6df6109e746 --- /dev/null +++ b/execution/strategies/experiment_execution.py @@ -0,0 +1,6 @@ +class ExperimentExecutor: + def __init__(self, config): + self.config=config + + def execute(self): + self.config.benchmarking_strategy.execute(self.config) diff --git a/execution/strategies/strategies/__init__.py b/execution/strategies/strategies/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/execution/strategies/strategies/config.py b/execution/strategies/strategies/config.py new file mode 100644 index 0000000000000000000000000000000000000000..3578562123d3411cd949ab4a796d4a78afcc912e --- /dev/null +++ b/execution/strategies/strategies/config.py @@ -0,0 +1,13 @@ +class SubexperimentConfig: + """ Wrapper for the configuration of a subexperiment """ + def __init__(self, use_case, counter, dim_value, replicas, partitions, cpu_limit, memory_limit, kafka_streams_commit_interval_ms, execution_minutes, subexperiment_executor): + self.use_case=use_case + self.counter=counter + self.dim_value=dim_value + self.replicas=replicas + self.partitions=partitions + self.cpu_limit=cpu_limit + self.memory_limit=memory_limit + self.kafka_streams_commit_interval_ms=kafka_streams_commit_interval_ms + self.execution_minutes=execution_minutes + self.subexperiment_executor=subexperiment_executor \ No newline at end of file diff --git a/execution/strategies/strategies/default_strategy.py b/execution/strategies/strategies/default_strategy.py new file mode 100644 index 0000000000000000000000000000000000000000..28e509a8999d8b398e394878a49cc33a047b48e6 --- /dev/null +++ b/execution/strategies/strategies/default_strategy.py @@ -0,0 +1,16 @@ +# Contains the default strategy that executes a subexperiment for all combinations of instances and dimension values. + +import os +from config import SubexperimentConfig + +def execute(config): + subexperiment_counter=0 + subexperiments_total=len(config.dim_values)*len(config.replicas) + for dim_value in config.dim_values: + for replica in config.replicas: + subexperiment_counter+=1 + print("Run subexperiment " + str(subexperiment_counter) + "/" + str(subexperiments_total) + " with config " + str(dim_value) + " " + str(replica)) + + subexperiment_config = SubexperimentConfig(config.use_case, subexperiment_counter, dim_value, replica, config.partitions, config.cpu_limit, config.memory_limit, config.kafka_streams_commit_interval_ms, config.execution_minutes, config.subexperiment_executor) + + config.subexperiment_executor.execute(subexperiment_config) diff --git a/execution/strategies/subexperiment_execution/__init__.py b/execution/strategies/subexperiment_execution/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/execution/strategies/subexperiment_execution/subexperiment_executor.py b/execution/strategies/subexperiment_execution/subexperiment_executor.py new file mode 100644 index 0000000000000000000000000000000000000000..1f7519507106c42cf37b8d40c29165cf972b3c29 --- /dev/null +++ b/execution/strategies/subexperiment_execution/subexperiment_executor.py @@ -0,0 +1,8 @@ +# Wrapper that makes the execution method of a subexperiment interchangable. + +import os + +dirname = os.path.dirname(__file__) +os.chdir(dirname+"/../../") +def execute(subexperiment_config): + os.system("./run_uc"+subexperiment_config.use_case+"-new.sh "+str(subexperiment_config.counter)+" "+str(subexperiment_config.dim_value)+" "+str(subexperiment_config.replicas)+" "+str(subexperiment_config.partitions)+" "+subexperiment_config.cpu_limit+" "+subexperiment_config.memory_limit+" "+str(subexperiment_config.kafka_streams_commit_interval_ms)+" "+str(subexperiment_config.execution_minutes))