blob: 1ef7d1a6be4e1fa21c044b1bcffb1c748139cbb3 [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<font size=\"9\">Kernel Functions Profiling</font><br>\n",
"<hr>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import logging\n",
"reload(logging)\n",
"logging.basicConfig(\n",
" format='%(asctime)-9s %(levelname)-8s: %(message)s',\n",
" datefmt='%I:%M:%S')\n",
"\n",
"# Enable logging at INFO level\n",
"logging.getLogger().setLevel(logging.INFO)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"# Generate plots inline\n",
"%pylab inline\n",
"\n",
"import json\n",
"import os\n",
"\n",
"import re\n",
"import collections\n",
"import pandas\n",
"\n",
"# Support to tests execution\n",
"from executor import Executor"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tests configuration"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Setup a target configuration\n",
"target_conf = {\n",
"\n",
" # Platform and board to target\n",
" \"platform\" : \"linux\",\n",
" \"board\" : \"juno\",\n",
"\n",
" # Login credentials\n",
" \"host\" : \"192.168.0.1\",\n",
" \"username\" : \"root\",\n",
" \"password\" : \"\",\n",
"\n",
" # Local installation path\n",
" \"tftp\" : {\n",
" \"folder\" : \"/var/lib/tftpboot\",\n",
" \"kernel\" : \"kern.bin\",\n",
" \"dtb\" : \"dtb.bin\",\n",
" },\n",
"\n",
" # RTApp calibration values (comment to let LISA do a calibration run)\n",
" \"rtapp-calib\" : {\n",
" \"0\": 358, \"1\": 138, \"2\": 138, \"3\": 357, \"4\": 359, \"5\": 355\n",
" },\n",
"\n",
"}\n",
"\n",
"tests_conf = {\n",
" \n",
" # Kernel functions to profile for all the test\n",
" # configurations which have the \"ftrace\" flag enabled\n",
" \"ftrace\" : {\n",
" \"functions\" : [\n",
" \"select_task_rq_fair\",\n",
" \"enqueue_task_fair\",\n",
" \"dequeue_task_fair\",\n",
" ],\n",
" \"buffsize\" : 80 * 1024,\n",
" },\n",
" \n",
" # Platform configurations to test\n",
" \"confs\" : [\n",
" {\n",
" \"tag\" : \"base\",\n",
" \"flags\" : \"ftrace\",\n",
" \"sched_features\" : \"NO_ENERGY_AWARE\",\n",
" \"cpufreq\" : {\n",
" \"governor\" : \"performance\",\n",
" },\n",
" },\n",
" {\n",
" \"tag\" : \"eas\",\n",
" \"flags\" : \"ftrace\",\n",
" \"sched_features\" : \"ENERGY_AWARE\",\n",
" \"cpufreq\" : {\n",
" \"governor\" : \"performance\",\n",
" },\n",
" },\n",
" ],\n",
" \n",
" # Workloads to run (on each platform configuration)\n",
" \"wloads\" : {\n",
" \"rta\" : {\n",
" \"type\" : \"rt-app\",\n",
" \"conf\" : {\n",
" \"class\" : \"profile\",\n",
" \"params\" : {\n",
" \"p20\" : {\n",
" \"kind\" : \"periodic\",\n",
" \"params\" : {\n",
" \"duty_cycle_pct\" : 20,\n",
" },\n",
" \"tasks\" : \"cpus\",\n",
" },\n",
" },\n",
" },\n",
" },\n",
" },\n",
" \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",
"}"
]
},
{
"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)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tests execution"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"scrolled": false
},
"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 - <res_dir>/rtapp:base:rta/1/trace.dat\n",
"03:43:52 INFO : Executor - Collected FTrace function profiling:\n",
"03:43:52 INFO : Executor - <res_dir>/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 - <res_dir>/rtapp:base:rta/2/trace.dat\n",
"03:44:03 INFO : Executor - Collected FTrace function profiling:\n",
"03:44:03 INFO : Executor - <res_dir>/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 - <res_dir>/rtapp:base:rta/3/trace.dat\n",
"03:44:14 INFO : Executor - Collected FTrace function profiling:\n",
"03:44:14 INFO : Executor - <res_dir>/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 - <res_dir>/rtapp:eas:rta/1/trace.dat\n",
"03:44:28 INFO : Executor - Collected FTrace function profiling:\n",
"03:44:28 INFO : Executor - <res_dir>/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 - <res_dir>/rtapp:eas:rta/2/trace.dat\n",
"03:44:40 INFO : Executor - Collected FTrace function profiling:\n",
"03:44:40 INFO : Executor - <res_dir>/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 - <res_dir>/rtapp:eas:rta/3/trace.dat\n",
"03:44:52 INFO : Executor - Collected FTrace function profiling:\n",
"03:44:52 INFO : Executor - <res_dir>/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"
]
}
],
"source": [
"# Execute all the configured test\n",
"executor.run()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n"
]
}
],
"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",
"out_dir.replace(res_dir, \"<res_dir>\")\n",
"print executor.te.res_dir"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"03:44:52 INFO : Content of the output folder /home/derkling/Code/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;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",
"│   │   ├── 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",
"│   │   ├── 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",
"│   │   ├── trace.dat\r\n",
"│   │   └── trace_stat.json\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",
" │   ├── output.log\r\n",
" │   ├── rta_00.json\r\n",
" │   ├── rt-app-task_p20-0.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",
" │   ├── 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",
" │   ├── 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"
]
}
],
"source": [
"# Check content of the output folder\n",
"res_dir = executor.te.res_dir\n",
"logging.info('Content of the output folder %s', res_dir)\n",
"!tree {res_dir}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load function profiling data"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"def autodict():\n",
" return collections.defaultdict(autodict)\n",
"\n",
"def parse_perf_stat(res_dir):\n",
" TEST_DIR_RE = re.compile(r'.*/([^:]*):([^:]*):([^:]*)')\n",
" profiling_data = autodict()\n",
"\n",
" for test_idx in sorted(os.listdir(res_dir)):\n",
" test_dir = os.path.join(res_dir, test_idx)\n",
" if not os.path.isdir(test_dir):\n",
" continue\n",
" match = TEST_DIR_RE.search(test_dir)\n",
" if not match:\n",
" continue\n",
" wtype = match.group(1)\n",
" tconf = match.group(2)\n",
" wload = match.group(3)\n",
"\n",
" #logging.info('Processing %s:%s:%s', wtype, tconf, wload)\n",
" trace_stat_file = os.path.join(test_dir, '1', 'trace_stat.json')\n",
" if not os.path.isfile(trace_stat_file):\n",
" continue\n",
" with open(trace_stat_file, 'r') as fh:\n",
" data = json.load(fh)\n",
" for cpu_id, cpu_stats in sorted(data.items()):\n",
" for fname in cpu_stats:\n",
" profiling_data[cpu_id][tconf][fname] = cpu_stats[fname]\n",
"\n",
" return profiling_data\n",
" \n",
"profiling_data = parse_perf_stat(res_dir)\n",
"#logging.info(\"Profiling data:\\n%s\", json.dumps(profiling_data, indent=4))\n",
"#profiling_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Build Pandas DataFrame from profiling data"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def get_df(profiling_data):\n",
" cpu_ids = []\n",
" cpu_frames = []\n",
" for cpu_id, cpu_data in sorted(profiling_data.items()):\n",
" cpu_ids.append(cpu_id)\n",
" conf_ids = []\n",
" conf_frames = []\n",
" for conf_id, conf_data in cpu_data.iteritems():\n",
" conf_ids.append(conf_id)\n",
" function_data = pandas.DataFrame.from_dict(conf_data, orient='index')\n",
" conf_frames.append(function_data)\n",
" df = pandas.concat(conf_frames, keys=conf_ids)\n",
" cpu_frames.append(df)\n",
" df = pandas.concat(cpu_frames, keys=cpu_ids)\n",
" #df.head()\n",
" return df\n",
"\n",
"stats_df = get_df(profiling_data)\n",
"#stats_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot profiling data per function and CPU"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def plot_stats(df, fname, axes=None):\n",
" func_data = df.xs(fname, level=2)\n",
" func_stats = func_data.xs(['avg', 's_2'], axis=1)\n",
" #func_stats\n",
" func_avg = func_stats.unstack(level=1)['avg']\n",
" func_std = func_stats.unstack(level=1)['s_2'].apply(numpy.sqrt)\n",
" func_avg.plot(kind='bar', title=fname, yerr=func_std, ax=axes);\n",
"\n",
"#plot_stats(stats_df, 'select_task_rq_fair')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"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"
]
},
{
"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",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd620dcb450>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def plot_all_functions(df):\n",
" functions = df.index.get_level_values(2).unique()\n",
" fcount = len(functions)\n",
"\n",
" fig, pltaxes = plt.subplots(fcount, 1, figsize=(16, 8*fcount))\n",
"\n",
" fig_id = 0\n",
" for fname in functions:\n",
" logging.info(\"Plotting stats for [%s] function\", fname)\n",
" if fcount > 1:\n",
" axes = pltaxes[fig_id]\n",
" else:\n",
" axes = pltaxes\n",
" plot_stats(df, fname, axes)\n",
" fig_id = fig_id + 1\n",
" \n",
"plot_all_functions(stats_df)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}