From 324d7fa43f58a074292caca4f08e76a17ea94e75 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Fri, 11 Nov 2016 10:02:06 +0000 Subject: [PATCH 01/13] executor: Take a TestEnv instead of a target_conf --- libs/utils/executor.py | 8 ++------ libs/utils/test.py | 5 ++++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libs/utils/executor.py b/libs/utils/executor.py index 367cbfd19..1252d788d 100644 --- a/libs/utils/executor.py +++ b/libs/utils/executor.py @@ -34,9 +34,6 @@ logging.basicConfig( level=logging.INFO, datefmt='%I:%M:%S') -# Add support for Test Environment configuration -from env import TestEnv - # Add JSON parsing support from conf import JsonConf @@ -49,7 +46,7 @@ Experiment = namedtuple('Experiment', ['wload_name', 'wload', class Executor(): - def __init__(self, target_conf=None, tests_conf=None): + def __init__(self, test_env, tests_conf=None): """ Tests Executor @@ -101,8 +98,7 @@ class Executor(): raise ValueError( 'Configuration error: missing \'wloads\' definitions') - # Setup devlib to access the configured target - self.te = TestEnv(target_conf, tests_conf) + self.te = test_env self.target = self.te.target self._iterations = self._tests_conf.get('iterations', 1) diff --git a/libs/utils/test.py b/libs/utils/test.py index 3edbed6db..fc5e59450 100644 --- a/libs/utils/test.py +++ b/libs/utils/test.py @@ -24,6 +24,7 @@ from bart.sched.SchedMultiAssert import SchedMultiAssert from devlib.utils.misc import memoized import wrapt +from env import TestEnv from executor import Executor class LisaTest(unittest.TestCase): @@ -52,7 +53,9 @@ class LisaTest(unittest.TestCase): """ cls.logger.info("%14s - Setup tests execution engine...", "LisaTest") - cls.executor = Executor(tests_conf = cls.conf); + test_env = TestEnv() + + cls.executor = Executor(test_env, tests_conf=cls.conf); # Alias executor objects to make less verbose tests code cls.te = cls.executor.te -- GitLab From 2bafed53a78810119b683ee1e83eb7ec972b8a96 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Thu, 17 Nov 2016 17:15:11 +0000 Subject: [PATCH 02/13] executor: Rename tests_conf to experiments_conf tests_conf is easily confused with the test_conf that TestEnv uses. Also remove the default value since this parameter is required. --- libs/utils/executor.py | 50 ++++++++++++++++++++++-------------------- libs/utils/test.py | 2 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/libs/utils/executor.py b/libs/utils/executor.py index 1252d788d..448566a21 100644 --- a/libs/utils/executor.py +++ b/libs/utils/executor.py @@ -46,7 +46,7 @@ Experiment = namedtuple('Experiment', ['wload_name', 'wload', class Executor(): - def __init__(self, test_env, tests_conf=None): + def __init__(self, test_env, experiments_conf): """ Tests Executor @@ -55,16 +55,17 @@ class Executor(): - a target configuration - a worload to execute - The executor module can be configured to run a set of workloads - (wloads) in each different target configuration of a specified set - (confs). These wloads and confs can be specified by the "tests_config" - input dictionary. + The executor module can be configured to run a set of workloads (wloads) + in each different target configuration of a specified set (confs). These + wloads and confs can be specified by the "experiments_conf" input + dictionary. Each (workload, conf, iteration) tuple is called an + "experiment". All the results generated by each experiment will be collected a result folder which is named according to this template: results//::/ where: - - : the "tid" defined by the tests_config, or a timestamp + - : the "tid" defined by the experiments_conf, or a timestamp based folder in case "tid" is not specified - : the class of workload executed, e.g. rtapp or sched_perf - : the identifier of one of the specified configurations @@ -78,49 +79,50 @@ class Executor(): self._cgroup = None # Setup test configuration - if isinstance(tests_conf, dict): + if isinstance(experiments_conf, dict): logging.info('%14s - Loading custom (inline) test configuration', 'Target') - self._tests_conf = tests_conf - elif isinstance(tests_conf, str): + self._experiments_conf = experiments_conf + elif isinstance(experiments_conf, str): logging.info('%14s - Loading custom (file) test configuration', 'Target') - json_conf = JsonConf(tests_conf) - self._tests_conf = json_conf.load() + json_conf = JsonConf(experiments_conf) + self._experiments_conf = json_conf.load() else: - raise ValueError('test_conf must be either a dictionary or a filepath') + raise ValueError( + 'experiments_conf must be either a dictionary or a filepath') # Check for mandatory configurations - if 'confs' not in self._tests_conf or not self._tests_conf['confs']: + if not self._experiments_conf.get('confs', None): raise ValueError( 'Configuration error: missing \'conf\' definitions') - if 'wloads' not in self._tests_conf or not self._tests_conf['wloads']: + if not self._experiments_conf.get('wloads', None): raise ValueError( 'Configuration error: missing \'wloads\' definitions') self.te = test_env self.target = self.te.target - self._iterations = self._tests_conf.get('iterations', 1) + self._iterations = self._experiments_conf.get('iterations', 1) # Compute total number of experiments self._exp_count = self._iterations \ - * len(self._tests_conf['wloads']) \ - * len(self._tests_conf['confs']) + * len(self._experiments_conf['wloads']) \ + * len(self._experiments_conf['confs']) self._print_section('Executor', 'Experiments configuration') logging.info('%14s - Configured to run:', 'Executor') logging.info('%14s - %3d target configurations:', - 'Executor', len(self._tests_conf['confs'])) - target_confs = [conf['tag'] for conf in self._tests_conf['confs']] + 'Executor', len(self._experiments_conf['confs'])) + target_confs = [conf['tag'] for conf in self._experiments_conf['confs']] target_confs = ', '.join(target_confs) logging.info('%14s - %s', 'Executor', target_confs) logging.info('%14s - %3d workloads (%d iterations each)', - 'Executor', len(self._tests_conf['wloads']), + 'Executor', len(self._experiments_conf['wloads']), self._iterations) - wload_confs = ', '.join(self._tests_conf['wloads']) + wload_confs = ', '.join(self._experiments_conf['wloads']) logging.info('%14s - %s', 'Executor', wload_confs) logging.info('%14s - Total: %d experiments', @@ -136,11 +138,11 @@ class Executor(): # Run all the configured experiments exp_idx = 0 - for tc in self._tests_conf['confs']: + for tc in self._experiments_conf['confs']: # TARGET: configuration if not self._target_configure(tc): continue - for wl_idx in self._tests_conf['wloads']: + for wl_idx in self._experiments_conf['wloads']: # TEST: configuration wload, test_dir = self._wload_init(tc, wl_idx) for itr_idx in range(1, self._iterations + 1): @@ -498,7 +500,7 @@ class Executor(): tc_idx = tc['tag'] # Configure the test workload - wlspec = self._tests_conf['wloads'][wl_idx] + wlspec = self._experiments_conf['wloads'][wl_idx] wload = self._wload_conf(wl_idx, wlspec) # Keep track of platform configuration diff --git a/libs/utils/test.py b/libs/utils/test.py index fc5e59450..ace8a5f58 100644 --- a/libs/utils/test.py +++ b/libs/utils/test.py @@ -55,7 +55,7 @@ class LisaTest(unittest.TestCase): cls.logger.info("%14s - Setup tests execution engine...", "LisaTest") test_env = TestEnv() - cls.executor = Executor(test_env, tests_conf=cls.conf); + cls.executor = Executor(test_env, cls.conf); # Alias executor objects to make less verbose tests code cls.te = cls.executor.te -- GitLab From 981e8a3a10380af6ac1a12b6439de250b2e6c1a2 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Thu, 17 Nov 2016 17:11:15 +0000 Subject: [PATCH 03/13] executor: Extend docstring --- libs/utils/executor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/utils/executor.py b/libs/utils/executor.py index 448566a21..a93eaf6bc 100644 --- a/libs/utils/executor.py +++ b/libs/utils/executor.py @@ -72,6 +72,10 @@ class Executor(): - : the identified of one of the specified workload - : the progressive execution number from 1 up to the specified iterations + + After the workloads have been run, the Executor object's `experiments` + attribute is a list of Experiment objects. The `out_dir` attribute of + these objects can be used to find the results of the experiment. """ # Initialize globals -- GitLab From f16fed891c762960d6222db2e00f42c3bbcd681f Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Thu, 17 Nov 2016 16:51:32 +0000 Subject: [PATCH 04/13] ipynb/utils: Update Executor example notebook --- ipynb/utils/executor_example.ipynb | 331 ++++++++++++++--------------- 1 file changed, 161 insertions(+), 170 deletions(-) diff --git a/ipynb/utils/executor_example.ipynb b/ipynb/utils/executor_example.ipynb index c11e4a0d3..ff891f64b 100644 --- a/ipynb/utils/executor_example.ipynb +++ b/ipynb/utils/executor_example.ipynb @@ -52,6 +52,7 @@ "#import devlib\n", "#from env import TestEnv\n", "\n", + "from env import TestEnv\n", "from executor import Executor" ] }, @@ -68,10 +69,41 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "06:16:08 INFO : Target - Using base path: /home/bjackman/sources/lisa\n", + "06:16:08 INFO : Target - Loading custom (inline) target configuration\n", + "06:16:08 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", + "06:16:08 INFO : Target - Connecting linux target:\n", + "06:16:08 INFO : Target - username : brendan\n", + "06:16:08 INFO : Target - host : 192.168.0.1\n", + "06:16:08 INFO : Target - password : \n", + "06:16:08 INFO : Target - Connection settings:\n", + "06:16:08 INFO : Target - {'username': 'brendan', 'host': '192.168.0.1', 'password': ''}\n", + "06:16:14 INFO : Target - Initializing target workdir:\n", + "06:16:14 INFO : Target - /home/brendan/devlib-target\n", + "06:16:18 INFO : Target - Topology:\n", + "06:16:18 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", + "06:16:23 INFO : FTrace - Enabled tracepoints:\n", + "06:16:23 INFO : FTrace - sched_switch\n", + "06:16:23 INFO : FTrace - sched_wakeup\n", + "06:16:23 INFO : FTrace - sched_wakeup_new\n", + "06:16:23 INFO : FTrace - cpu_frequency\n", + "06:16:23 WARNING : TestEnv - Wipe previous contents of the results folder:\n", + "06:16:23 WARNING : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "06:16:23 INFO : TestEnv - Set results folder to:\n", + "06:16:23 INFO : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "06:16:23 INFO : TestEnv - Experiment results available also in:\n", + "06:16:23 INFO : TestEnv - /home/bjackman/sources/lisa/results_latest\n" + ] + } + ], "source": [ "# Setup a target configuration\n", - "my_target_conf = {\n", + "env = TestEnv({\n", " \n", " # Target platform and board\n", " \"platform\" : 'linux',\n", @@ -81,10 +113,31 @@ " \"host\" : '192.168.0.1',\n", " \n", " # Login credentials\n", - " \"username\" : 'root',\n", - " \"password\" : 'test0000',\n", + " \"username\" : 'brendan',\n", + " \"password\" : '',\n", + " \n", + " # Folder where all the results will be collected\n", + " \"results_dir\" : \"ExecutorExample\",\n", + " \n", + " # FTrace events to collect for all the tests configuration which have\n", + " # the \"ftrace\" flag enabled\n", + " \"ftrace\" : {\n", + " \"events\" : [\n", + " \"sched_switch\",\n", + " \"sched_wakeup\",\n", + " \"sched_wakeup_new\",\n", + " \"cpu_frequency\",\n", + " ],\n", + " \"buffsize\" : 80 * 1024,\n", + " },\n", + " \n", + " # Tools required by the experiments\n", + " \"tools\" : [ 'trace-cmd', 'perf' ],\n", + " \n", + " # Modules required by these experiments\n", + " \"modules\" : [ 'bl', 'cpufreq' ],\n", "\n", - "}" + "})" ] }, { @@ -96,18 +149,34 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "06:16:23 INFO : Target - Loading custom (inline) test configuration\n", + "06:16:23 INFO : \n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : Executor - Experiments configuration\n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : Executor - Configured to run:\n", + "06:16:23 INFO : Executor - 2 target configurations:\n", + "06:16:23 INFO : Executor - base, eas\n", + "06:16:23 INFO : Executor - 2 workloads (1 iterations each)\n", + "06:16:23 INFO : Executor - rta, perf\n", + "06:16:23 INFO : Executor - Total: 4 experiments\n", + "06:16:23 INFO : Executor - Results will be collected under:\n", + "06:16:23 INFO : Executor - /home/bjackman/sources/lisa/results/ExecutorExample\n" + ] + } + ], "source": [ - "my_tests_conf = {\n", - "\n", - " # Folder where all the results will be collected\n", - " \"results_dir\" : \"ExecutorExample\",\n", - "\n", + "executor = Executor(env, {\n", " # Platform configurations to test\n", " \"confs\" : [\n", " {\n", @@ -151,7 +220,7 @@ " \"class\" : \"profile\",\n", " \"params\" : {\n", " \"p20\" : {\n", - " \"kind\" : \"periodic\",\n", + " \"kind\" : \"Periodic\",\n", " \"params\" : {\n", " \"duty_cycle_pct\" : 20,\n", " },\n", @@ -163,26 +232,7 @@ " \n", " # Number of iterations for each workload\n", " \"iterations\" : 1,\n", - " \n", - " # FTrace events to collect for all the tests configuration which have\n", - " # the \"ftrace\" flag enabled\n", - " \"ftrace\" : {\n", - " \"events\" : [\n", - " \"sched_switch\",\n", - " \"sched_wakeup\",\n", - " \"sched_wakeup_new\",\n", - " \"cpu_frequency\",\n", - " ],\n", - " \"buffsize\" : 80 * 1024,\n", - " },\n", - " \n", - " # Tools required by the experiments\n", - " \"tools\" : [ 'trace-cmd', 'perf' ],\n", - " \n", - " # Modules required by these experiments\n", - " \"modules\" : [ 'bl', 'cpufreq' ],\n", - "\n", - "}" + "})" ] }, { @@ -194,59 +244,7 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Using base path: /home/derkling/Code/lisa\n", - "10:22:10 INFO : Target - Loading custom (inline) target configuration\n", - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", - "10:22:10 INFO : Target - Connecting linux target:\n", - "10:22:10 INFO : Target - username : root\n", - "10:22:10 INFO : Target - host : 192.168.0.1\n", - "10:22:10 INFO : Target - password : test0000\n", - "10:22:15 INFO : Target - Initializing target workdir:\n", - "10:22:15 INFO : Target - /root/devlib-target\n", - "10:22:21 INFO : Target - Topology:\n", - "10:22:21 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", - "10:22:25 INFO : FTrace - Enabled tracepoints:\n", - "10:22:25 INFO : FTrace - sched_switch\n", - "10:22:25 INFO : FTrace - sched_wakeup\n", - "10:22:25 INFO : FTrace - sched_wakeup_new\n", - "10:22:25 INFO : FTrace - cpu_frequency\n", - "10:22:25 INFO : TestEnv - Set results folder to:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results/ExecutorExample\n", - "10:22:25 INFO : TestEnv - Experiment results available also in:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments configuration\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Configured to run:\n", - "10:22:25 INFO : Executor - 2 targt configurations:\n", - "10:22:25 INFO : Executor - base, eas\n", - "10:22:25 INFO : Executor - 2 workloads (1 iterations each)\n", - "10:22:25 INFO : Executor - rta, perf\n", - "10:22:25 INFO : Executor - Total: 4 experiments\n", - "10:22:25 INFO : Executor - Results will be collected under:\n", - "10:22:25 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" - ] - } - ], - "source": [ - "executor = Executor(my_target_conf, my_tests_conf)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, @@ -255,86 +253,79 @@ "name": "stderr", "output_type": "stream", "text": [ - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments execution\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ================================================================================\n", - "10:22:25 INFO : TargetConfig - configuring target for [base] experiments\n", - "10:22:27 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", - "10:22:27 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:27 INFO : WlGen - Setup new workload rta\n", - "10:22:27 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:27 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:27 INFO : RTApp - ------------------------\n", - "10:22:27 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:27 INFO : RTApp - | calibration CPU: 1\n", - "10:22:27 INFO : RTApp - | loops count: 1\n", - "10:22:27 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:27 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:27 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:22:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:28 INFO : Executor - Experiment 1/4, [base:rta] 1/1\n", - "10:22:28 WARNING : Executor - FTrace events collection enabled\n", - "10:22:34 INFO : WlGen - Workload execution START:\n", - "10:22:34 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:22:43 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", - "10:22:43 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", - "10:22:43 INFO : WlGen - Setup new workload perf\n", - "10:22:43 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:43 INFO : Executor - Experiment 2/4, [base:perf] 1/1\n", - "10:22:43 WARNING : Executor - FTrace events collection enabled\n", - "10:22:49 INFO : WlGen - Workload execution START:\n", - "10:22:49 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:22:50 INFO : PerfBench - Completion time: 0.088000, Performance 11.363636\n", - "10:22:57 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", - "10:22:57 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", - "10:22:57 INFO : \n", - "10:22:57 INFO : ================================================================================\n", - "10:22:57 INFO : TargetConfig - configuring target for [eas] experiments\n", - "10:22:59 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", - "10:22:59 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:59 INFO : WlGen - Setup new workload rta\n", - "10:22:59 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:59 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:59 INFO : RTApp - ------------------------\n", - "10:22:59 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:59 INFO : RTApp - | calibration CPU: 1\n", - "10:22:59 INFO : RTApp - | loops count: 1\n", - "10:22:59 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:59 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:59 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:23:00 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:00 INFO : Executor - Experiment 3/4, [eas:rta] 1/1\n", - "10:23:00 WARNING : Executor - FTrace events collection enabled\n", - "10:23:06 INFO : WlGen - Workload execution START:\n", - "10:23:06 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:23:16 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", - "10:23:16 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", - "10:23:16 INFO : WlGen - Setup new workload perf\n", - "10:23:17 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:17 INFO : Executor - Experiment 4/4, [eas:perf] 1/1\n", - "10:23:17 WARNING : Executor - FTrace events collection enabled\n", - "10:23:22 INFO : WlGen - Workload execution START:\n", - "10:23:22 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:23:23 INFO : PerfBench - Completion time: 0.119000, Performance 8.403361\n", - "10:23:31 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace.dat\n", - "10:23:31 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace_stat.json\n", - "10:23:31 INFO : \n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Experiments execution completed\n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Results available in:\n", - "10:23:31 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" + "06:16:23 INFO : \n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : Executor - Experiments execution\n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : \n", + "06:16:23 INFO : ================================================================================\n", + "06:16:23 INFO : TargetConfig - configuring target for [base] experiments\n", + "06:16:25 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", + "06:16:26 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "06:16:27 INFO : WlGen - Setup new workload rta\n", + "06:16:27 INFO : RTApp - Workload duration defined by longest task\n", + "06:16:27 INFO : RTApp - Default policy: SCHED_OTHER\n", + "06:16:27 INFO : RTApp - ------------------------\n", + "06:16:27 INFO : RTApp - task [task_p200], sched: using default policy\n", + "06:16:27 INFO : RTApp - | calibration CPU: 1\n", + "06:16:27 INFO : RTApp - | loops count: 1\n", + "06:16:27 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "06:16:27 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "06:16:27 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "06:16:28 INFO : WlGen - Setup new workload perf\n", + "06:16:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:16:28 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "06:16:28 WARNING : Executor - FTrace events collection enabled\n", + "06:16:36 INFO : WlGen - Workload execution START:\n", + "06:16:36 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "06:16:44 INFO : Executor - Collected FTrace binary trace:\n", + "06:16:44 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "06:16:44 INFO : Executor - Collected FTrace function profiling:\n", + "06:16:44 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "06:16:44 INFO : --------------------------------------------------------------------------------\n", + "06:16:44 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:16:44 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "06:16:44 WARNING : Executor - FTrace events collection enabled\n", + "06:16:52 INFO : WlGen - Workload execution START:\n", + "06:16:52 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "06:16:53 INFO : PerfBench - Completion time: 0.007000, Performance 142.857143\n", + "06:16:58 INFO : Executor - Collected FTrace binary trace:\n", + "06:16:58 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", + "06:16:58 INFO : Executor - Collected FTrace function profiling:\n", + "06:16:58 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", + "06:16:58 INFO : --------------------------------------------------------------------------------\n", + "06:16:58 INFO : \n", + "06:16:58 INFO : ================================================================================\n", + "06:16:58 INFO : TargetConfig - configuring target for [eas] experiments\n", + "06:17:00 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", + "06:17:01 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "06:17:02 INFO : WlGen - Setup new workload rta\n", + "06:17:02 INFO : RTApp - Workload duration defined by longest task\n", + "06:17:02 INFO : RTApp - Default policy: SCHED_OTHER\n", + "06:17:02 INFO : RTApp - ------------------------\n", + "06:17:02 INFO : RTApp - task [task_p200], sched: using default policy\n", + "06:17:02 INFO : RTApp - | calibration CPU: 1\n", + "06:17:02 INFO : RTApp - | loops count: 1\n", + "06:17:02 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "06:17:02 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "06:17:02 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "06:17:03 INFO : WlGen - Setup new workload perf\n", + "06:17:03 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:17:03 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "06:17:03 WARNING : Executor - FTrace events collection enabled\n", + "06:17:11 INFO : WlGen - Workload execution START:\n", + "06:17:11 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "06:17:19 INFO : Executor - Collected FTrace binary trace:\n", + "06:17:19 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "06:17:19 INFO : Executor - Collected FTrace function profiling:\n", + "06:17:19 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "06:17:19 INFO : --------------------------------------------------------------------------------\n", + "06:17:19 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:17:19 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "06:17:19 WARNING : Executor - FTrace events collection enabled\n", + "06:17:27 INFO : WlGen - Workload execution START:\n", + "06:17:27 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "06:17:28 INFO : PerfBench - Completion time: 0.034000, Performance 29.411765\n" ] } ], @@ -353,7 +344,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[01;34m/home/derkling/Code/lisa/results/ExecutorExample\u001b[00m\r\n", + "\u001b[01;34m/home/brejac01/sources/lisa/results/ExecutorExample\u001b[00m\r\n", "├── \u001b[01;34mperf_bench_messaging:base:perf\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", "│   │   ├── output.log\r\n", @@ -374,7 +365,7 @@ "│   ├── \u001b[01;34m1\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", "│   │   └── trace.dat\r\n", "│   ├── kernel.config\r\n", "│   ├── kernel.version\r\n", @@ -383,7 +374,7 @@ " ├── \u001b[01;34m1\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", " │   └── trace.dat\r\n", " ├── kernel.config\r\n", " ├── kernel.version\r\n", @@ -414,7 +405,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, -- GitLab From d6f34931dee652673675517bcad3da111b95a04f Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Thu, 17 Nov 2016 17:07:50 +0000 Subject: [PATCH 05/13] ipynb/tutorial: Update Executor tutorial notebook --- ipynb/tutorial/04_ExecutorUsage.ipynb | 576 +++++++++++++++++++------- 1 file changed, 424 insertions(+), 152 deletions(-) diff --git a/ipynb/tutorial/04_ExecutorUsage.ipynb b/ipynb/tutorial/04_ExecutorUsage.ipynb index 03418abd3..dd6c53ba9 100644 --- a/ipynb/tutorial/04_ExecutorUsage.ipynb +++ b/ipynb/tutorial/04_ExecutorUsage.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -59,16 +59,152 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2016-11-17 17:00:31,811 INFO : Target - Using base path: /home/bjackman/sources/lisa\n", + "2016-11-17 17:00:31,812 INFO : Target - Loading custom (inline) target configuration\n", + "2016-11-17 17:00:31,812 DEBUG : Target - Target configuration {'username': 'brendan', 'platform': 'linux', 'host': '192.168.0.1', 'ftrace': {'buffsize': 81920, 'events': ['sched_switch', 'sched_wakeup', 'sched_wakeup_new', 'cpu_frequency']}, 'board': 'juno2', 'modules': ['bl', 'cpufreq'], 'password': 'test0000', 'tools': ['trace-cmd', 'perf'], 'results_dir': 'ExecutorExample'}\n", + "2016-11-17 17:00:31,813 INFO : Target - Devlib modules to load: ['bl', 'cpufreq', 'hwmon']\n", + "2016-11-17 17:00:31,814 INFO : Target - Connecting linux target:\n", + "2016-11-17 17:00:31,815 INFO : Target - username : brendan\n", + "2016-11-17 17:00:31,816 INFO : Target - host : 192.168.0.1\n", + "2016-11-17 17:00:31,817 INFO : Target - password : \n", + "2016-11-17 17:00:31,819 INFO : Target - Connection settings:\n", + "2016-11-17 17:00:31,820 INFO : Target - {'username': 'brendan', 'host': '192.168.0.1', 'password': ''}\n", + "2016-11-17 17:00:31,821 DEBUG : Target - Setup LINUX target...\n", + "2016-11-17 17:00:31,828 DEBUG : Installing module vexpress-u-boot\n", + "2016-11-17 17:00:31,829 DEBUG : Installing module vexpress-dtr\n", + "2016-11-17 17:00:31,830 DEBUG : Installing module vexpress-vemsd\n", + "2016-11-17 17:00:31,831 DEBUG : Logging in brendan@192.168.0.1\n", + "2016-11-17 17:00:33,311 DEBUG : id\n", + "2016-11-17 17:00:33,722 DEBUG : echo $USER\n", + "2016-11-17 17:00:34,128 DEBUG : if [ -e '/home/brendan/devlib-target/bin' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:34,534 DEBUG : ls -1 /home/brendan/devlib-target/bin\n", + "2016-11-17 17:00:34,944 DEBUG : cat /proc/cpuinfo\n", + "2016-11-17 17:00:35,353 DEBUG : sudo -- sh -c 'ls /'\n", + "2016-11-17 17:00:35,901 DEBUG : sudo -- sh -c 'dmidecode -s system-version'\n", + "2016-11-17 17:00:36,706 DEBUG : Installing module bl\n", + "2016-11-17 17:00:36,808 DEBUG : uname -m\n", + "2016-11-17 17:00:37,216 DEBUG : if [ -e '/sys/devices/system/cpu/cpufreq' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:37,523 DEBUG : Installing module cpufreq\n", + "2016-11-17 17:00:37,624 DEBUG : if [ -e '/sys/class/hwmon' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:37,931 DEBUG : Installing module hwmon\n", + "2016-11-17 17:00:38,033 DEBUG : ls -1 /sys/class/hwmon\n", + "2016-11-17 17:00:38,442 DEBUG : if [ -e '/sys/class/hwmon/hwmon0/name' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:38,848 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/name'\\'''\n", + "2016-11-17 17:00:39,754 DEBUG : ls -1 /sys/class/hwmon/hwmon0/\n", + "2016-11-17 17:00:40,166 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr1_label'\\'''\n", + "2016-11-17 17:00:41,072 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr2_label'\\'''\n", + "2016-11-17 17:00:41,977 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr3_label'\\'''\n", + "2016-11-17 17:00:42,882 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr4_label'\\'''\n", + "2016-11-17 17:00:43,788 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy1_label'\\'''\n", + "2016-11-17 17:00:44,694 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_label'\\'''\n", + "2016-11-17 17:00:45,599 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_label'\\'''\n", + "2016-11-17 17:00:46,505 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy4_label'\\'''\n", + "2016-11-17 17:00:47,410 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in0_label'\\'''\n", + "2016-11-17 17:00:48,316 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in1_label'\\'''\n", + "2016-11-17 17:00:49,221 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in2_label'\\'''\n", + "2016-11-17 17:00:50,126 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in3_label'\\'''\n", + "2016-11-17 17:00:51,032 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in4_label'\\'''\n", + "2016-11-17 17:00:51,938 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in5_label'\\'''\n", + "2016-11-17 17:00:52,843 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in6_label'\\'''\n", + "2016-11-17 17:00:53,749 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power1_label'\\'''\n", + "2016-11-17 17:00:54,654 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power2_label'\\'''\n", + "2016-11-17 17:00:55,560 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power3_label'\\'''\n", + "2016-11-17 17:00:56,466 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power4_label'\\'''\n", + "2016-11-17 17:00:57,371 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/temp1_label'\\'''\n", + "2016-11-17 17:00:58,277 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/temp2_label'\\'''\n", + "2016-11-17 17:00:59,082 DEBUG : Target - Checking target connection...\n", + "2016-11-17 17:00:59,083 DEBUG : Target - Target info:\n", + "2016-11-17 17:00:59,084 DEBUG : Target - ABI: arm64\n", + "2016-11-17 17:00:59,085 DEBUG : Target - CPUs: CpuInfo(['A53', 'A57', 'A57', 'A53', 'A53', 'A53'])\n", + "2016-11-17 17:00:59,087 DEBUG : Target - Clusters: [0, 1, 1, 0, 0, 0]\n", + "2016-11-17 17:00:59,088 INFO : Target - Initializing target workdir:\n", + "2016-11-17 17:00:59,089 INFO : Target - /home/brendan/devlib-target\n", + "2016-11-17 17:00:59,190 DEBUG : mkdir -p /home/brendan/devlib-target\n", + "2016-11-17 17:00:59,599 DEBUG : mkdir -p /home/brendan/devlib-target/bin\n", + "2016-11-17 17:00:59,909 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/libs/devlib/devlib/bin/arm64/busybox brendan@192.168.0.1:/home/brendan/devlib-target/bin/busybox\n", + "2016-11-17 17:01:00,410 DEBUG : chmod a+x /home/brendan/devlib-target/bin/busybox\n", + "2016-11-17 17:01:00,718 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/libs/devlib/devlib/bin/scripts/shutils brendan@192.168.0.1:/home/brendan/devlib-target/bin/shutils\n", + "2016-11-17 17:01:01,202 DEBUG : chmod a+x /home/brendan/devlib-target/bin/shutils\n", + "2016-11-17 17:01:01,511 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/tools/arm64/trace-cmd brendan@192.168.0.1:/home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:01,856 DEBUG : chmod a+x /home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:02,164 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/tools/arm64/perf brendan@192.168.0.1:/home/brendan/devlib-target/bin/perf\n", + "2016-11-17 17:01:02,549 DEBUG : chmod a+x /home/brendan/devlib-target/bin/perf\n", + "2016-11-17 17:01:02,856 DEBUG : Target - Check for module [bl]...\n", + "2016-11-17 17:01:02,857 DEBUG : Target - Check for module [cpufreq]...\n", + "2016-11-17 17:01:02,858 DEBUG : Target - Check for module [hwmon]...\n", + "2016-11-17 17:01:02,860 INFO : Target - Topology:\n", + "2016-11-17 17:01:02,861 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", + "2016-11-17 17:01:02,962 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", + "2016-11-17 17:01:03,868 DEBUG : cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies\n", + "2016-11-17 17:01:04,276 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", + "2016-11-17 17:01:05,181 DEBUG : cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_available_frequencies\n", + "2016-11-17 17:01:05,490 DEBUG : Platform - Trying to load default EM from /home/bjackman/sources/lisa/libs/utils/platforms/juno2.json\n", + "2016-11-17 17:01:05,491 DEBUG : Platform - Platform descriptor initialized\n", + "{'nrg_model': None, 'clusters': {'big': [1, 2], 'little': [0, 3, 4, 5]}, 'cpus_count': 6, 'freqs': {'big': [450000, 625000, 800000, 950000, 1100000], 'little': [450000, 575000, 700000, 775000, 850000]}, 'topology': [[0, 3, 4, 5], [1, 2]]}\n", + "2016-11-17 17:01:05,509 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/libs/devlib/devlib/bin/arm64/trace-cmd brendan@192.168.0.1:/home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:05,949 DEBUG : chmod a+x /home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:06,357 DEBUG : sudo -- sh -c 'cat /sys/kernel/debug/tracing/available_events'\n", + "2016-11-17 17:01:07,172 INFO : FTrace - Enabled tracepoints:\n", + "2016-11-17 17:01:07,173 INFO : FTrace - sched_switch\n", + "2016-11-17 17:01:07,174 INFO : FTrace - sched_wakeup\n", + "2016-11-17 17:01:07,175 INFO : FTrace - sched_wakeup_new\n", + "2016-11-17 17:01:07,176 INFO : FTrace - cpu_frequency\n", + "2016-11-17 17:01:07,177 DEBUG : No RT-App workloads, skipping calibration\n", + "2016-11-17 17:01:07,178 WARNING : TestEnv - Wipe previous contents of the results folder:\n", + "2016-11-17 17:01:07,179 WARNING : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "2016-11-17 17:01:07,181 DEBUG : EnergyMeter - using default energy meter for [juno2]\n", + "2016-11-17 17:01:07,182 INFO : HWMon - Scanning for HWMON channels, may take some time...\n", + "2016-11-17 17:01:07,184 DEBUG : Discovering available HWMON sensors...\n", + "2016-11-17 17:01:07,185 DEBUG : \tAdding sensor scpi_sensors/energy1\n", + "2016-11-17 17:01:07,186 DEBUG : \tAdding sensor scpi_sensors/energy2\n", + "2016-11-17 17:01:07,187 DEBUG : \tAdding sensor scpi_sensors/energy3\n", + "2016-11-17 17:01:07,188 DEBUG : \tAdding sensor scpi_sensors/energy4\n", + "2016-11-17 17:01:07,189 DEBUG : \tAdding sensor scpi_sensors/curr1\n", + "2016-11-17 17:01:07,191 DEBUG : \tAdding sensor scpi_sensors/curr2\n", + "2016-11-17 17:01:07,192 DEBUG : \tAdding sensor scpi_sensors/curr3\n", + "2016-11-17 17:01:07,193 DEBUG : \tAdding sensor scpi_sensors/curr4\n", + "2016-11-17 17:01:07,194 DEBUG : \tAdding sensor scpi_sensors/temp1\n", + "2016-11-17 17:01:07,195 DEBUG : \tAdding sensor scpi_sensors/temp2\n", + "2016-11-17 17:01:07,196 DEBUG : \tAdding sensor scpi_sensors/power1\n", + "2016-11-17 17:01:07,198 DEBUG : \tAdding sensor scpi_sensors/power2\n", + "2016-11-17 17:01:07,199 DEBUG : \tAdding sensor scpi_sensors/power3\n", + "2016-11-17 17:01:07,200 DEBUG : \tAdding sensor scpi_sensors/power4\n", + "2016-11-17 17:01:07,201 DEBUG : \tAdding sensor scpi_sensors/in0\n", + "2016-11-17 17:01:07,202 DEBUG : \tAdding sensor scpi_sensors/in1\n", + "2016-11-17 17:01:07,203 DEBUG : \tAdding sensor scpi_sensors/in2\n", + "2016-11-17 17:01:07,204 DEBUG : \tAdding sensor scpi_sensors/in3\n", + "2016-11-17 17:01:07,205 DEBUG : \tAdding sensor scpi_sensors/in4\n", + "2016-11-17 17:01:07,206 DEBUG : \tAdding sensor scpi_sensors/in5\n", + "2016-11-17 17:01:07,206 DEBUG : \tAdding sensor scpi_sensors/in6\n", + "2016-11-17 17:01:07,207 DEBUG : HWMon - Enabling channels {'kinds': ['energy'], 'sites': ['BOARDLITTLE', 'BOARDBIG']}\n", + "2016-11-17 17:01:07,208 INFO : HWMon - Channels selected for energy sampling:\n", + "2016-11-17 17:01:07,209 INFO : HWMon - BOARDBIG_energy\n", + "2016-11-17 17:01:07,210 INFO : HWMon - BOARDLITTLE_energy\n", + "2016-11-17 17:01:07,211 DEBUG : EnergyMeter - Results dir: /home/bjackman/sources/lisa/results/ExecutorExample\n", + "2016-11-17 17:01:07,212 INFO : TestEnv - Set results folder to:\n", + "2016-11-17 17:01:07,213 INFO : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "2016-11-17 17:01:07,214 INFO : TestEnv - Experiment results available also in:\n", + "2016-11-17 17:01:07,215 INFO : TestEnv - /home/bjackman/sources/lisa/results_latest\n" + ] + } + ], "source": [ - "# Setup a target configuration\n", - "my_target_conf = {\n", + "from env import TestEnv\n", + "\n", + "# Setup a test environment with target configuration\n", + "env = TestEnv({\n", " \n", " # Target platform and board\n", " \"platform\" : 'linux',\n", - " \"board\" : 'aboard',\n", + " \"board\" : 'juno2',\n", " \n", " # Target board IP/MAC address\n", " \"host\" : '192.168.0.1',\n", @@ -77,7 +213,27 @@ " \"username\" : 'root',\n", " \"password\" : 'test0000',\n", "\n", - "}" + " # Folder where all the results will be collected\n", + " \"results_dir\" : \"ExecutorExample\",\n", + " \n", + " # FTrace events to collect for all the tests configuration which have\n", + " # the \"ftrace\" flag enabled\n", + " \"ftrace\" : {\n", + " \"events\" : [\n", + " \"sched_switch\",\n", + " \"sched_wakeup\",\n", + " \"sched_wakeup_new\",\n", + " \"cpu_frequency\",\n", + " ],\n", + " \"buffsize\" : 80 * 1024,\n", + " },\n", + " \n", + " # Tools required by the experiments\n", + " \"tools\" : [ 'trace-cmd', 'perf' ],\n", + " \n", + " # Modules required by these experiments\n", + " \"modules\" : [ 'bl', 'cpufreq' ],\n", + "})" ] }, { @@ -98,9 +254,6 @@ "source": [ "my_tests_conf = {\n", "\n", - " # Folder where all the results will be collected\n", - " \"results_dir\" : \"ExecutorExample\",\n", - "\n", " # Platform configurations to test\n", " \"confs\" : [\n", " {\n", @@ -144,7 +297,7 @@ " \"class\" : \"profile\",\n", " \"params\" : {\n", " \"p20\" : {\n", - " \"kind\" : \"periodic\",\n", + " \"kind\" : \"Periodic\",\n", " \"params\" : {\n", " \"duty_cycle_pct\" : 20,\n", " },\n", @@ -156,25 +309,6 @@ " \n", " # Number of iterations for each workload\n", " \"iterations\" : 1,\n", - " \n", - " # FTrace events to collect for all the tests configuration which have\n", - " # the \"ftrace\" flag enabled\n", - " \"ftrace\" : {\n", - " \"events\" : [\n", - " \"sched_switch\",\n", - " \"sched_wakeup\",\n", - " \"sched_wakeup_new\",\n", - " \"cpu_frequency\",\n", - " ],\n", - " \"buffsize\" : 80 * 1024,\n", - " },\n", - " \n", - " # Tools required by the experiments\n", - " \"tools\" : [ 'trace-cmd', 'perf' ],\n", - " \n", - " # Modules required by these experiments\n", - " \"modules\" : [ 'bl', 'cpufreq' ],\n", - "\n", "}" ] }, @@ -196,140 +330,274 @@ "name": "stderr", "output_type": "stream", "text": [ - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Using base path: /home/derkling/Code/lisa\n", - "10:22:10 INFO : Target - Loading custom (inline) target configuration\n", - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", - "10:22:10 INFO : Target - Connecting linux target:\n", - "10:22:10 INFO : Target - username : root\n", - "10:22:10 INFO : Target - host : 192.168.0.1\n", - "10:22:10 INFO : Target - password : test0000\n", - "10:22:15 INFO : Target - Initializing target workdir:\n", - "10:22:15 INFO : Target - /root/devlib-target\n", - "10:22:21 INFO : Target - Topology:\n", - "10:22:21 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", - "10:22:25 INFO : FTrace - Enabled tracepoints:\n", - "10:22:25 INFO : FTrace - sched_switch\n", - "10:22:25 INFO : FTrace - sched_wakeup\n", - "10:22:25 INFO : FTrace - sched_wakeup_new\n", - "10:22:25 INFO : FTrace - cpu_frequency\n", - "10:22:25 INFO : TestEnv - Set results folder to:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results/ExecutorExample\n", - "10:22:25 INFO : TestEnv - Experiment results available also in:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments configuration\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Configured to run:\n", - "10:22:25 INFO : Executor - 2 targt configurations:\n", - "10:22:25 INFO : Executor - base, eas\n", - "10:22:25 INFO : Executor - 2 workloads (1 iterations each)\n", - "10:22:25 INFO : Executor - rta, perf\n", - "10:22:25 INFO : Executor - Total: 4 experiments\n", - "10:22:25 INFO : Executor - Results will be collected under:\n", - "10:22:25 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" + "05:01:07 INFO : Target - Loading custom (inline) test configuration\n", + "05:01:07 INFO : \n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : Executor - Experiments configuration\n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : Executor - Configured to run:\n", + "05:01:07 INFO : Executor - 2 target configurations:\n", + "05:01:07 INFO : Executor - base, eas\n", + "05:01:07 INFO : Executor - 2 workloads (1 iterations each)\n", + "05:01:07 INFO : Executor - rta, perf\n", + "05:01:07 INFO : Executor - Total: 4 experiments\n", + "05:01:07 INFO : Executor - Results will be collected under:\n", + "05:01:07 INFO : Executor - /home/bjackman/sources/lisa/results/ExecutorExample\n" ] } ], "source": [ "from executor import Executor\n", "\n", - "executor = Executor(my_target_conf, my_tests_conf)" + "executor = Executor(env, my_tests_conf)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments execution\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ================================================================================\n", - "10:22:25 INFO : TargetConfig - configuring target for [base] experiments\n", - "10:22:27 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", - "10:22:27 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:27 INFO : WlGen - Setup new workload rta\n", - "10:22:27 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:27 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:27 INFO : RTApp - ------------------------\n", - "10:22:27 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:27 INFO : RTApp - | calibration CPU: 1\n", - "10:22:27 INFO : RTApp - | loops count: 1\n", - "10:22:27 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:27 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:27 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:22:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:28 INFO : Executor - Experiment 1/4, [base:rta] 1/1\n", - "10:22:28 WARNING : Executor - FTrace events collection enabled\n", - "10:22:34 INFO : WlGen - Workload execution START:\n", - "10:22:34 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:22:43 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", - "10:22:43 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", - "10:22:43 INFO : WlGen - Setup new workload perf\n", - "10:22:43 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:43 INFO : Executor - Experiment 2/4, [base:perf] 1/1\n", - "10:22:43 WARNING : Executor - FTrace events collection enabled\n", - "10:22:49 INFO : WlGen - Workload execution START:\n", - "10:22:49 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:22:50 INFO : PerfBench - Completion time: 0.088000, Performance 11.363636\n", - "10:22:57 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", - "10:22:57 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", - "10:22:57 INFO : \n", - "10:22:57 INFO : ================================================================================\n", - "10:22:57 INFO : TargetConfig - configuring target for [eas] experiments\n", - "10:22:59 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", - "10:22:59 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:59 INFO : WlGen - Setup new workload rta\n", - "10:22:59 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:59 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:59 INFO : RTApp - ------------------------\n", - "10:22:59 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:59 INFO : RTApp - | calibration CPU: 1\n", - "10:22:59 INFO : RTApp - | loops count: 1\n", - "10:22:59 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:59 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:59 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:23:00 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:00 INFO : Executor - Experiment 3/4, [eas:rta] 1/1\n", - "10:23:00 WARNING : Executor - FTrace events collection enabled\n", - "10:23:06 INFO : WlGen - Workload execution START:\n", - "10:23:06 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:23:16 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", - "10:23:16 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", - "10:23:16 INFO : WlGen - Setup new workload perf\n", - "10:23:17 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:17 INFO : Executor - Experiment 4/4, [eas:perf] 1/1\n", - "10:23:17 WARNING : Executor - FTrace events collection enabled\n", - "10:23:22 INFO : WlGen - Workload execution START:\n", - "10:23:22 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:23:23 INFO : PerfBench - Completion time: 0.119000, Performance 8.403361\n", - "10:23:31 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace.dat\n", - "10:23:31 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace_stat.json\n", - "10:23:31 INFO : \n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Experiments execution completed\n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Results available in:\n", - "10:23:31 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" + "05:01:07 INFO : \n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : Executor - Experiments execution\n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : \n", + "05:01:07 INFO : ================================================================================\n", + "05:01:07 INFO : TargetConfig - configuring target for [base] experiments\n", + "2016-11-17 17:01:07,401 DEBUG : sudo -- sh -c '[ -d /home/brendan/devlib-target/run_dir ] || mkdir /home/brendan/devlib-target/run_dir'\n", + "2016-11-17 17:01:08,306 DEBUG : sudo -- sh -c 'grep schedtest /proc/mounts || mount -t tmpfs -o size=1024m schedtest /home/brendan/devlib-target/run_dir'\n", + "05:01:09 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", + "2016-11-17 17:01:09,212 DEBUG : sudo -- sh -c 'echo NO_ENERGY_AWARE > /sys/kernel/debug/sched_features'\n", + "05:01:10 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "2016-11-17 17:01:10,118 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_set_all_governors performance'\n", + "05:01:10 INFO : WlGen - Setup new workload rta\n", + "05:01:10 INFO : RTApp - Workload duration defined by longest task\n", + "05:01:10 INFO : RTApp - Default policy: SCHED_OTHER\n", + "05:01:10 INFO : RTApp - ------------------------\n", + "05:01:10 INFO : RTApp - task [task_p200], sched: using default policy\n", + "05:01:10 INFO : RTApp - | calibration CPU: 1\n", + "05:01:10 INFO : RTApp - | loops count: 1\n", + "05:01:10 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "05:01:10 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "05:01:10 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "2016-11-17 17:01:10,934 DEBUG : /usr/bin/scp -r rta_00.json brendan@192.168.0.1:/home/brendan/devlib-target/run_dir\n", + "2016-11-17 17:01:11,184 DEBUG : zcat /proc/config.gz\n", + "2016-11-17 17:01:11,706 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:12 INFO : WlGen - Setup new workload perf\n", + "2016-11-17 17:01:12,149 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:12 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:01:12 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "05:01:12 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:01:12,569 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:13,272 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:14,178 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:01:15,707 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:01:17,247 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:17,850 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:17,951 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:18,857 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:19,762 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:01:20 INFO : WlGen - Workload execution START:\n", + "05:01:20 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:01:20,671 DEBUG : /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:01:22,087 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:'/home/brendan/devlib-target/run_dir/*task_p200*.log' /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:01:22,240 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/run_dir/rta_00.json /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:01:22,493 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:23,400 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:01:24,205 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:24,307 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:25,213 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:25,915 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:01:26,821 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:01:28,593 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1/trace.dat\n", + "05:01:35 INFO : Executor - Collected FTrace binary trace:\n", + "05:01:35 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "05:01:35 INFO : Executor - Collected FTrace function profiling:\n", + "05:01:35 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "05:01:35 INFO : --------------------------------------------------------------------------------\n", + "05:01:35 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:01:35 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "05:01:35 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:01:35,737 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:36,440 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:37,346 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:01:38,888 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:01:40,434 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:41,037 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:41,139 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:42,045 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:42,951 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:01:43 INFO : WlGen - Workload execution START:\n", + "05:01:43 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "2016-11-17 17:01:43,859 DEBUG : /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "05:01:44 INFO : PerfBench - Completion time: 0.012000, Performance 83.333333\n", + "2016-11-17 17:01:44,284 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:45,190 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:01:45,995 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:46,097 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:47,003 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:49,258 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:01:50,164 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:01:51,947 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/perf_bench_messaging:base:perf/1/trace.dat\n", + "05:01:52 INFO : Executor - Collected FTrace binary trace:\n", + "05:01:52 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", + "05:01:52 INFO : Executor - Collected FTrace function profiling:\n", + "05:01:52 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", + "05:01:52 INFO : --------------------------------------------------------------------------------\n", + "05:01:52 INFO : \n", + "05:01:52 INFO : ================================================================================\n", + "05:01:52 INFO : TargetConfig - configuring target for [eas] experiments\n", + "2016-11-17 17:01:52,740 DEBUG : sudo -- sh -c '[ -d /home/brendan/devlib-target/run_dir ] || mkdir /home/brendan/devlib-target/run_dir'\n", + "2016-11-17 17:01:53,646 DEBUG : sudo -- sh -c 'grep schedtest /proc/mounts || mount -t tmpfs -o size=1024m schedtest /home/brendan/devlib-target/run_dir'\n", + "05:01:54 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", + "2016-11-17 17:01:54,552 DEBUG : sudo -- sh -c 'echo ENERGY_AWARE > /sys/kernel/debug/sched_features'\n", + "05:01:55 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "2016-11-17 17:01:55,460 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_set_all_governors performance'\n", + "05:01:56 INFO : WlGen - Setup new workload rta\n", + "05:01:56 INFO : RTApp - Workload duration defined by longest task\n", + "05:01:56 INFO : RTApp - Default policy: SCHED_OTHER\n", + "05:01:56 INFO : RTApp - ------------------------\n", + "05:01:56 INFO : RTApp - task [task_p200], sched: using default policy\n", + "05:01:56 INFO : RTApp - | calibration CPU: 1\n", + "05:01:56 INFO : RTApp - | loops count: 1\n", + "05:01:56 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "05:01:56 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "05:01:56 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "2016-11-17 17:01:56,276 DEBUG : /usr/bin/scp -r rta_00.json brendan@192.168.0.1:/home/brendan/devlib-target/run_dir\n", + "2016-11-17 17:01:56,579 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:56 INFO : WlGen - Setup new workload perf\n", + "2016-11-17 17:01:57,022 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:57 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:01:57 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "05:01:57 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:01:57,442 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:58,146 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:59,052 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:00,818 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:02,450 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:03,052 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:03,154 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:04,061 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:04,967 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:05 INFO : WlGen - Workload execution START:\n", + "05:02:05 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:05,875 DEBUG : /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:07,294 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:'/home/brendan/devlib-target/run_dir/*task_p200*.log' /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:02:07,464 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/run_dir/rta_00.json /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:02:07,734 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:08,640 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:09,446 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:09,548 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:10,453 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:11,156 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:02:12,062 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:02:14,012 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1/trace.dat\n", + "05:02:14 INFO : Executor - Collected FTrace binary trace:\n", + "05:02:14 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "05:02:14 INFO : Executor - Collected FTrace function profiling:\n", + "05:02:14 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "05:02:14 INFO : --------------------------------------------------------------------------------\n", + "05:02:14 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:02:14 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "05:02:14 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:02:14,771 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:15,473 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:16,379 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:18,021 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:19,703 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:20,305 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:20,407 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:21,313 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:22,219 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:23 INFO : WlGen - Workload execution START:\n", + "05:02:23 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "2016-11-17 17:02:23,127 DEBUG : /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "05:02:23 INFO : PerfBench - Completion time: 0.080000, Performance 12.500000\n", + "2016-11-17 17:02:23,628 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:24,534 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:25,340 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:25,442 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:26,347 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:27,050 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:02:27,956 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:02:30,090 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/perf_bench_messaging:base:perf/1/trace.dat\n", + "05:02:30 INFO : Executor - Collected FTrace binary trace:\n", + "05:02:30 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", + "05:02:30 INFO : Executor - Collected FTrace function profiling:\n", + "05:02:30 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", + "05:02:30 INFO : --------------------------------------------------------------------------------\n", + "05:02:30 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:02:30 INFO : Executor - Experiment 2/4, [eas:rta] 1/1\n", + "05:02:30 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:02:30,869 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:31,572 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:32,478 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:34,271 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:35,963 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:36,565 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:36,667 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:37,573 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:38,479 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:39 INFO : WlGen - Workload execution START:\n", + "05:02:39 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:39,387 DEBUG : /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:40,807 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:'/home/brendan/devlib-target/run_dir/*task_p200*.log' /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:eas:rta/1\n", + "2016-11-17 17:02:40,980 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/run_dir/rta_00.json /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:eas:rta/1\n", + "2016-11-17 17:02:41,231 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:42,137 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:42,943 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:43,045 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:43,950 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:44,653 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:02:45,559 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:02:47,519 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:eas:rta/1/trace.dat\n", + "05:02:48 INFO : Executor - Collected FTrace binary trace:\n", + "05:02:48 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", + "05:02:48 INFO : Executor - Collected FTrace function profiling:\n", + "05:02:48 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", + "05:02:48 INFO : --------------------------------------------------------------------------------\n", + "05:02:48 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:02:48 INFO : Executor - Experiment 3/4, [eas:perf] 1/1\n", + "05:02:48 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:02:48,276 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:48,979 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:49,885 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:51,485 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:53,160 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:53,763 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:53,865 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:54,771 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:55,676 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:56 INFO : WlGen - Workload execution START:\n", + "05:02:56 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "2016-11-17 17:02:56,585 DEBUG : /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "05:02:56 INFO : PerfBench - Completion time: 0.083000, Performance 12.048193\n", + "2016-11-17 17:02:57,088 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:57,994 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:58,799 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:58,901 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:59,807 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:03:00,510 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:03:01,415 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:03:03,385 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/perf_bench_messaging:eas:perf/1/trace.dat\n", + "05:03:04 INFO : Executor - Collected FTrace binary trace:\n", + "05:03:04 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace.dat\n", + "05:03:04 INFO : Executor - Collected FTrace function profiling:\n", + "05:03:04 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace_stat.json\n", + "05:03:04 INFO : --------------------------------------------------------------------------------\n", + "05:03:04 INFO : \n", + "05:03:04 INFO : ################################################################################\n", + "05:03:04 INFO : Executor - Experiments execution completed\n", + "05:03:04 INFO : ################################################################################\n", + "05:03:04 INFO : Executor - Results available in:\n", + "05:03:04 INFO : Executor - /home/bjackman/sources/lisa/results/ExecutorExample\n" ] } ], @@ -348,9 +616,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[01;34m/home/derkling/Code/lisa/results/ExecutorExample\u001b[00m\r\n", + "\u001b[01;34m/home/bjackman/sources/lisa/results/ExecutorExample\u001b[00m\r\n", "├── \u001b[01;34mperf_bench_messaging:base:perf\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", + "│   │   ├── energy.json\r\n", "│   │   ├── output.log\r\n", "│   │   ├── performance.json\r\n", "│   │   └── trace.dat\r\n", @@ -359,6 +628,7 @@ "│   └── platform.json\r\n", "├── \u001b[01;34mperf_bench_messaging:eas:perf\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", + "│   │   ├── energy.json\r\n", "│   │   ├── output.log\r\n", "│   │   ├── performance.json\r\n", "│   │   └── trace.dat\r\n", @@ -367,24 +637,26 @@ "│   └── platform.json\r\n", "├── \u001b[01;34mrtapp:base:rta\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", + "│   │   ├── energy.json\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", "│   │   └── trace.dat\r\n", "│   ├── kernel.config\r\n", "│   ├── kernel.version\r\n", "│   └── platform.json\r\n", "└── \u001b[01;34mrtapp:eas:rta\u001b[00m\r\n", " ├── \u001b[01;34m1\u001b[00m\r\n", + " │   ├── energy.json\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", " │   └── trace.dat\r\n", " ├── kernel.config\r\n", " ├── kernel.version\r\n", " └── platform.json\r\n", "\r\n", - "8 directories, 26 files\r\n" + "8 directories, 30 files\r\n" ] } ], @@ -409,7 +681,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, -- GitLab From 0b600f589031480581302bcfc1119ddd8a921488 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 23 Nov 2016 13:57:38 +0000 Subject: [PATCH 06/13] ipynb/profiling: Update kernel functions profiling notebook --- .../kernel_functions_profiling.ipynb | 571 +++++++++++------- 1 file changed, 363 insertions(+), 208 deletions(-) diff --git a/ipynb/profiling/kernel_functions_profiling.ipynb b/ipynb/profiling/kernel_functions_profiling.ipynb index 1ef7d1a6b..ce6bb64ed 100644 --- a/ipynb/profiling/kernel_functions_profiling.ipynb +++ b/ipynb/profiling/kernel_functions_profiling.ipynb @@ -15,6 +15,18 @@ "collapsed": true }, "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [ "import logging\n", "reload(logging)\n", @@ -28,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -53,7 +65,8 @@ "import pandas\n", "\n", "# Support to tests execution\n", - "from executor import Executor" + "from executor import Executor\n", + "from env import TestEnv" ] }, { @@ -65,11 +78,51 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "01:43:51 INFO : Target - Using base path: /home/bjackman/sources/lisa\n", + "01:43:51 INFO : Target - Loading custom (inline) target configuration\n", + "01:43:51 INFO : Target - Loading custom (inline) test configuration\n", + "01:43:51 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", + "01:43:51 INFO : Target - Connecting linux target:\n", + "01:43:51 INFO : Target - username : brendan\n", + "01:43:51 INFO : Target - host : 192.168.0.1\n", + "01:43:51 INFO : Target - password : \n", + "01:43:51 INFO : Target - Connection settings:\n", + "01:43:51 INFO : Target - {'username': 'brendan', 'host': '192.168.0.1', 'password': ''}\n", + "01:43:58 INFO : Target - Initializing target workdir:\n", + "01:43:58 INFO : Target - /home/brendan/devlib-target\n", + "01:44:04 INFO : Target - Topology:\n", + "01:44:04 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", + "01:44:07 INFO : Platform - Loading default EM:\n", + "01:44:07 INFO : Platform - /home/bjackman/sources/lisa/libs/utils/platforms/juno.json\n", + "01:44:11 INFO : FTrace - Enabled tracepoints:\n", + "01:44:11 INFO : FTrace - sched:*\n", + "01:44:11 INFO : FTrace - Kernel functions profiled:\n", + "01:44:11 INFO : FTrace - select_task_rq_fair\n", + "01:44:11 INFO : FTrace - enqueue_task_fair\n", + "01:44:11 INFO : FTrace - dequeue_task_fair\n", + "01:44:11 WARNING : Target - Using configuration provided RTApp calibration\n", + "01:44:11 INFO : Target - Using RT-App calibration values:\n", + "01:44:11 INFO : Target - {\"0\": 358, \"1\": 138, \"2\": 138, \"3\": 357, \"4\": 359, \"5\": 355}\n", + "01:44:11 WARNING : TestEnv - Wipe previous contents of the results folder:\n", + "01:44:11 WARNING : TestEnv - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n", + "01:44:11 INFO : HWMon - HWMON module not enabled\n", + "01:44:11 WARNING : HWMon - Energy sampling disabled by configuration\n", + "01:44:11 INFO : TestEnv - Set results folder to:\n", + "01:44:11 INFO : TestEnv - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n", + "01:44:11 INFO : TestEnv - Experiment results available also in:\n", + "01:44:11 INFO : TestEnv - /home/bjackman/sources/lisa/results_latest\n" + ] + } + ], "source": [ "# Setup a target configuration\n", "target_conf = {\n", @@ -80,7 +133,7 @@ "\n", " # Login credentials\n", " \"host\" : \"192.168.0.1\",\n", - " \"username\" : \"root\",\n", + " \"username\" : \"brendan\",\n", " \"password\" : \"\",\n", "\n", " # Local installation path\n", @@ -97,7 +150,16 @@ "\n", "}\n", "\n", - "tests_conf = {\n", + "test_conf = {\n", + " # Tools to deploy\n", + " \"tools\" : [ \"rt-app\", 'trace-cmd' ],\n", + " \n", + " # Where results are collected\n", + " # NOTE: this folder will be wiped before running the experiments\n", + " \"results_dir\" : \"KernelFunctionsProfilingExample\",\n", + "\n", + " # Modules required by these experiments\n", + " \"exclude_modules\" : [ \"hwmon\" ],\n", " \n", " # Kernel functions to profile for all the test\n", " # configurations which have the \"ftrace\" flag enabled\n", @@ -109,7 +171,42 @@ " ],\n", " \"buffsize\" : 80 * 1024,\n", " },\n", + "}\n", + "\n", + "env = TestEnv(target_conf, test_conf)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "01:50:59 INFO : Target - Loading custom (inline) test configuration\n", + "01:50:59 INFO : \n", + "01:50:59 INFO : ################################################################################\n", + "01:50:59 INFO : Executor - Experiments configuration\n", + "01:50:59 INFO : ################################################################################\n", + "01:50:59 INFO : Executor - Configured to run:\n", + "01:50:59 INFO : Executor - 2 target configurations:\n", + "01:50:59 INFO : Executor - base, eas\n", + "01:50:59 INFO : Executor - 1 workloads (3 iterations each)\n", + "01:50:59 INFO : Executor - rta\n", + "01:50:59 INFO : Executor - Total: 6 experiments\n", + "01:50:59 INFO : Executor - Results will be collected under:\n", + "01:50:59 INFO : Executor - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n" + ] + } + ], + "source": [ + "# Setup tests executions based on our configuration\n", " \n", + "tests_conf = {\n", " # Platform configurations to test\n", " \"confs\" : [\n", " {\n", @@ -138,7 +235,7 @@ " \"class\" : \"profile\",\n", " \"params\" : {\n", " \"p20\" : {\n", - " \"kind\" : \"periodic\",\n", + " \"kind\" : \"Periodic\",\n", " \"params\" : {\n", " \"duty_cycle_pct\" : 20,\n", " },\n", @@ -151,81 +248,9 @@ " \n", " # Number of iterations for each configuration/workload pair\n", " \"iterations\" : 3,\n", - " \n", - " # Tools to deploy\n", - " \"tools\" : [ \"rt-app\", 'trace-cmd' ],\n", - " \n", - " # Where results are collected\n", - " # NOTE: this folder will be wiped before running the experiments\n", - " \"results_dir\" : \"KernelFunctionsProfilingExample\",\n", - "\n", - " # Modules required by these experiments\n", - " \"exclude_modules\" : [ \"hwmon\" ],\n", + "}\n", "\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "03:43:22 INFO : Target - Loading custom (inline) test configuration\n", - "03:43:22 INFO : Target - Using base path: /home/derkling/Code/lisa\n", - "03:43:22 INFO : Target - Loading custom (inline) target configuration\n", - "03:43:22 INFO : Target - Loading custom (inline) test configuration\n", - "03:43:22 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", - "03:43:22 INFO : Target - Connecting linux target:\n", - "03:43:22 INFO : Target - username : root\n", - "03:43:22 INFO : Target - host : 192.168.0.1\n", - "03:43:22 INFO : Target - password : \n", - "03:43:26 INFO : Target - Initializing target workdir:\n", - "03:43:26 INFO : Target - /root/devlib-target\n", - "03:43:34 INFO : Target - Topology:\n", - "03:43:34 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", - "03:43:36 INFO : Platform - Loading default EM:\n", - "03:43:36 INFO : Platform - /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n", - "03:43:38 INFO : FTrace - Enabled tracepoints:\n", - "03:43:38 INFO : FTrace - sched:*\n", - "03:43:38 INFO : FTrace - Kernel functions profiled:\n", - "03:43:38 INFO : FTrace - select_task_rq_fair\n", - "03:43:38 INFO : FTrace - enqueue_task_fair\n", - "03:43:38 INFO : FTrace - dequeue_task_fair\n", - "03:43:38 INFO : EnergyMeter - HWMON module not enabled\n", - "03:43:38 WARNING : EnergyMeter - Energy sampling disabled by configuration\n", - "03:43:38 WARNING : Target - Using configuration provided RTApp calibration\n", - "03:43:38 INFO : Target - Using RT-App calibration values:\n", - "03:43:38 INFO : Target - {\"0\": 358, \"1\": 138, \"2\": 138, \"3\": 357, \"4\": 359, \"5\": 355}\n", - "03:43:38 WARNING : TestEnv - Wipe previous contents of the results folder:\n", - "03:43:38 WARNING : TestEnv - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n", - "03:43:38 INFO : TestEnv - Set results folder to:\n", - "03:43:38 INFO : TestEnv - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n", - "03:43:38 INFO : TestEnv - Experiment results available also in:\n", - "03:43:38 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n", - "03:43:38 INFO : \n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : Executor - Experiments configuration\n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : Executor - Configured to run:\n", - "03:43:38 INFO : Executor - 2 targt configurations:\n", - "03:43:38 INFO : Executor - base, eas\n", - "03:43:38 INFO : Executor - 1 workloads (3 iterations each)\n", - "03:43:38 INFO : Executor - rta\n", - "03:43:38 INFO : Executor - Total: 6 experiments\n", - "03:43:38 INFO : Executor - Results will be collected under:\n", - "03:43:38 INFO : Executor - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" - ] - } - ], - "source": [ - "# Setup tests executions based on our configuration\n", - "executor = Executor(target_conf, tests_conf)" + "executor = Executor(env, tests_conf)" ] }, { @@ -237,110 +262,216 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "metadata": { "collapsed": false, - "scrolled": false + "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "03:43:38 INFO : \n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : Executor - Experiments execution\n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : \n", - "03:43:38 INFO : ================================================================================\n", - "03:43:38 INFO : TargetConfig - configuring target for [base] experiments\n", - "03:43:39 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", - "03:43:39 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "03:43:40 INFO : WlGen - Setup new workload rta\n", - "03:43:40 INFO : RTApp - Workload duration defined by longest task\n", - "03:43:40 INFO : RTApp - Default policy: SCHED_OTHER\n", - "03:43:40 INFO : RTApp - ------------------------\n", - "03:43:40 INFO : RTApp - task [task_p20], sched: using default policy\n", - "03:43:40 INFO : RTApp - | calibration CPU: 1\n", - "03:43:40 INFO : RTApp - | loops count: 1\n", - "03:43:40 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "03:43:40 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "03:43:40 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "03:43:41 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:43:41 INFO : Executor - Experiment 1/6, [base:rta] 1/3\n", - "03:43:41 WARNING : Executor - FTrace events collection enabled\n", - "03:43:46 INFO : WlGen - Workload execution START:\n", - "03:43:46 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:43:51 INFO : Executor - Collected FTrace binary trace:\n", - "03:43:51 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", - "03:43:52 INFO : Executor - Collected FTrace function profiling:\n", - "03:43:52 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", - "03:43:52 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:43:52 INFO : Executor - Experiment 2/6, [base:rta] 2/3\n", - "03:43:52 WARNING : Executor - FTrace events collection enabled\n", - "03:43:58 INFO : WlGen - Workload execution START:\n", - "03:43:58 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:02 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:02 INFO : Executor - /rtapp:base:rta/2/trace.dat\n", - "03:44:03 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:03 INFO : Executor - /rtapp:base:rta/2/trace_stat.json\n", - "03:44:03 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:03 INFO : Executor - Experiment 3/6, [base:rta] 3/3\n", - "03:44:03 WARNING : Executor - FTrace events collection enabled\n", - "03:44:09 INFO : WlGen - Workload execution START:\n", - "03:44:09 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:14 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:14 INFO : Executor - /rtapp:base:rta/3/trace.dat\n", - "03:44:14 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:14 INFO : Executor - /rtapp:base:rta/3/trace_stat.json\n", - "03:44:14 INFO : \n", - "03:44:14 INFO : ================================================================================\n", - "03:44:14 INFO : TargetConfig - configuring target for [eas] experiments\n", - "03:44:15 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", - "03:44:15 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "03:44:16 INFO : WlGen - Setup new workload rta\n", - "03:44:16 INFO : RTApp - Workload duration defined by longest task\n", - "03:44:16 INFO : RTApp - Default policy: SCHED_OTHER\n", - "03:44:16 INFO : RTApp - ------------------------\n", - "03:44:16 INFO : RTApp - task [task_p20], sched: using default policy\n", - "03:44:16 INFO : RTApp - | calibration CPU: 1\n", - "03:44:16 INFO : RTApp - | loops count: 1\n", - "03:44:16 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "03:44:16 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "03:44:16 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "03:44:16 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:16 INFO : Executor - Experiment 4/6, [eas:rta] 1/3\n", - "03:44:16 WARNING : Executor - FTrace events collection enabled\n", - "03:44:22 INFO : WlGen - Workload execution START:\n", - "03:44:22 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:28 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:28 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", - "03:44:28 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:28 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", - "03:44:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:28 INFO : Executor - Experiment 5/6, [eas:rta] 2/3\n", - "03:44:28 WARNING : Executor - FTrace events collection enabled\n", - "03:44:34 INFO : WlGen - Workload execution START:\n", - "03:44:34 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:40 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:40 INFO : Executor - /rtapp:eas:rta/2/trace.dat\n", - "03:44:40 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:40 INFO : Executor - /rtapp:eas:rta/2/trace_stat.json\n", - "03:44:40 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:40 INFO : Executor - Experiment 6/6, [eas:rta] 3/3\n", - "03:44:40 WARNING : Executor - FTrace events collection enabled\n", - "03:44:46 INFO : WlGen - Workload execution START:\n", - "03:44:46 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:52 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:52 INFO : Executor - /rtapp:eas:rta/3/trace.dat\n", - "03:44:52 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:52 INFO : Executor - /rtapp:eas:rta/3/trace_stat.json\n", - "03:44:52 INFO : \n", - "03:44:52 INFO : ################################################################################\n", - "03:44:52 INFO : Executor - Experiments execution completed\n", - "03:44:52 INFO : ################################################################################\n", - "03:44:52 INFO : Executor - Results available in:\n", - "03:44:52 INFO : Executor - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" + "01:51:01 INFO : \n", + "01:51:01 INFO : ################################################################################\n", + "01:51:01 INFO : Executor - Experiments execution\n", + "01:51:01 INFO : ################################################################################\n", + "01:51:01 INFO : \n", + "01:51:01 INFO : ================================================================================\n", + "01:51:01 INFO : TargetConfig - configuring target for [base] experiments\n", + "01:51:03 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", + "01:51:04 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "01:51:05 INFO : WlGen - Setup new workload rta\n", + "01:51:05 INFO : RTApp - Workload duration defined by longest task\n", + "01:51:05 INFO : RTApp - Default policy: SCHED_OTHER\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p200], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p201], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p202], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p203], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p204], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p205], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:06 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:51:06 INFO : Executor - Experiment 0/6, [base:rta] 1/3\n", + "01:51:06 WARNING : Executor - FTrace events collection enabled\n", + "01:51:17 INFO : WlGen - Workload execution START:\n", + "01:51:17 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:51:30 INFO : Executor - Collected FTrace binary trace:\n", + "01:51:30 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "01:51:31 INFO : Executor - Collected FTrace function profiling:\n", + "01:51:31 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "01:51:31 INFO : --------------------------------------------------------------------------------\n", + "01:51:31 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:51:31 INFO : Executor - Experiment 1/6, [base:rta] 2/3\n", + "01:51:31 WARNING : Executor - FTrace events collection enabled\n", + "01:51:43 INFO : WlGen - Workload execution START:\n", + "01:51:43 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:51:52 INFO : Executor - Collected FTrace binary trace:\n", + "01:51:52 INFO : Executor - /rtapp:base:rta/2/trace.dat\n", + "01:51:53 INFO : Executor - Collected FTrace function profiling:\n", + "01:51:53 INFO : Executor - /rtapp:base:rta/2/trace_stat.json\n", + "01:51:53 INFO : --------------------------------------------------------------------------------\n", + "01:51:53 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:51:53 INFO : Executor - Experiment 2/6, [base:rta] 3/3\n", + "01:51:53 WARNING : Executor - FTrace events collection enabled\n", + "01:52:05 INFO : WlGen - Workload execution START:\n", + "01:52:05 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:52:19 INFO : Executor - Collected FTrace binary trace:\n", + "01:52:19 INFO : Executor - /rtapp:base:rta/3/trace.dat\n", + "01:52:20 INFO : Executor - Collected FTrace function profiling:\n", + "01:52:20 INFO : Executor - /rtapp:base:rta/3/trace_stat.json\n", + "01:52:20 INFO : --------------------------------------------------------------------------------\n", + "01:52:20 INFO : \n", + "01:52:20 INFO : ================================================================================\n", + "01:52:20 INFO : TargetConfig - configuring target for [eas] experiments\n", + "01:52:22 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", + "01:52:23 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "01:52:24 INFO : WlGen - Setup new workload rta\n", + "01:52:24 INFO : RTApp - Workload duration defined by longest task\n", + "01:52:24 INFO : RTApp - Default policy: SCHED_OTHER\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p200], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p201], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p202], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p203], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p204], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p205], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:52:24 INFO : Executor - Experiment 0/6, [base:rta] 1/3\n", + "01:52:24 WARNING : Executor - FTrace events collection enabled\n", + "01:52:37 INFO : WlGen - Workload execution START:\n", + "01:52:37 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:52:47 INFO : Executor - Collected FTrace binary trace:\n", + "01:52:47 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "01:52:48 INFO : Executor - Collected FTrace function profiling:\n", + "01:52:48 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "01:52:48 INFO : --------------------------------------------------------------------------------\n", + "01:52:48 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:52:48 INFO : Executor - Experiment 1/6, [base:rta] 2/3\n", + "01:52:48 WARNING : Executor - FTrace events collection enabled\n", + "01:53:00 INFO : WlGen - Workload execution START:\n", + "01:53:00 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:53:12 INFO : Executor - Collected FTrace binary trace:\n", + "01:53:12 INFO : Executor - /rtapp:base:rta/2/trace.dat\n", + "01:53:13 INFO : Executor - Collected FTrace function profiling:\n", + "01:53:13 INFO : Executor - /rtapp:base:rta/2/trace_stat.json\n", + "01:53:13 INFO : --------------------------------------------------------------------------------\n", + "01:53:13 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:53:13 INFO : Executor - Experiment 2/6, [base:rta] 3/3\n", + "01:53:13 WARNING : Executor - FTrace events collection enabled\n", + "01:53:25 INFO : WlGen - Workload execution START:\n", + "01:53:25 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:53:35 INFO : Executor - Collected FTrace binary trace:\n", + "01:53:35 INFO : Executor - /rtapp:base:rta/3/trace.dat\n", + "01:53:36 INFO : Executor - Collected FTrace function profiling:\n", + "01:53:36 INFO : Executor - /rtapp:base:rta/3/trace_stat.json\n", + "01:53:36 INFO : --------------------------------------------------------------------------------\n", + "01:53:36 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:53:36 INFO : Executor - Experiment 3/6, [eas:rta] 1/3\n", + "01:53:36 WARNING : Executor - FTrace events collection enabled\n", + "01:53:48 INFO : WlGen - Workload execution START:\n", + "01:53:48 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:53:57 INFO : Executor - Collected FTrace binary trace:\n", + "01:53:57 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", + "01:53:58 INFO : Executor - Collected FTrace function profiling:\n", + "01:53:58 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", + "01:53:58 INFO : --------------------------------------------------------------------------------\n", + "01:53:58 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:53:58 INFO : Executor - Experiment 4/6, [eas:rta] 2/3\n", + "01:53:58 WARNING : Executor - FTrace events collection enabled\n", + "01:54:10 INFO : WlGen - Workload execution START:\n", + "01:54:10 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:54:22 INFO : Executor - Collected FTrace binary trace:\n", + "01:54:22 INFO : Executor - /rtapp:eas:rta/2/trace.dat\n", + "01:54:23 INFO : Executor - Collected FTrace function profiling:\n", + "01:54:23 INFO : Executor - /rtapp:eas:rta/2/trace_stat.json\n", + "01:54:23 INFO : --------------------------------------------------------------------------------\n", + "01:54:23 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:54:23 INFO : Executor - Experiment 5/6, [eas:rta] 3/3\n", + "01:54:23 WARNING : Executor - FTrace events collection enabled\n", + "01:54:35 INFO : WlGen - Workload execution START:\n", + "01:54:35 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:54:45 INFO : Executor - Collected FTrace binary trace:\n", + "01:54:45 INFO : Executor - /rtapp:eas:rta/3/trace.dat\n", + "01:54:46 INFO : Executor - Collected FTrace function profiling:\n", + "01:54:46 INFO : Executor - /rtapp:eas:rta/3/trace_stat.json\n", + "01:54:46 INFO : --------------------------------------------------------------------------------\n", + "01:54:46 INFO : \n", + "01:54:46 INFO : ################################################################################\n", + "01:54:46 INFO : Executor - Experiments execution completed\n", + "01:54:46 INFO : ################################################################################\n", + "01:54:46 INFO : Executor - Results available in:\n", + "01:54:46 INFO : Executor - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n" ] } ], @@ -351,19 +482,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" - ] - } - ], + "outputs": [], "source": [ "res_dir = \"/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\"\n", "out_dir = \"/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample/rtapp:eas:rta/2/trace.dat\"\n", @@ -373,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": { "collapsed": false, "scrolled": false @@ -383,31 +506,46 @@ "name": "stderr", "output_type": "stream", "text": [ - "03:44:52 INFO : Content of the output folder /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" + "01:56:21 INFO : Content of the output folder /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[01;34m/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\u001b[00m\r\n", + "\u001b[01;34m/home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\u001b[00m\r\n", "├── \u001b[01;34mrtapp:base:rta\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", + "│   │   ├── rt-app-task_p201-1.log\r\n", + "│   │   ├── rt-app-task_p202-2.log\r\n", + "│   │   ├── rt-app-task_p203-3.log\r\n", + "│   │   ├── rt-app-task_p204-4.log\r\n", + "│   │   ├── rt-app-task_p205-5.log\r\n", "│   │   ├── trace.dat\r\n", "│   │   └── trace_stat.json\r\n", "│   ├── \u001b[01;34m2\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", + "│   │   ├── rt-app-task_p201-1.log\r\n", + "│   │   ├── rt-app-task_p202-2.log\r\n", + "│   │   ├── rt-app-task_p203-3.log\r\n", + "│   │   ├── rt-app-task_p204-4.log\r\n", + "│   │   ├── rt-app-task_p205-5.log\r\n", "│   │   ├── trace.dat\r\n", "│   │   └── trace_stat.json\r\n", "│   ├── \u001b[01;34m3\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", + "│   │   ├── rt-app-task_p201-1.log\r\n", + "│   │   ├── rt-app-task_p202-2.log\r\n", + "│   │   ├── rt-app-task_p203-3.log\r\n", + "│   │   ├── rt-app-task_p204-4.log\r\n", + "│   │   ├── rt-app-task_p205-5.log\r\n", "│   │   ├── trace.dat\r\n", "│   │   └── trace_stat.json\r\n", "│   ├── kernel.config\r\n", @@ -417,26 +555,41 @@ " ├── \u001b[01;34m1\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", + " │   ├── rt-app-task_p201-1.log\r\n", + " │   ├── rt-app-task_p202-2.log\r\n", + " │   ├── rt-app-task_p203-3.log\r\n", + " │   ├── rt-app-task_p204-4.log\r\n", + " │   ├── rt-app-task_p205-5.log\r\n", " │   ├── trace.dat\r\n", " │   └── trace_stat.json\r\n", " ├── \u001b[01;34m2\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", + " │   ├── rt-app-task_p201-1.log\r\n", + " │   ├── rt-app-task_p202-2.log\r\n", + " │   ├── rt-app-task_p203-3.log\r\n", + " │   ├── rt-app-task_p204-4.log\r\n", + " │   ├── rt-app-task_p205-5.log\r\n", " │   ├── trace.dat\r\n", " │   └── trace_stat.json\r\n", " ├── \u001b[01;34m3\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", + " │   ├── rt-app-task_p201-1.log\r\n", + " │   ├── rt-app-task_p202-2.log\r\n", + " │   ├── rt-app-task_p203-3.log\r\n", + " │   ├── rt-app-task_p204-4.log\r\n", + " │   ├── rt-app-task_p205-5.log\r\n", " │   ├── trace.dat\r\n", " │   └── trace_stat.json\r\n", " ├── kernel.config\r\n", " ├── kernel.version\r\n", " └── platform.json\r\n", "\r\n", - "8 directories, 36 files\r\n" + "8 directories, 66 files\r\n" ] } ], @@ -456,7 +609,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": { "collapsed": false, "scrolled": false @@ -507,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -543,7 +696,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -562,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": { "collapsed": false, "scrolled": false @@ -572,16 +725,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "03:44:53 INFO : Plotting stats for [dequeue_task_fair] function\n", - "03:44:53 INFO : Plotting stats for [enqueue_task_fair] function\n", - "03:44:53 INFO : Plotting stats for [select_task_rq_fair] function\n" + "01:56:33 INFO : Plotting stats for [dequeue_task_fair] function\n", + "01:56:33 INFO : Plotting stats for [enqueue_task_fair] function\n", + "01:56:33 INFO : Plotting stats for [select_task_rq_fair] function\n", + "/usr/lib/pymodules/python2.7/matplotlib/collections.py:548: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if self._edgecolors == 'face':\n" ] }, { "data": { - "image/png": "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\nqwKqWu8aAAAAmBtVtX8WNQIAAFis1q5dm/Xr1/cuY95as2ZN7r777kfVxhlSAACAvTA809e7jHlr\nd+/Pns6QznqVXQAAANgXAikAAABdCKQAAAB0IZACAADQhUAKAABAFwIpAADAPlq1am2qas4eq1at\n7f0S55TbvgAAAOyFmW5rUlVJ5jLPLJxbzbjtCwAAwAHq3nvvzTnnnJNjjjkmJ510Ut773vcmSW65\n5ZY861nPylFHHZXVq1fnoosuyo4dO6bave51r8vKlStzxBFH5GlPe1rWrVu332oWSAEAABa41lrO\nOuusnHbaabn33ntzww035D3veU8++9nPZunSpXn3u9+diYmJfPGLX8yNN96Y97///UmS66+/Pjfd\ndFO+8Y1v5L777svHP/7xrFixYr/VLZACAAAscLfccku+973v5dJLL81BBx2UtWvX5lWvelWuvvrq\nnHbaaTn99NNTVTnhhBPy6le/Op/73OeSJAcffHDuv//+rFu3Lq21nHzyyVm5cuV+q3vpfhsJAACA\nObF+/fps3Lgxy5cvTzJ5xnTnzp157nOfmzvvvDOvf/3rc+utt+YHP/hBduzYkac//elJkuc973m5\n8MIL89rXvjYbNmzIi1/84lx++eU57LDD9kvdzpACAAAscMcff3ye+MQnZmJiIhMTE9myZUvuu+++\nXHfddXnNa16TU045JXfddVe2bt2at73tbT+2+NCFF16YW2+9NevWrcsdd9yRd77znfutboEUAABg\ngTv99NNz+OGH5x3veEcefPDBPPTQQ/nKV76SW2+9Ndu3b8+yZcty6KGH5mtf+1quuOKKqXa33npr\nbr755uzYsSOHHHJIHve4x2XJkv0XEwVSAACAfbRy5ZokNWePyf4f2ZIlS/LpT386t912W0488cQc\nc8wxOf/887Nt27Zcfvnl+ehHP5ply5blggsuyLnnnjvVbtu2bTn//POzfPnynHjiiTn66KPzhje8\nYdbvy95yH1IAAIC9sLv7bDLJfUgBAABYMARSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQ\nSAEAAOhCIAUAAKALgRQAAGAROPHEE3PjjTf2LuNREUgBAAD20arjVqWq5uyx6rhVvV/inFrauwAA\nAICFavPGzcnYHPY/tnnuOp8HnCEFAABYJG6++eY85SlPyYoVK/LKV74yP/zhD7N169acddZZOeaY\nY7JixYqcddZZ2bhx41Sb3//9389JJ52UZcuW5aSTTspVV1019dwHP/jBPPnJT86KFSvywhe+MBs2\nbBhpvQIpAADAIvGxj30sn/3sZ3PXXXfljjvuyFvf+ta01vKKV7wi99xzTzZs2JBDDz00F154YZLk\ngQceyMUXX5zPfOYz2bZtW77whS/k1FNPTZJ86lOfytvf/vZ88pOfzHe/+9085znPyUtf+tKR1iuQ\nAgAALBIXXXRRjj322Bx55JG59NJLc9VVV+Woo47KL/zCL+Sxj31sHv/4x+eSSy7J5z//+ak2Bx10\nUG6//fY8+OCDWblyZU455ZQkyZVXXplLLrkkT3rSk7JkyZK88Y1vzG233ZZ77rlnZPUKpAAAAIvE\ncccdN7W9Zs2afPvb386DDz6YCy64IGvXrs2RRx6ZM844I1u3bk1rLYceemiuueaaXHHFFXnCE56Q\ns846K1//+teTJOvXr8/FF1+c5cuXZ/ny5VmxYkWq6sem+86WQAoAALBITD97uX79+hx77LG5/PLL\nc+edd+aWW27J1q1bp86OttaSJGeeeWauv/76bNq0KSeffHLOP//8JMnxxx+fK6+8MhMTE5mYmMiW\nLVuyffv2PPOZzxxZvQIpAADAIvG+970vGzduzMTERC677LK85CUvyfbt23PIIYdk2bJlmZiYyNjY\n2NTx3/nOd3LttdfmgQceyMEHH5zDDjssS5ZMxsRf+qVfymWXXZZ169YlSe6777584hOfGGm9bvsC\nAACwj1auXjmnt2ZZuXrlXh9bVTnvvPPyghe8IPfee2/OPvvsvOlNb8qWLVty3nnn5eijj87q1avz\nq7/6q7n22muTJDt37sy73vWuvOxlL0tV5dRTT80VV1yRJDn77LPz/e9/P+eee242bNiQI444Imee\neWbOOeeckb2+evg0bS9V1XrXAAAA8EiqKrLL7u3u/Rnur5namLILAABAFwIpAAAAXQikAAAAdCGQ\nAgAA0IVACgAAQBcCKQAAAF24DykAAMBeWLNmTapmvHsJmXx/Hi33IQUAAGDOuA8pAAAA844puwDA\nojQ+Pp7x8fGp7cFgkCQZDAZT2wD0ZcouALDoDaeL9S4D4IBkyi4AAADzjkAKAABAFwIpAAAAXQik\nAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANDFrANpVR1XVTdW1Veq6vaqumi4/81V\n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\n7GezdOnSvPvd787ExES++MUv5sYbb8z73//+JMn111+fm266Kd/4xjdy33335eMf/3hWrFix3+oW\nSAEAABa4W265Jd/73vdy6aWX5qCDDsratWvzqle9KldffXVOO+20nH766amqnHDCCXn1q1+dz33u\nc0mSgw8+OPfff3/WrVuX1lpOPvnkrFy5cr/VvXS/jQQAAMCcWL9+fTZu3Jjly5cnmTxjunPnzjz3\nuc/NnXfemde//vW59dZb84Mf/CA7duzI05/+9CTJ8573vFx44YV57Wtfmw0bNuTFL35xLr/88hx2\n2GH7pW5nSAEAABa4448/Pk984hMzMTGRiYmJbNmyJffdd1+uu+66vOY1r8kpp5ySu+66K1u3bs3b\n3va2H1sN98ILL8ytt96adevW5Y477sg73/nO/Va3QAoAALDAnX766Tn88MPzjne8Iw8++GAeeuih\nfOUrX8mtt96a7du3Z9myZTn00EPzta99LVdcccVUu1tvvTU333xzduzYkUMOOSSPe9zjsmTJ/ouJ\nAikAAMA+WrlyTZKas8dk/49syZIl+fSnP53bbrstJ554Yo455picf/752bZtWy6//PJ89KMfzbJl\ny3LBBRfk3HPPnWq3bdu2nH/++Vm+fHlOPPHEHH300XnDG94w6/dlb1Xvm6xWVetdAwAAwCOpqsgu\nu7e792e4v2Zq4wwpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoA\nAEAXS3sXAAAAMJfGx8czPj4+tT0YDJIkg8FgantfrTpuVTZv3Dy7Avdg5eqV2fStTXt17IknnpgP\nfOADef7znz9n9Yxatdb6FlDVetcAAAAcGKoq+5o/ZmpbVcnYCArbnbHsdb29A+nu3tvh/pqpjSm7\nAAAAdCGQAgAALBI333xznvKUp2TFihV55StfmR/+8IfZunVrzjrrrBxzzDFZsWJFzjrrrGzcuHGq\nze///u/npJNOyrJly3LSSSflqquumnrugx/8YJ785CdnxYoVeeELX5gNGzaMtF6BFAAAYJH42Mc+\nls9+9rO56667cscdd+Stb31rWmt5xStekXvuuScbNmzIoYcemgsvvDBJ8sADD+Tiiy/OZz7zmWzb\nti1f+MIXcuqppyZJPvWpT+Xtb397PvnJT+a73/1unvOc5+SlL33pSOsVSAEAABaJiy66KMcee2yO\nPPLIXHrppbnqqqty1FFH5Rd+4Rfy2Mc+No9//ONzySWX5POf//xUm4MOOii33357HnzwwaxcuTKn\nnHJKkuTKK6/MJZdckic96UlZsmRJ3vjGN+a2227LPffcM7J6BVIAAIBF4rjjjpvaXrNmTb797W/n\nwQcfzAUXXJC1a9fmyCOPzBlnnJGtW7emtZZDDz0011xzTa644oo84QlPyFlnnZWvf/3rSZL169fn\n4osvzvLly7N8+fKsWLEiVfVj031nSyAFAABYJKafvVy/fn2OPfbYXH755bnzzjtzyy23ZOvWrVNn\nRx9eEffMM8/M9ddfn02bNuXkk0/O+eefnyQ5/vjjc+WVV2ZiYiITExPZsmVLtm/fnmc+85kjq1cg\nBQAAWCTe9773ZePGjZmYmMhll12Wl7zkJdm+fXsOOeSQLFu2LBMTExkbG5s6/jvf+U6uvfbaPPDA\nAzn44INz2GGHZcmSyZj4S7/0S7nsssuybt26JMl9992XT3ziEyOtd+koOqmqDyR5UZLNrbWnTtt/\nUZJfTrIjyZ+01t44ivEAAADmg5WrV2bz2OY57X9vVVXOO++8vOAFL8i9996bs88+O29605uyZcuW\nnHfeeTn66KOzevXq/Oqv/mquvfbaJMnOnTvzrne9Ky972ctSVTn11FNzxRVXJEnOPvvsfP/738+5\n556bDRs25IgjjsiZZ56Zc845Z2Svr/b1prA/1knVzybZnuS/PxxIq2qQ5DeS/MvW2o6qOrq19r0Z\n2rZR1AAAAPBIqir7mj9m0/ZAsLv3Z7i/Zmozkim7rbWbkmzZZfdrkry9tbZjeMw/CKMAAAAcuOby\nGtInJXluVf1lVf15VT1jDscCAABggRnJNaR76Puo1tozq+pnknw8yRNnOnD6RbWDwSCDwWAOywIA\nAGCujI+PZ3x8fK+OHck1pElSVf8/e/ceL3ld33n+/YH2AiJXhz5KSzeS0SFmDcYsceOqpQ4xmkFJ\n1iTIZryGmKwoo8ZVNLMeNoZxlI26meg6j3gf0aizUchmIiqWrppEiDISWvEy2o0I7aW5iEgU+e4f\np/rk2Hu6abp/db6nznk+H4968DtVv/r9vnWorupX/26bk1y85BjSv0ry71trH5/8/JUkv9Ba++5u\nz3MMKQAAsCIcQzo93Y4h3bWeyW2XDyR57GQAD0xyt91jFAAAgPVrqMu+XJhklOSYqtqe5BVJ3pLk\n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\nnj7EugBgpVTVmVX1vaq6ecnte1V15Qqt/692W/+u6ZfexeVs2sPruHnyHQ4AXQyyy25VvS8Lx9Ec\nkeRFk112b2itHbVknp2ttaP3uBAAAADWlQO+DmlV/UqSHa21K6pqtJdZly3fqnIyBAAAgDWstbbs\nGdoPOEiTPCLJk6rqiUkOSXLvqnpnkuuramNrbUdVzSX51l4GN8Aw1r75+fnMz8/3HgZriPcUQ/J+\nYmjeUwzNe4qheU/tm6o9Xy3sgI8hba29rLV2fGvtAUnOSHJpa+1fZ+F098+YzPb0LJymHwAAAJJM\n9zqkr0pyalVdneRxk58BAAAgyTC77C5qrX08yccn0zuT/Mshl7/ejUaj3kNgjfGeYkjeTwzNe4qh\neU8xNO+pAzfIWXYPaABVrfcYAAAAmI6qmupJjQCYMePxOOPxeHF617/wjkYj/9oLAHuwZcuWbNu2\nrfcwVq3Nmzfn61//+l16ji2kAOvc5F8tew8DAFY935l7t6ffz962kE7zpEYAAACwR4IUAACALgQp\nAAAAXQhSAAAAuhCkAAAA+2lubkuqamq3ubktvV/iVDnLLsA654yBALBvlvvOrKok0/wenZ3vaWfZ\nBQAAWKeuu+66POUpT8mxxx6bE088MX/yJ3+SJLnsssvyi7/4iznqqKNy3HHH5XnPe15uv/32xee9\n4AUvyMaNG3PEEUfkZ3/2Z7N169YVG7MgBQAAmHGttZx22ml56EMfmuuuuy4f/ehH8/rXvz4f/vCH\ns2HDhrzuda/Lzp078zd/8ze59NJL84Y3vCFJcskll+STn/xkvvKVr+Smm27Ke9/73hxzzDErNm5B\nCgAAMOMuu+yyfOc738nLX/7yHHzwwdmyZUt++7d/O+95z3vy0Ic+NKecckqqKscff3x+53d+Jx//\n+MeTJHe7293yve99L1u3bk1rLQ960IOycePGFRv3hhVbEwAAAFOxbdu2XHvttTn66KOTLGwxveOO\nO/KoRz0qX/7yl/PCF74wl19+eX7wgx/k9ttvz8Me9rAkyWMe85icffbZee5zn5vt27fn137t13LB\nBRfksMMOW5Fx20IKAAAw4+5///vnAQ94QHbu3JmdO3fmhhtuyE033ZSLL744v/d7v5eTTjopX/3q\nV3PjjTfmj/7oj37i5ENnn312Lr/88mzdujVXX311XvOa16zYuAUpAADAjDvllFNy73vfO69+9atz\n22235cc//nGuuuqqXH755bnlllty+OGH59BDD80Xv/jFvPGNb1x83uWXX57PfOYzuf3223PIIYfk\nnve8Zw46aOUyUZACAADsp40bNyepqd0Wln/nDjrooPzlX/5lrrjiipxwwgk59thjc9ZZZ+Xmm2/O\nBRdckHe96105/PDD85znPCdnnHHG4vNuvvnmnHXWWTn66KNzwgkn5D73uU9e/OIXH/DvZV+5DinA\nOuc6pACwb3xn7p3rkAIAADAzBCkAAABdCFIAAAC6EKQAAAB0IUgBAADoQpACAADQhSAFAACgC0EK\nAABAF4IUAABgDTjhhBNy6aWX9h7GXSJIAQAA9tPcprlU1dRuc5vmer/EqdrQewAAAACzase1O5L5\nKS5/fsf0Fr4K2EIKAACwRnzmM5/Jgx/84BxzzDF59rOfnR/+8Ie58cYbc9ppp+XYY4/NMccck9NO\nOy3XXnvt4nPe9ra35cQTT8zhhx+eE088Me9+97sXH3vLW96Sn/7pn84xxxyTJzzhCdm+ffug4xWk\nAAAAa8SFF16YD3/4w/nqV7+aq6++Oq985SvTWsuznvWsXHPNNdm+fXsOPfTQnH322UmSW2+9Neec\nc04+9KEP5eabb86nP/3pnHzyyUmSD37wg3nVq16VD3zgA/n2t7+dRz7ykXnqU5866HgFKQAAwBrx\nvOc9L/e73/1y5JFH5uUvf3ne/e5356ijjsqv/uqv5h73uEfuda975dxzz80nPvGJxeccfPDBufLK\nK3Pbbbdl48aNOemkk5Ikb3rTm3LuuefmgQ98YA466KC89KUvzRVXXJFrrrlmsPEKUgAAgDVi06ZN\ni9ObN2/ON7/5zdx22215znOeky1btuTII4/Mox/96Nx4441preXQQw/Nn//5n+eNb3xj7nvf++a0\n007Ll770pSTJtm3bcs455+Too4/O0UcfnWOOOSZV9RO7+x4oQQoAALBGLN16uW3bttzvfvfLBRdc\nkC9/+cu57LLLcuONNy5uHW2tJUlOPfXUXHLJJbn++uvzoAc9KGeddVaS5P73v3/e9KY3ZefOndm5\nc2duuOGG3HLLLXn4wx8+2HgFKQAAwBrxp3/6p7n22muzc+fOnH/++fnN3/zN3HLLLTnkkENy+OGH\nZ+fOnZmfn1+c/1vf+lYuuuii3Hrrrbnb3e6Www47LAcdtJCJv/u7v5vzzz8/W7duTZLcdNNNef/7\n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\nXiwWSZLFYnG4DcDFtPpbo458bfQfIQIpwFgCKQBwlm4WSJ2yCwAAwBACKQAAAEMIpAAAAAwhkAIA\nADCEQAoAAMAQAikAAABDCKQAAAAMIZACAAAwhEAKAADAEAIpAAAAQwikAAAADCGQAgAAMIRACgAA\nwBACKQAAAEMIpAAAAAwhkAIAADCEQAoAAMAQAikAAABDCKQAAAAMIZACAAAwhEAKAADAEAIpAAAA\nQwikAAAADCGQAgAAMIRACgAAwBACKQAAAEOcKpBW1U9X1Uer6pGqes51r726qu6vqvuq6kWnK5Mk\nWS6Xo0tgy+hTTEl/Ymr6FFPTp5iaPnV6p50h/UiSn0ry3vWdVfXMJC9N8swkP5rkD6uqTvleF54O\nz9T0KaakPzE1fYqp6VNMTZ86vVMF0u7+ZHffn+T6sHl3knu6+6vd/Zkk9ye58zTvBQAAwHY5q2tI\nLyV5cO35w6t9AAAAkCSp7r75F1T9fZKd9V1JOslruvvtq695T5Jf7+4Prp7/fpJ/7u43r56/Psk7\nuvvPj2j/5gUAAACw0br7yEs4H3eMb3zhLbzfw0meuvb88mrfsQsDAABgu015yu56sLw3ycuq6vFV\n9fQkz0jy/gnfCwAAgA132mVfXlJVDyZ5XpK/qqq/SZLu/niSP0vy8STvSPJL/VjnBgMAAHChPOY1\npAAAAHAWzuouuwAAAHBTAikAAABDPOZddhmjqr4zyd352vqtDye5t7vvG1cVwNesxqlLSf61u7+4\ntv+u7v7bcZWxqarq+Uk+390fr6oXJHlukg9197sGl8YWqKo/7u6fHV0H26OqfiDJnUk+2t3vHF3P\npnIN6QxV1SuTvDzJPUkeWu2+nORlSe7p7teOqo3tVFW/0N1vHF0Hm6OqfjXJLye5L8mzk7yiu9+2\neu2D3f2ckfWxearqt5P8cA7O3lom+cEkf53khTn4QPZ3x1XHpqmqe6/fleSHkrw7Sbr7J8+9KDZe\nVb2/u+9cbf9iDo6Df5HkRUne7m/0WyOQzlBVfSrJd3X3/123//FJPtbd3z6mMrZVVf1ndz9tdB1s\njqr6SJLv7+4vVtWVJG9N8ifd/bqq+vfu/t6hBbJxqupjSZ6V5BuSXE1yubu/UFXfmORfuvt7hhbI\nRqmqD+ZgtYfXJ+kcBNI/zcGH++nu946rjk21fnyrqg8k+bHu/lxVfVMOxqnvHlvhZnLK7jw9muTb\nkjxw3f6nrF6DE6uqD9/opSQ751kLW+G2a6fpdvdnqmqR5K1VdUe+fl1qOK6vdPcjSb5UVf/R3V9I\nku7+clU59nFSz03yiiSvSfIb3f2hqvqyIMop3VZVT8rBmRy3d/fnkqS7/6eqvjq2tM0lkM7TryV5\nV1Xdn+TB1b6nJXlGkl8ZVhWbbifJi5N8/rr9leSfzr8cNtx+VT27uz+UJKuZ0p9I8kdJfELMrfhK\nVT2hu7+U5Puu7ayqJ+ZghguOrbsfTfJ7VfWW1b/78Xcvp/fEJP+Wg7+duqqe0t2frapvjg9jb5lT\ndmeqqm7LwUXS6zc1+sDq02M4sap6Q5I3dvf7jnjtzd39MwPKYkNV1eUkX+3uq0e89vzu/scBZbHB\nquobuvt/j9j/rUme0t0fGVAWW6KqfjzJ87v7N0fXwvapqick2enuT4+uZRMJpAAAAAxhHVIAAACG\nEEgBAAAYQiAFAABgCIEUAACAIf4f23eMRvyrGDIAAAAASUVORK5CYII=\n", + "image/png": "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\n5I477siaNWvyyU9+Mknyta99LbfffnseeeSRjIyM5JZbbslhhx027fUKmwAAAD3gzjvvzJNPPplL\nL7008+bNy+LFi/POd74zn/nMZ3LKKafktNNOy5w5c3LcccdlxYoVWbt2bZLkgAMOyOjoaL7zne9k\n+/btOeGEE3LUUUdNe73zpv0KAAAAtG3Dhg3ZtGlTBgYGxvY9//zzOf300/PII4/koosuyt13351n\nnnkmP/vZz3LqqacmSc4888ysXLky73nPe7Jhw4a8/vWvz1VXXZW+vr5prVfPJgAAQA849thjs3jx\n4gwPD489tmzZkttuuy3nn39+li5dmu9973sZGRnJ5Zdfnu3bt4+de8EFF+Suu+7KQw89lPXr1+fK\nK6+c9nqFTQAAgB5w2mmnpa+vLx/96Eezbdu2PP/883nggQdy55135umnn05fX1/mz5+fhx9+ONdd\nd92OWWJz11135dvf/naee+65zJ8/PwceeGDmzp077fUKmwAAALvR1zeQamWP6XlU7e/ZnDlzcttt\nt+Xee+/NkiVL8tKXvjQrVqzI6OhorrrqqqxatSr9/f1ZsWJFli9fPnbeli1bsmLFigwODmbRokU5\n/PDDc/HFF7f9fdkT62wCALvVaDTSaDTGtuv1epKkXq+PbQPMFpOtJcner7MpbAIAU+aPMGC283tu\ncnsbNg2jBQAAoDhhEwAAgOKETQAAAIoTNgEAAChO2AQAAKA4YRMAAIDihE0AAACKEzYBAAB6wKJF\ni7JmzZpOlzFlwiYAAMBu9B/an1qtNm2P/kP7p1THjuN7xbxOFwAAANDNRkdGk6FpbH9odPoa7yA9\nmwAAAD1i3bp1ecUrXpHBwcG8/e1vz7PPPpvh4eGcffbZOeKIIzI4OJhzzjknjz/++Ng5N910U44/\n/vj09/dnyZIlWbVq1dhzN954Y5YuXZrBwcGcddZZ2bhxY7FahU0AAIAe0Gw2s2rVqqxevTrf//73\ns379+nz4wx9Os9nMO97xjmzcuDEbN27MQQcdlJUrVyZJtm7dmgsvvDBf/epXs2XLltxxxx151ate\nlSS59dZb85GPfCRf/OIX8+STT+a1r31tzjvvvGL1CpsAAAA9oFarZeXKlTn66KMzMDCQD33oQ7n5\n5pszODiY173udTnwwANzyCGH5IMf/GDWrl07dt6cOXNy//33Z9u2bTnyyCOzdOnSJMn111+fSy65\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAABCtpXKAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB1uSvJf9/Kc\ng5J8JclTST47heMfSHL6Xl4DAHZpXqcLAIBZrJ7kfyY5pkBbzdZjb/xmkiOSDCbZPoXjf35viwKA\nyczpdAEAwJTV9vL445Ksz9SC5p7MLdAGAADAtFuY5PNJfpTk75Jc0No/lOTPk/yPJFtSDe38F+PO\nOznJ37Se+0zrsWN46VuT3D7hOtuTLGlt/5MkVyXZkOSJJNclObDAubtycJJtSZ5PMtqq96gkpyW5\nI8lwkk1Jrk1ywLjzrk7ywyQjSf42ydLW/k+Ne519Sb6V5JrdXP+yJM8m+Wnr+m9rvZZvJnkyyY+T\n/GmSBePOeTTJma3toSSfS9UzO5Lk7bu5FgDsRM8mAJ0wJ9W9hPekCp2/kuR9SZa1nj8nyc2pgtCX\nk/xRa/9LknwpVRAdSHJLktdn6sNL/+8k/yzJSa1/j07yB9N07tYkZ6UKlH1J+lOF1J8luTDJYUle\nk+q1/4fWOf8myWuT/PNUr/2NSTaPa7PZOm9NqmD8vt1c/z8nuSJVGO9LFVZrSS5P8nNJXp5qeO/Q\nhPbH+41U3+MFSVbt5loAAABd4ZdS9RCOd0mSG1OFpNXj9i9N8kxr+/Qkj08476+S/JfW9lszee9k\nLcnTeaGnMqnC3t8VOHcy9SSP7eGY9yX5Qmv7zCTfTfX9mfgfwp9K8idJ7k/yH/fQ5g5DqXomJ3Nu\nql7iHX6QF/dsNqZ4HQDYiQmCAOiE41L1aA6P2zc3yf+XKoT+cNz+Z1INV53TOmdi2JwYWifz0iTz\nk9w9bl8tUxvl0865E70syR+mGho8P9Vn8V2t576Zqhf3E6m+R19I8vuphsHWkvx6a/u/7cN1k+TI\nJB9P8supejvn5MU9pxP9/T5eBwAMowWgIzam6kUbGPfoT3L2Hs77h1TDV8c7btz21lQBboejxm0/\nmeoeyqXjrnlo67rtnjuZXQ3vvS7JQ6mG4i5I8qG8+PP42iSntq71siQXj2vrj5N8LclfTqh1qte/\nItU9pD/fuvbvZvd/C+zt7LcAMEbYBKAT1qXqofs/U60FOTdVADp1D+fdkeqex/emmlTn9Ul+cdzz\n9yV5Rar7Kg/Mi+9H3J4qrF2TqqcyqYLrsgLnTuaHqe6xHB9KD0n12p9JcmKS38sLoe7UVENoD2g9\n/4+pwmHywky0K1MNtf1Kdj9B0fhzxl97a6rJio7OC0EWAIoTNgHohO2pejFfleq+xx8nuSEvzIw6\nsUdtx9c/TRUw35rkJ0l+K9VQ0x2han2q+ze/kSqQ3T6hrQ8k+V6S/5VqhtWvp+o9bPfcyTycaqKj\nv0s1XPWoVMNi35Qq8N2QagKfHfpb+zanmhn2ySRXjvse7KhnRaohrl9KNUvuZCauzXlZklNa9X8l\n1WzAk/Ve7su6ngBQ1IWpJit4oLUNADNp/JIgAECXaLdn8+eTvDPVEKaTUv0v9fHtFgUAe2HiUFEA\noAu0GzZPTPLtvHBPydpUw5sAYKZ0erjnB1Pdgznx8RczdP0HJ7n+eTN0fQCYFiemuq9lMNWseHek\nmlIdAACA/Vi762w+nOT/SbX49tYk96Sa9GHMSSed1LzvvvvavAwAAABd6r5Uk/69SOn7XK5ItXba\n9eP2NZtNk9ntydDQUIaGhjpdBrOI9xSleU9RmvcUpXlPUZL309TVarVkF9my3Z7NJDkiyY+SHJvk\ndanWBwMAAGA/ViJsfi7VgtXPJfkPqdYNAwAAYD9WImyeXqCN/V69Xu90Ccwy3lOU5j1Fad5TlOY9\nRUneT+2bibXJ3LMJAAAwS03nPZsAAACzwuDgYIaHhztdRlcaGBjI5s2bp3y8nk0AAICWWq0W+WXX\nJvveTNazOWcGagIAAGA/I2wCAABQnLAJAABAccImAAAAxQmbAAAAu9HfP5harTZtj/7+wU6/xGlh\nNloAAICWXc24Ws22Op2ZpjdmwDUbLQAAAB0nbAIAAPSITZs25Q1veEOOOOKILFmyJNdee22SZN26\ndXnNa16TgYGBLFy4MBdccEGee+65sfMuuuiiHHnkkVmwYEFe+cpX5sEHH5z2WoVNAACAHrB9+/ac\nc845Ofnkk7Np06asWbMm11xzTVavXp158+bl4x//eH7yk5/kjjvuyJo1a/LJT34ySfK1r30tt99+\nex555JGMjIzklltuyWGHHTbt9QqbAAAAPeDOO+/Mk08+mUsvvTTz5s3L4sWL8853vjOf+cxncsop\np+S0007LnDlzctxxx2XFihVZu3ZtkuSAAw7I6OhovvOd72T79u054YQTctRRR017vfOm/QoAAAC0\nbcOGDdm0aVMGBgbG9j3//PM5/fTT88gjj+Siiy7K3XffnWeeeSY/+9nPcuqppyZJzjzzzKxcuTLv\nec97smHDhrz+9a/PVVddlb6+vmmtV88mAABADzj22GOzePHiDA8Pjz22bNmS2267Leeff36WLl2a\n733vexkZGcnll1+e7du3j517wQUX5K677spDDz2U9evX58orr5z2eoVNAACAHnDaaaelr68vH/3o\nR7Nt27Y8//zzeeCBB3LnnXfm6aefTl9fX+bPn5+HH34411133Y4lSXLXXXfl29/+dp577rnMnz8/\nBx54YObOnTvt9QqbAAAAu9HXN5BqGcnpeVTt79mcOXNy22235d57782SJUvy0pe+NCtWrMjo6Giu\nuuqqrFq1Kv39/VmxYkWWL18+dt6WLVuyYsWKDA4OZtGiRTn88MNz8cUXt/192ZOdFt6cBs1eWKB0\nbzQajTQajbHter2eJKnX62PbAABA76nVaplt+aWUyb43rR7UnbKlsNkmb0YAAJg9/H0/ub0Nm2aj\nnSX0tgIAAN1Ez2abuvF/PrqxJgAA6AX+lp7c3vZsmiAIAACA4oRNAAAAihM2AQAAKE7YBAAAoDhh\nEwAAgOKETQAAgN3oP7Q/tVpt2h79h/ZPqY5FixZlzZo10/xqy7HOJgAAwG6MjowmQ9PY/tDolI7b\nEU57hZ5NAAAAihM2AQAAesS6devyile8IoODg3n729+eZ599NsPDwzn77LNzxBFHZHBwMOecc04e\nf/zxsXNuuummHH/88env78+SJUuyatWqseduvPHGLF26NIODgznrrLOycePGYrUKmwAAAD2g2Wxm\n1apVWb16db7//e9n/fr1+fCHP5xms5l3vOMd2bhxYzZu3JiDDjooK1euTJJs3bo1F154Yb761a9m\ny5YtueOOO/KqV70qSXLrrbfmIx/5SL74xS/mySefzGtf+9qcd955xeoVNgEAAHpArVbLypUrc/TR\nR2dgYCAf+tCHcvPNN2dwcDCve93rcuCBB+aQQw7JBz/4waxdu3bsvDlz5uT+++/Ptm3bcuSRR2bp\n0qVJkuuvvz6XXHJJTjjhhMyZMyeXXHJJ7r333jz22GNF6hU2AQAAesQxxxwztn3sscdm06ZN2bZt\n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\nHJz7bAIAADB1wiYAAADlhE0AAADKCZsAAACUEzYBAAAoJ2wCAABQTtgEAACgnLAJAABAOWETAABg\nBmzfvj3XXHPNtNsYm7AJAABwCPMnzKfX663aY/6E+bH62Lf+rNg87QYAAAC6bLhnmAxWsf5guHrF\np8iZTQAAgBlxww035OlPf3q2bduWn//5n893v/vd7N69OxdccEGe8IQnZNu2bXn+85+fr33ta0vv\n+b3f+708+clPzvz8fM4444xcddVVS//33ve+N2eeeWa2bduW888/P3fffXdZr8ImAADADFhcXMxV\nV12Vq6++Ol/5yldy22235Zd/+ZezuLiYV7ziFbn77rtz991357GPfWwuvfTSJMn999+fyy+/PB//\n+MezsLCQT33qUznrrLOSJB/+8Ifz5je/OR/84AfzrW99K895znPyohe9qKxfYRMAAGAG9Hq9XHrp\npTnllFOydevW/NIv/VLe9773Zdu2bXnBC16QY445Jscff3ze8IY35Lrrrlt636ZNm3LzzTfngQce\nyEknnZQzzzwzSfKud70rV1xxRZ7ylKdk06ZNueKKK3LTTTflnnvuKelX2AQAAJgRp5566tLyaaed\nlnvvvTcPPPBAfvEXfzHbt2/Pli1bcu6552bPnj1ZXFzMcccdlz/+4z/Ou971rpx88sm54IIL8qUv\nfSlJctddd+Xyyy/P1q1bs3Xr1jzucY9LkkcMwZ2EsAkAADAjll9Teffdd+fkk0/OW9/61tx22225\n4YYbsmfPnlx33XVZXFzM4uJikuS8887L1VdfnW984xt56lOfmosvvjhJG1bf/e53Z/fu3UuP+++/\nP8961rNKehU2AQAAZsDi4mJ+67d+K1/72teya9euvOlNb8pFF12U4XCYxz72sdmyZUt27dqVnTt3\nLr3nr//6r/PhD384999/f44++ugcd9xxOeqoo5Ikr3zlK/Mrv/IrueWWW5Ike/bsyQc+8IGyft36\nBAAA4BDmtsyt6u1J5rbMjbVer9fLS17ykpx33nm59957c+GFF+aNb3xjdu/enRe/+MU58cQTc8op\np+Q1r3lNPvKRjyRJ9u7dm7e97W152ctell6vl7PPPjvvfOc7kyQXXnhhvv3tb+eiiy7KXXfdlS1b\ntuS8887Lz/zMz5R8XWtxR9DFfadvAYDZ1uv10rXP9S72BMwuP1MO7mDfm16vl6yQLQ2jBQAAoJyw\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -625,7 +780,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, -- GitLab From 41814259b6125af57cdb5c1b26f96b60a636e4b1 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Fri, 11 Nov 2016 10:03:54 +0000 Subject: [PATCH 07/13] LisaTest: Add methods to override for test configuration These methods allow users of LisaTest to provide a `test_conf` member which configures the test environment (TestEnv) and an `experiments_conf` member to configure the experiments to set up the experiments (Executor). Users can override _getExperimentsConf with a method that generates the Executor experiments configuration as a function of target information - this is called _aftere_ the TestEnv is initialised and it is passed as a parameter. --- libs/utils/test.py | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/libs/utils/test.py b/libs/utils/test.py index ace8a5f58..bc168a9c4 100644 --- a/libs/utils/test.py +++ b/libs/utils/test.py @@ -30,8 +30,14 @@ from executor import Executor class LisaTest(unittest.TestCase): """A base class for LISA defined tests""" + test_conf = None + """Override this with a dictionary or JSON path to configure the TestEnv""" + + experiments_conf = None + """Override this with a dictionary to configure the Executor""" + @classmethod - def _init(cls, conf, *args, **kwargs): + def _init(cls, *args, **kwargs): """ Base class to run LISA test experiments """ @@ -42,10 +48,28 @@ class LisaTest(unittest.TestCase): cls.logger.setLevel(kwargs['loglevel']) kwargs.pop('loglevel') - cls.conf = conf - cls._runExperiments() + @classmethod + def _getTestConf(cls): + if cls.test_conf is None: + raise NotImplementedError("Override `test_conf` attribute") + return cls.test_conf + + @classmethod + def _getExperimentsConf(cls, test_env): + """ + Get the experiments_conf used to configure the Executor + + This method receives the initialized TestEnv as a parameter, so + subclasses can override it to configure workloads or target confs in a + manner dependent on the target. If not overridden, just returns the + experiments_conf attribute. + """ + if cls.experiments_conf is None: + raise NotImplementedError("Override `experiments_conf` attribute") + return cls.experiments_conf + @classmethod def _runExperiments(cls): """ @@ -53,9 +77,10 @@ class LisaTest(unittest.TestCase): """ cls.logger.info("%14s - Setup tests execution engine...", "LisaTest") - test_env = TestEnv() + test_env = TestEnv(test_conf=cls._getTestConf()) - cls.executor = Executor(test_env, cls.conf); + experiments_conf = cls._getExperimentsConf(test_env) + cls.executor = Executor(test_env, experiments_conf) # Alias executor objects to make less verbose tests code cls.te = cls.executor.te -- GitLab From 58d32dc365fa39e96a7875593611702a4035221b Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 22 Nov 2016 18:25:50 +0000 Subject: [PATCH 08/13] LisaTest: Flesh out docstrings --- libs/utils/test.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/libs/utils/test.py b/libs/utils/test.py index bc168a9c4..6e037a3e3 100644 --- a/libs/utils/test.py +++ b/libs/utils/test.py @@ -28,7 +28,22 @@ from env import TestEnv from executor import Executor class LisaTest(unittest.TestCase): - """A base class for LISA defined tests""" + """ + A base class for LISA tests + + This class is intended to be subclassed in order to create automated tests + for LISA. It sets up the TestEnv and Executor and provides convenience + methods for making assertions on results. + + Subclasses should provide a test_conf to configure the TestEnv and an + experiments_conf to configure the executor. + + Tests whose behaviour is dependent on target parameters, for example + presence of cpufreq governors or number of CPUs, can override + _getExperimentsConf to generate target-dependent experiments. + + Example users of this class can be found under LISA's tests/ directory. + """ test_conf = None """Override this with a dictionary or JSON path to configure the TestEnv""" @@ -39,7 +54,7 @@ class LisaTest(unittest.TestCase): @classmethod def _init(cls, *args, **kwargs): """ - Base class to run LISA test experiments + Set up logging and trigger running experiments """ cls.logger = logging.getLogger('test') -- GitLab From 94089265ec91703f2883dd2800986635b9803565 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 15 Nov 2016 13:57:22 +0000 Subject: [PATCH 09/13] tests/eas/acceptance: Remove JSON config The JSON doesn't make any sense without reading the Python, and vice versa. Therefore let's just have one file in one language. This means we have assignments in the same file as references so the code is easier to read. Also remove values that were not used. --- tests/eas/acceptance.config | 29 ----------------------------- tests/eas/acceptance.py | 22 +++++++++++++--------- 2 files changed, 13 insertions(+), 38 deletions(-) delete mode 100644 tests/eas/acceptance.config diff --git a/tests/eas/acceptance.config b/tests/eas/acceptance.config deleted file mode 100644 index bdc127ac5..000000000 --- a/tests/eas/acceptance.config +++ /dev/null @@ -1,29 +0,0 @@ -{ - "WORKLOAD_DURATION_S" : 5, - "WORKLOAD_PERIOD_MS" : 10, - "SWITCH_WINDOW_HALF" : 0.5, - "ENABLE_EAS" : true, - "SMALL_DCYCLE" : 10, - "BIG_DCYCLE": 100, - "STEP_LOW_DCYCLE" : 10, - "STEP_HIGH_DCYCLE" : 50, - "EXPECTED_RESIDENCY_PCT" : 85, - "OFFLOAD_MIGRATION_MIGRATOR_DELAY": 1, - "OFFLOAD_EXPECTED_BUSY_TIME_PCT": 97, - "SET_IS_BIG_LITTLE": true, - "SET_INITIAL_TASK_UTIL": true, - "TEST_CONF" : { - "modules" : [ "bl", "cpufreq" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - "buffsize" : 10240 - } - } -} diff --git a/tests/eas/acceptance.py b/tests/eas/acceptance.py index c0fb5e7e2..5227652b6 100644 --- a/tests/eas/acceptance.py +++ b/tests/eas/acceptance.py @@ -28,15 +28,19 @@ from devlib.target import TargetError from env import TestEnv from test import LisaTest, experiment_test -# Read the config file and update the globals -CONF_FILE = os.path.join( - os.path.dirname( - os.path.abspath(__file__)), - "acceptance.config") - -with open(CONF_FILE, "r") as fh: - conf_vars = json.load(fh) - globals().update(conf_vars) +# Global test configuration parameters +WORKLOAD_DURATION_S = 5 +WORKLOAD_PERIOD_MS = 10 +SWITCH_WINDOW_HALF = 0.5 +SMALL_DCYCLE = 10 +BIG_DCYCLE = 100 +STEP_HIGH_DCYCLE = 50 +STEP_LOW_DCYCLE = 10 +EXPECTED_RESIDENCY_PCT = 85 +OFFLOAD_EXPECTED_BUSY_TIME_PCT = 97 +SET_IS_BIG_LITTLE = True +SET_INITIAL_TASK_UTIL = True +OFFLOAD_MIGRATION_MIGRATOR_DELAY = 1 class EasTest(LisaTest): """ -- GitLab From 61711119eca18d0e8b1db1baf9f8ba0ff13d8533 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 15 Nov 2016 13:08:55 +0000 Subject: [PATCH 10/13] tests/eas/acceptance: ForkMigration: use Python dict not JSON --- tests/eas/acceptance.py | 50 ++++++++++++++++++-- tests/eas/acceptance_fork_migration.config | 55 ---------------------- 2 files changed, 45 insertions(+), 60 deletions(-) delete mode 100644 tests/eas/acceptance_fork_migration.config diff --git a/tests/eas/acceptance.py b/tests/eas/acceptance.py index 5227652b6..d57a085b4 100644 --- a/tests/eas/acceptance.py +++ b/tests/eas/acceptance.py @@ -42,17 +42,33 @@ SET_IS_BIG_LITTLE = True SET_INITIAL_TASK_UTIL = True OFFLOAD_MIGRATION_MIGRATOR_DELAY = 1 +energy_aware_conf = { + "tag" : "energy_aware", + "flags" : "ftrace", + "sched_features" : "ENERGY_AWARE", +} + class EasTest(LisaTest): """ Base class for EAS tests """ + test_conf = { + "ftrace" : { + "events" : [ + "sched_overutilized", + "sched_energy_diff", + "sched_load_avg_task", + "sched_load_avg_cpu", + "sched_migrate_task", + "sched_switch" + ], + }, + } + @classmethod def setUpClass(cls, *args, **kwargs): - conf_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), - cls.conf_basename) - - super(EasTest, cls)._init(conf_file, *args, **kwargs) + super(EasTest, cls)._init(*args, **kwargs) @classmethod def _experimentsInit(cls, *args, **kwargs): @@ -100,7 +116,31 @@ class ForkMigration(EasTest): The threads start on a big core. """ - conf_basename = "acceptance_fork_migration.config" + experiments_conf = { + "wloads" : { + # Create N 100% tasks and M 10% tasks which run in parallel, where N + # is the number of big CPUs and M is the number of LITTLE CPUs. + "fmig" : { + "type" : "rt-app", + "conf" : { + "class" : "profile", + "params" : { + "small" : { + "kind" : "Periodic", + "params" : { + "duty_cycle_pct": 10, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + }, + "prefix" : "small", + "tasks" : "big", + }, + }, + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): diff --git a/tests/eas/acceptance_fork_migration.config b/tests/eas/acceptance_fork_migration.config deleted file mode 100644 index 02d75ec70..000000000 --- a/tests/eas/acceptance_fork_migration.config +++ /dev/null @@ -1,55 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - }, - "wloads" : { - // Create N 100% tasks and M 10% tasks which run in parallel, where N is - // the number of big CPUs and M is the number of LITTLE CPUs. - "fmig" : { - "type" : "rt-app", - "conf" : { - "class" : "profile", - "params" : { - "small" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 10, - "duration_s": 5, - "period_ms": 10, - }, - "prefix" : "small" - }, - "big" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 100, - "duration_s" : 5, - "period_ms": 10 - }, - "prefix" : "large", - }, - }, - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} -- GitLab From 4739b035ee3e2bff89aa4aef4858142a9440cb53 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Thu, 17 Nov 2016 17:35:20 +0000 Subject: [PATCH 11/13] tests/eas/acceptance: SmallTaskPacking: Use Python dict not JSON --- tests/eas/acceptance.py | 19 ++++++++- .../eas/acceptance_small_task_packing.config | 42 ------------------- 2 files changed, 18 insertions(+), 43 deletions(-) delete mode 100644 tests/eas/acceptance_small_task_packing.config diff --git a/tests/eas/acceptance.py b/tests/eas/acceptance.py index d57a085b4..e87376a55 100644 --- a/tests/eas/acceptance.py +++ b/tests/eas/acceptance.py @@ -167,7 +167,24 @@ class SmallTaskPacking(EasTest): All tasks run on little cpus. """ - conf_basename = "acceptance_small_task_packing.config" + experiments_conf = { + "wloads" : { + "small_tasks" : { + "type" : "rt-app", + "conf" : { + "class" : "periodic", + "params" : { + "duty_cycle_pct": 10, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + }, + # Create one task for each CPU + "tasks" : "cpus", + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): diff --git a/tests/eas/acceptance_small_task_packing.config b/tests/eas/acceptance_small_task_packing.config deleted file mode 100644 index 251799433..000000000 --- a/tests/eas/acceptance_small_task_packing.config +++ /dev/null @@ -1,42 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - }, - "wloads" : { - // Create one small task for each CPU - "small_tasks" : { - "type" : "rt-app", - "conf" : { - "class" : "periodic", - "params" : { - "duty_cycle_pct": 10, - "duration_s": 5, - "period_ms": 10, - }, - // Create one task for each CPU - "tasks" : "cpus", - "prefix" : "stp" - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} -- GitLab From 3cad0e4ec16f5e82c6ce9bef8a2bbe91a1f16a9c Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 15 Nov 2016 13:22:58 +0000 Subject: [PATCH 12/13] tests/eas/acceptance: Offload+IdlePull: Use Python dict not JSON --- tests/eas/acceptance.py | 35 +++++++++++- tests/eas/acceptance_offload_idle_pull.config | 56 ------------------- 2 files changed, 34 insertions(+), 57 deletions(-) delete mode 100644 tests/eas/acceptance_offload_idle_pull.config diff --git a/tests/eas/acceptance.py b/tests/eas/acceptance.py index e87376a55..b2f6439d0 100644 --- a/tests/eas/acceptance.py +++ b/tests/eas/acceptance.py @@ -257,7 +257,40 @@ class OffloadMigrationAndIdlePull(EasTest): """ - conf_basename = "acceptance_offload_idle_pull.config" + experiments_conf = { + "wloads" : { + "early_and_migrators" : { + "type" : "rt-app", + "conf" : { + "class" : "profile", + "params" : { + "early" : { + "kind" : "Periodic", + "params" : { + "duty_cycle_pct": 100, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + }, + # Create one task for each big CPU + "tasks" : "big", + }, + "migrator" : { + "kind" : "Periodic", + "params" : { + "duty_cycle_pct": 100, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + "delay_s": OFFLOAD_MIGRATION_MIGRATOR_DELAY, + }, + # Create one task for each big CPU + "tasks" : "big", + }, + }, + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): diff --git a/tests/eas/acceptance_offload_idle_pull.config b/tests/eas/acceptance_offload_idle_pull.config deleted file mode 100644 index f53d76c2b..000000000 --- a/tests/eas/acceptance_offload_idle_pull.config +++ /dev/null @@ -1,56 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - }, - "wloads" : { - "early_and_migrators" : { - "type" : "rt-app", - "conf" : { - "class" : "profile", - "params" : { - "early" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 100, - "duration_s": 5, - "period_ms": 10, - }, - // Create one task for each big CPU - "tasks" : "big", - }, - "migrator" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 100, - "duration_s": 5, - "period_ms": 10, - "delay_s": 1 - }, - // Create one task for each big CPU - "tasks" : "big", - }, - }, - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} -- GitLab From 5f18308fec808255bfa4a31311a90e4c276a7b9c Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 15 Nov 2016 13:57:06 +0000 Subject: [PATCH 13/13] tests/eas/acceptance: WakeMigration: Use Python dict not JSON --- tests/eas/acceptance.py | 25 ++++++++++- tests/eas/acceptance_wake_migration.config | 48 ---------------------- 2 files changed, 24 insertions(+), 49 deletions(-) delete mode 100644 tests/eas/acceptance_wake_migration.config diff --git a/tests/eas/acceptance.py b/tests/eas/acceptance.py index b2f6439d0..218bbf219 100644 --- a/tests/eas/acceptance.py +++ b/tests/eas/acceptance.py @@ -419,7 +419,30 @@ class WakeMigration(EasTest): the big cpus when they are big. """ - conf_basename = "acceptance_wake_migration.config" + experiments_conf = { + "wloads" : { + "wake_migration" : { + "type" : "rt-app", + "conf" : { + "class" : "profile", + "params" : { + "wmig" : { + "kind" : "Step", + "params" : { + "start_pct": STEP_LOW_DCYCLE, + "end_pct": STEP_HIGH_DCYCLE, + "time_s": WORKLOAD_DURATION_S, + "loops": 2 + }, + # Create one task for each big cpu + "tasks" : "big", + }, + }, + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): diff --git a/tests/eas/acceptance_wake_migration.config b/tests/eas/acceptance_wake_migration.config deleted file mode 100644 index 963f101fb..000000000 --- a/tests/eas/acceptance_wake_migration.config +++ /dev/null @@ -1,48 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch", - "cpu_frequency", - ], - }, - "wloads" : { - // Create one small task for each CPU - "wake_migration" : { - "type" : "rt-app", - "conf" : { - "class" : "profile", - "params" : { - "wmig" : { - "kind" : "Step", - "params" : { - "start_pct": 10, // STEP_LOW_DCYCLE - "end_pct": 50, // STEP_HIGH_DCYCLE - "time_s": 5, // WORKLOAD_DURATION_S - "loops": 2 - }, - // Create one task for each CPU - "tasks" : "big", - }, - }, - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} -- GitLab