Skip to content

Instantly share code, notes, and snippets.

@jlelli
Last active May 17, 2018 14:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jlelli/f5438221186e5ed3660194e4f645fe93 to your computer and use it in GitHub Desktop.
Save jlelli/f5438221186e5ed3660194e4f645fe93 to your computer and use it in GitHub Desktop.
x86 Frequency Invariance problem with Turbo
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:32:32,256 INFO : root : Using LISA logging configuration:\n",
"2018-05-17 16:32:32,257 INFO : root : /home/juri/work/lisa/logging.conf\n"
]
}
],
"source": [
"import logging\n",
"from conf import LisaLogging\n",
"LisaLogging.setup()\n",
"\n",
"# Uncomment the follwing line to enabled devlib debugging statements\n",
"# logging.getLogger('ssh').setLevel(logging.DEBUG)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"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 copy\n",
"import json\n",
"import os\n",
"\n",
"# Support to access the remote target\n",
"import devlib\n",
"from env import TestEnv\n",
"\n",
"# Support to configure and run RTApp based workloads\n",
"from wlgen import RTA, Periodic, PerfMessaging\n",
"\n",
"# Support for performance analysis of RTApp workloads\n",
"from perf_analysis import PerfAnalysis\n",
"\n",
"# Support for trace events analysis\n",
"from trace import Trace\n",
"\n",
"# Suport for FTrace events parsing and visualization\n",
"import trappy\n",
"\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test environment setup"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Setup a target configuration\n",
"my_conf = {\n",
" \n",
" # Define the kind of target platform to use for the experiments\n",
" \"platform\" : 'linux', # Linux system, valid other options are:\n",
" # android - access via ADB\n",
" # linux - access via SSH\n",
" # host - direct access\n",
" \n",
" # Preload settings for a specific target\n",
" #\"board\" : 'xeon_E5-2609_v3',\n",
" \n",
" # Define devlib module to load\n",
" \"modules\" : [\n",
" #'bl', # enable big.LITTLE support\n",
" 'cpufreq' # enable CPUFreq support\n",
" ],\n",
"\n",
" # Account to access the remote target\n",
" \"host\" : '192.168.1.233',\n",
" \"username\" : 'root',\n",
" \"password\" : '',\n",
"\n",
" # Comment the following line to force rt-app calibration on your target\n",
" \"rtapp-calib\" : {\n",
" \"0\": 25, \"1\": 25, \"2\": 25, \"3\": 25\n",
" },\n",
"\n",
" # Additional devlib modules required for this experiment\n",
" #\"modules\" : ['hwmon'],\n",
" \n",
" # Binary tools required to run this experiment\n",
" # These tools must be present in the tools/ folder for the architecture\n",
" \"tools\" : ['rt-app', 'taskset', 'trace-cmd', 'perf'],\n",
" \n",
" # FTrace events end buffer configuration\n",
" \"ftrace\" : {\n",
" \"events\" : [\n",
" \"sched_switch\",\n",
" \"sched_load_se\",\n",
" \"sched_load_cfs_rq\",\n",
" \"cpu_frequency\",\n",
" \"cpu_capacity\"\n",
" ],\n",
" \"buffsize\" : 20240\n",
" },\n",
" \n",
" \"results_dir\" : \"freq_invariance_xps\"\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:32:34,040 INFO : TestEnv : Using base path: /home/juri/work/lisa\n",
"2018-05-17 16:32:34,042 INFO : TestEnv : Loading custom (inline) target configuration\n",
"2018-05-17 16:32:34,044 INFO : TestEnv : Devlib modules to load: ['cpuidle', 'cpufreq']\n",
"2018-05-17 16:32:34,045 INFO : TestEnv : Connecting linux target:\n",
"2018-05-17 16:32:34,046 INFO : TestEnv : username : root\n",
"2018-05-17 16:32:34,048 INFO : TestEnv : host : 192.168.1.233\n",
"2018-05-17 16:32:34,049 INFO : TestEnv : password : \n",
"2018-05-17 16:32:34,051 INFO : TestEnv : Connection settings:\n",
"2018-05-17 16:32:34,052 INFO : TestEnv : {'username': 'root', 'host': '192.168.1.233', 'password': ''}\n",
"2018-05-17 16:32:39,748 INFO : TestEnv : Initializing target workdir:\n",
"2018-05-17 16:32:39,752 INFO : TestEnv : /root/devlib-target\n",
"2018-05-17 16:32:46,173 INFO : TestEnv : Attempting to read energy model from target\n",
"2018-05-17 16:32:46,336 ERROR : TestEnv : Couldn't read target energy model: Energy Model not exposed in sysfs. Check CONFIG_SCHED_DEBUG is enabled.\n",
"2018-05-17 16:32:46,340 INFO : TestEnv : Topology:\n",
"2018-05-17 16:32:46,342 INFO : TestEnv : [[0, 1, 2, 3]]\n",
"2018-05-17 16:32:47,845 WARNING : LinuxTarget : Event [cpu_capacity] not available for tracing\n",
"2018-05-17 16:32:47,847 INFO : TestEnv : Enabled tracepoints:\n",
"2018-05-17 16:32:47,848 INFO : TestEnv : sched_switch\n",
"2018-05-17 16:32:47,850 INFO : TestEnv : sched_load_se\n",
"2018-05-17 16:32:47,852 INFO : TestEnv : sched_load_cfs_rq\n",
"2018-05-17 16:32:47,853 INFO : TestEnv : cpu_frequency\n",
"2018-05-17 16:32:47,854 INFO : TestEnv : cpu_capacity\n",
"2018-05-17 16:32:47,855 INFO : TestEnv : Using configuration provided RTApp calibration\n",
"2018-05-17 16:32:47,856 INFO : TestEnv : Using RT-App calibration values:\n",
"2018-05-17 16:32:47,858 INFO : TestEnv : {\"0\": 25, \"1\": 25, \"2\": 25, \"3\": 25}\n",
"2018-05-17 16:32:47,859 INFO : TestEnv : Set results folder to:\n",
"2018-05-17 16:32:47,860 INFO : TestEnv : /home/juri/work/lisa/results/freq_invariance_xps\n",
"2018-05-17 16:32:47,862 INFO : TestEnv : Experiment results available also in:\n",
"2018-05-17 16:32:47,863 INFO : TestEnv : /home/juri/work/lisa/results_latest\n"
]
}
],
"source": [
"te = TestEnv(my_conf, force_new=True, wipe=False)\n",
"target = te.target"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:32:47,875 INFO : root : Target ABI: x86_64, CPus: ['i5-5200U', 'i5-5200U', 'i5-5200U', 'i5-5200U']\n"
]
}
],
"source": [
"logging.info(\"Target ABI: %s, CPus: %s\",\n",
" target.abi,\n",
" target.cpuinfo.cpu_names)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"''"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"target.execute('echo NO_UTIL_EST > /sys/kernel/debug/sched_features')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Support functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These are a set of functions to run a workload with different CPUFreq configurations"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def set_performance():\n",
" target.cpufreq.set_all_governors('performance')\n",
"\n",
"def set_powersave():\n",
" target.cpufreq.set_all_governors('powersave')\n",
"\n",
"def set_interactive():\n",
" target.cpufreq.set_all_governors('interactive')\n",
"\n",
"def set_schedutil():\n",
" target.cpufreq.set_all_governors('schedutil')\n",
"\n",
"def set_ondemand():\n",
" target.cpufreq.set_all_governors('ondemand') "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# CPUFreq configurations to test\n",
"confs = {\n",
" 'performance' : {\n",
" 'label' : 'prf',\n",
" 'set' : set_performance,\n",
" },\n",
"# 'powersave' : {\n",
"# 'label' : 'pws',\n",
"# 'set' : set_powersave,\n",
"# },\n",
"# 'interactive' : {\n",
"# 'label' : 'int',\n",
"# 'set' : set_interactive,\n",
"# },\n",
"# 'schedutil' : {\n",
"# 'label' : 'sch',\n",
"# 'set' : set_schedutil,\n",
"# }\n",
"# 'ondemand' : {\n",
"# 'label' : 'odm',\n",
"# 'set' : set_ondemand,\n",
"# }\n",
"}\n",
"\n",
"# The set of results forlder for each comparition test\n",
"results = {}"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"def experiment(governor, rtapp, exp_dir):\n",
" os.system('mkdir -p {}'.format(exp_dir));\n",
"\n",
" logging.info('------------------------')\n",
" logging.info('Run workload using %s governor', governor)\n",
" confs[governor]['set']()\n",
"\n",
" # Start FTrace and Energy monitoring\n",
" te.ftrace.start()\n",
"# te.emeter.reset()\n",
" \n",
" # Run the workload\n",
" rtapp.run(out_dir=exp_dir)\n",
" \n",
" # Stop FTrace and sample Energy consumption\n",
"# nrg = te.emeter.report(exp_dir).channels\n",
" te.ftrace.stop()\n",
" \n",
"# logging.info('Energy: %s', nrg)\n",
" \n",
" # Dump platform description\n",
" te.platform_dump(exp_dir)\n",
" \n",
" # Collect and keep track of the trace\n",
" trace_file = os.path.join(exp_dir, 'trace.dat')\n",
" te.ftrace.get_trace(trace_file)\n",
" \n",
" # Parse trace\n",
" tr = Trace(te.platform, exp_dir,\n",
" events=my_conf['ftrace']['events'])\n",
" \n",
" # return all the experiment data\n",
" return {\n",
" 'dir' : exp_dir,\n",
"# 'energy' : copy.deepcopy(nrg),\n",
" 'trace' : trace_file,\n",
" 'tr' : tr,\n",
" 'ftrace' : tr.ftrace\n",
" }\n",
"\n",
" \n",
"def compare(tid, rtapp): \n",
" logging.info('Test case: %s', tid)\n",
" \n",
" res_dir = os.path.join(te.res_dir, tid)\n",
" logging.info(' results folder: %s', res_dir)\n",
" \n",
" # Run the workload in all the configured governors\n",
" results[tid] = {}\n",
" for governor in confs:\n",
" test_dir = os.path.join(res_dir, governor)\n",
" results[tid][governor] = experiment(governor, rtapp, test_dir)\n",
" \n",
"def plot(tid):\n",
" global results\n",
" \n",
" for governor in confs:\n",
" plot_title = \"{} Governor\".format(governor.upper())\n",
" trappy.LinePlot(results[tid][governor]['ftrace'],\n",
" templates,\n",
" column=column,\n",
" pivot=\"cpu\",\n",
" filters={\"cpu\": [1]},\n",
" marker = '+',\n",
" drawstyle='steps-post',\n",
" title=plot_title,\n",
" ylim=(0, 1100)).view()\n",
" \n",
" for governor in confs:\n",
" pa = PerfAnalysis(results[tid][governor]['dir'])\n",
" for task in pa.tasks():\n",
" pa.plotPerf(task, \"Performance using [{}] governor\"\\\n",
" .format(governor))\n",
" \n",
"def report_nrg(tid):\n",
" global results\n",
" \n",
" print \"{:15s} | {:>9s} {:>9s} {:>9s}\"\\\n",
" .format('Governor', 'A53', 'A57', 'Total')\n",
" print \"{:-<16s}+{:-<30s}\".format('', '')\n",
" for governor in confs:\n",
" plot_title = \"{}\".format(governor.upper())\n",
" nrg = results[tid][governor]['energy']\n",
" nrg_little = float(nrg['little'])\n",
" nrg_big = float(nrg['big'])\n",
" nrg_sum = nrg_little + nrg_big\n",
" print \"{:15s} | {:9.3f} {:9.3f} {:9.3f}\"\\\n",
" .format(governor, nrg_little, nrg_big, nrg_sum)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test: longrun heavy"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:37:45,026 INFO : Workload : Setup new workload smoke\n",
"2018-05-17 16:37:45,233 INFO : Workload : Workload duration defined by longest task\n",
"2018-05-17 16:37:45,234 INFO : Workload : Default policy: SCHED_OTHER\n",
"2018-05-17 16:37:45,236 INFO : Workload : ------------------------\n",
"2018-05-17 16:37:45,238 INFO : Workload : task [task1], sched: using default policy\n",
"2018-05-17 16:37:45,239 INFO : Workload : | loops count: 1\n",
"2018-05-17 16:37:45,241 INFO : Workload : + phase_000001: batch 5.000000 [s]\n",
"2018-05-17 16:37:45,242 INFO : Workload : | CPUs affinity: [0]\n"
]
}
],
"source": [
"# Define a label for this test case\n",
"test_case = 'longrun-heavy'\n",
"\n",
"longheavy = Periodic(duty_cycle_pct=100, duration_s=5.0, period_ms=50, cpus=[0])\n",
"\n",
"rtapp = RTA(target, 'smoke', calibration=te.calibration())\n",
"rtapp.conf(\n",
" kind='profile',\n",
" params={\n",
" 'task1' : longheavy.get()\n",
" },\n",
" run_dir=target.working_directory\n",
");"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:37:59,371 INFO : root : Test case: longrun-heavy\n",
"2018-05-17 16:37:59,375 INFO : root : results folder: /home/juri/work/lisa/results/freq_invariance_xps/longrun-heavy\n",
"2018-05-17 16:37:59,432 INFO : root : ------------------------\n",
"2018-05-17 16:37:59,434 INFO : root : Run workload using performance governor\n",
"2018-05-17 16:38:04,388 INFO : Workload : Workload execution START:\n",
"2018-05-17 16:38:04,390 INFO : Workload : /root/devlib-target/bin/rt-app /root/devlib-target/smoke_00.json 2>&1\n",
"2018-05-17 16:38:17,619 WARNING : Trace : Cluster Frequency is not coherent! Failure in [cpu_frequency] events at:\n",
"2018-05-17 16:38:17,621 WARNING : Trace : __comm __cpu __line __pid cpu frequency\n",
"Time \n",
"0.502554 shutils 2 2599 4471 0 2209203\n",
"0.502595 shutils 2 2600 4471 1 2195577\n",
"0.502624 shutils 2 2601 4471 2 2195103\n",
"0.502650 shutils 2 2602 4471 3 2195095\n"
]
}
],
"source": [
"# Run this workload in all the configurations\n",
"compare(test_case, rtapp)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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m3PcccflpJNOytq1a7Nx48ZcccUVOfHEE3Psscdm9uzZW13jgQceyHve854cdNBB6dOnT84666zcfffdWx135513ZsyYMTnuuONy2mmnJak85O7yyy/PmDFjcuyxx+a//tf/2nn8t771rYwdOzbHHnts/u3f/i1JsmbNmlxwwQU58cQTM3bs2Pzv//2/kyRr167NOeeck1GjRuWTn/xk1q1b946/o29+85sZM2ZMxowZk7/7u7/r7P/Lv/zLHH/88Rk9evQW9z179uwcddRROfHEE/PAAw/s8Nzbu+e3+043btyYf/fv/t0W5/n85z+fhQsX5mc/+1muuOKKHHfccXnyySczadKk3HXXXe/4fgFgVzIjDgBJli9fnm9/+9sZPXp0kuSrX/1qGhsbs3Hjxpx22mn52Mc+lne/+90599xz89//+3/PqFGjsmrVqvTp0ye333579ttvv/ziF7/I+vXrM378+Jxyyil517ve1Xn+Z599NgceeGBne+jQoXn44YeTVJZNf+ADH8hpp52WG264oXPWvGNZ+Le//e0899xz+dWvfpWGhoa0tbV1nmfIkCG5//77M3PmzMyYMSO33nprbrzxxnzwgx/M3//932flypUZP358Jk6cmFmzZmXQoEFZunRpli1blnHjxr2j7+aBBx7ID3/4w/ziF7/Ixo0bc9JJJ+XEE0/MEUcckW9/+9tpbGzM2rVrM27cuJx55pl59dVXc9NNN+W+++7LPvvskw9+8IM59thjt3v+bd3zd77znW1+pwcccEBOOumkLFy4cLvnO+GEE/KhD30oZ555Zv7iL/7iHd0jABRJEAegZvbu27fqx762du1O1TJ8+PDOEJ4kP/rRj3LHHXekvb09zz33XH73u99l/fr1ede73pVRo0YlSQYOHJgkuffee7N8+fLceeedSZJXXnkljz322BZBfEfevGx67Nix+exnP5uPfexj+ehHP5okmTdvXr7whS+koaEhSdLY2Nh5fMcxo0aNyj333JMk+fnPf57/83/+T77xjW8kSdatW5ennnoq//Iv/5IvfelLSZKRI0fmfe973zuq75e//GU++tGPZu+9906SfOQjH8nChQtzxBFH5NZbb81PfvKTJMkzzzyTxx9/PH/84x/T3NycpqamJJVZ86eeemq759/WPe/oO91RCAeA7kAQB6Bm3mlo3rtv350O2O9U3zcF/cceeywzZ87MggULMmjQoEyaNGmHy7jL5XKmT5+ek08+ebvHHHDAAXn66ac7288880wOOOCArY6bOXNmFi1alJ/85Cc5/vjj88tf/nKHdXe8l72hoSHt7e2d/T/84Q8zfPjwHf5uV82bNy8LFy5Ma2tr9t5770ycODHr16//k8+zrXt+J99pr169Ui6XO9t/ylJ7AKgle8QB4C1eeeWV9O/fPwMGDMhzzz2Xn//850mSww8/PE899VSWLl3aeVx7e3tOOeWU/P3f/302btyYJHn00Ufz2muvbXHOY489Nr/73e/yxz/+MevXr88//uM/5vTTT9/q2k888USOPfbYTJ06NYMGDcqzzz6bCRMm5Pbbb+8M2m9emr4tp5xyyhb7uJctW5YkGTduXH74wx8mSX7961/nkUceeUffx/HHH5+77rorr732WtasWZO77747J5xwQl555ZUMHjw4e++9dx555JE8+OCDSZJjjjkm8+fPT1tbWzZs2JD/+T//5w7Pv617fiffaa9evTJo0KA89thj2bRp0xZ7wPv37581a9a8o/sDgKKZEQeg7r1+1VWFXm/UqFE5/PDDM3LkyBx00EEZO3Zsksrs8x133JEvfvGLWb9+ffbaa6/89Kc/zfnnn5+nn36687j99tsvP/rRj7Y45x577JFvfOMbOeOMM9Le3p5JkyblsMMOS7LlHvHLL788Tz75ZMrlciZOnJgRI0bksMMOy+9///sce+yx6d27d84///x89rOf3W79V111VS677LIcc8wx2bRpU4YPH54777wzF154YT772c923t/73//+d/R9HHPMMTn77LNz4oknJkk++9nP5ogjjsghhxyS7373uzn66KNz6KGH5phjjkmSHHjggbniiivS3NycQYMGZcSIETs8/7bu+b3vfe82v9P29vYt9ohff/31+Yu/+Ivst99+GTVqVOeM/Nlnn52LL744f/u3f7vV/y8AoNZK5Tev6QKAXej555/v3FcN9WbVqlX5sz/7s1qXAUAPYGk6AAAAFMjSdADo4U444YTOvdgd5syZk8MPP7yq17nhhhvyT//0T1v0/Yf/8B/yn/7Tf6rqdQCg3lmaDkBhLE2nnlmaDkBRLE0HAACAAgniABSmd+/eO/WeadjV1q9fn9697dgDoBj/PxEU4lykncNMAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1224x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"trappy.LinePlot(results['longrun-heavy']['performance']['ftrace'],\n",
" signals=[\n",
" \"sched_load_se:util\",\n",
" ],\n",
" pivot=\"pid\",\n",
" filters={\"pid\": [4483]},\n",
" marker = '+',\n",
" drawstyle='steps-post',\n",
" ylim=(0, 1100)).view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test: longrun heavy (multiple tasks)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:35:07,746 INFO : Workload : Setup new workload smoke\n",
"2018-05-17 16:35:07,944 INFO : Workload : Workload duration defined by longest task\n",
"2018-05-17 16:35:07,948 INFO : Workload : Default policy: SCHED_OTHER\n",
"2018-05-17 16:35:07,950 INFO : Workload : ------------------------\n",
"2018-05-17 16:35:07,952 INFO : Workload : task [task0], sched: using default policy\n",
"2018-05-17 16:35:07,954 INFO : Workload : | loops count: 1\n",
"2018-05-17 16:35:07,956 INFO : Workload : + phase_000001: batch 5.000000 [s]\n",
"2018-05-17 16:35:07,957 INFO : Workload : | CPUs affinity: [0]\n",
"2018-05-17 16:35:07,959 INFO : Workload : ------------------------\n",
"2018-05-17 16:35:07,960 INFO : Workload : task [task1], sched: using default policy\n",
"2018-05-17 16:35:07,961 INFO : Workload : | loops count: 1\n",
"2018-05-17 16:35:07,963 INFO : Workload : + phase_000001: batch 5.000000 [s]\n",
"2018-05-17 16:35:07,964 INFO : Workload : | CPUs affinity: [1]\n",
"2018-05-17 16:35:07,965 INFO : Workload : ------------------------\n",
"2018-05-17 16:35:07,967 INFO : Workload : task [task2], sched: using default policy\n",
"2018-05-17 16:35:07,969 INFO : Workload : | loops count: 1\n",
"2018-05-17 16:35:07,971 INFO : Workload : + phase_000001: batch 5.000000 [s]\n",
"2018-05-17 16:35:07,973 INFO : Workload : | CPUs affinity: [2]\n",
"2018-05-17 16:35:07,974 INFO : Workload : ------------------------\n",
"2018-05-17 16:35:07,976 INFO : Workload : task [task3], sched: using default policy\n",
"2018-05-17 16:35:07,978 INFO : Workload : | loops count: 1\n",
"2018-05-17 16:35:07,979 INFO : Workload : + phase_000001: batch 5.000000 [s]\n",
"2018-05-17 16:35:07,981 INFO : Workload : | CPUs affinity: [3]\n"
]
}
],
"source": [
"# Define a label for this test case\n",
"test_case = 'longrun-heavy-multiple'\n",
"\n",
"longheavy0 = Periodic(duty_cycle_pct=100, duration_s=5.0, period_ms=50, cpus=[0])\n",
"longheavy1 = Periodic(duty_cycle_pct=100, duration_s=5.0, period_ms=50, cpus=[1])\n",
"longheavy2 = Periodic(duty_cycle_pct=100, duration_s=5.0, period_ms=50, cpus=[2])\n",
"longheavy3 = Periodic(duty_cycle_pct=100, duration_s=5.0, period_ms=50, cpus=[3])\n",
"\n",
"rtapp = RTA(target, 'smoke', calibration=te.calibration())\n",
"rtapp.conf(\n",
" kind='profile',\n",
" params={\n",
" 'task0' : longheavy0.get(),\n",
" 'task1' : longheavy1.get(),\n",
" 'task2' : longheavy2.get(),\n",
" 'task3' : longheavy3.get()\n",
" },\n",
" run_dir=target.working_directory\n",
");\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-05-17 16:35:08,967 INFO : root : Test case: longrun-heavy-multiple\n",
"2018-05-17 16:35:08,969 INFO : root : results folder: /home/juri/work/lisa/results/freq_invariance_xps/longrun-heavy-multiple\n",
"2018-05-17 16:35:09,015 INFO : root : ------------------------\n",
"2018-05-17 16:35:09,017 INFO : root : Run workload using performance governor\n",
"2018-05-17 16:35:13,889 INFO : Workload : Workload execution START:\n",
"2018-05-17 16:35:13,891 INFO : Workload : /root/devlib-target/bin/rt-app /root/devlib-target/smoke_00.json 2>&1\n",
"2018-05-17 16:35:46,666 WARNING : Trace : Cluster Frequency is not coherent! Failure in [cpu_frequency] events at:\n",
"2018-05-17 16:35:46,668 WARNING : Trace : __comm __cpu __line __pid cpu frequency\n",
"Time \n",
"0.423558 <...> 1 2889 4271 0 2208039\n",
"0.423602 <...> 1 2890 4271 1 2195511\n",
"0.423633 <...> 1 2891 4271 2 2195192\n",
"0.423662 <...> 1 2892 4271 3 2195253\n"
]
}
],
"source": [
"# Run this workload in all the configurations\n",
"compare(test_case, rtapp)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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CiSIAwAAQIEEcQAAACiQIA4AAAAFEsQBAACgQII4AAAAFEgQBwAAgAIJ4gAAAFAgQRwAAAAKJIgDAABAgQRxAAAAKJAgDgAAAAUSxAEAAKBAgjgAAAAUSBAHAACAAgniAAAAUCBBHAAAAApU29MP2LJlSy699NLU19fn0ksvzfPPP59rr70269atS2NjYy688MLU1tZm8+bN+cIXvpCf//zn2W+//TJnzpyMGjWqEvcAAAAAfUaPO+Lf//73M2bMmO7xP//zP+fUU0/Nddddl6FDh2bx4sVJksWLF2fo0KG57rrrcuqpp+brX/96Ty8NAAAAfU6PgviqVauybNmyzJw5M0nS2dmZBx98MFOnTk2SNDU1paWlJUly3333pampKUkyderU/OxnP0tnZ2dPLg8AAAB9To+C+M0335z3v//9KZVKSZJ169ZlyJAhqampSZLU19entbU1SdLa2pqGhoYkSU1NTYYMGZJ169b15PIAAADQ5+z2HvH7778/I0aMSGNjYx588MFK1tStubl5j3wufU9bW5v5QNWYf1SLuUc1mX9Ui7lHtRQ593Y7iD/yyCO57777snz58mzatCmvvPJKbr755qxfvz4dHR2pqalJa2tr6uvrk5S746tWrUpDQ0M6Ojqyfv367Lfffju8RtdSdmhubjYfqBrzj2ox96gm849qMfeolkrPvTvuuGO739vtpenvfe97c+ONN+b666/PnDlzcuSRR+aiiy7K+PHjc8899yQp38jEiROTJMcff3z3XxfuueeejB8/vntJOwAAAPQXFX+P+Pve977cdtttufDCC9PW1pYZM2YkSWbMmJG2trZceOGFue222/K+972v0pcGAACAXq/H7xFPkvHjx2f8+PFJkgMPPDBXX331a84ZOHBgPvrRj1bicgAAANBnVbwjDgAAAGyfIA4AAAAFEsQBAACgQII4AAAAFEgQBwAAgAIJ4gAAAFAgQRwAAAAKJIgDAABAgQRxAAAAKJAgDgAAAAUSxAEAAKBAgjgAAAAUSBAHAACAAgniAAAAUCBBHAAAAAokiAMAAECBBHEAAAAokCAOAAAABRLEAQAAoECCOAAAABRIEAcAAIACCeIAAABQIEEcAAAACiSIAwAAQIEEcQAAACiQIA4AAAAFEsQBAACgQII4AAAAFEgQBwAAgAIJ4gAAAFAgQRwAAAAKJIgD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d+4e+WSogI0bN2bcuHE588wzc/LJJ+eLX/xijjrqqAwfPrzapdFP/Pu//3va29vT3t6ek046qdrl0I986UtfylFHHZXZs2dn1qxZGTJkiDDEHtfa2povfelL+dznPpe3v/3tufvuu9Pe3p5DDz202qWxlxo6dGhOOeWUtLS05Hd/93eTJLfccksOPvjgXHzxxVm9enV++tOf5uijj65ypexttjX3kuQDH/hA3va2t2XlypV5+OGH99jcszSdXm3kyJFpbGxMkgwePDhjxoxJa2trlauiv1i1alWWLVvmdYoUbv369fnf//3fzJgxI0lSW1u7x/4iD79py5Yt2bRpUzo6OrJp06aMHDmy2iWxF3vzm9/8mm53S0tLpk+fniSZPn16WlpaqlEae7ltzb1jjjkmNTU1SZJx48bt0dxhaTp9xvPPP5+VK1fm8MMPr3Yp9BM333xz3v/+9+eVV16pdin0M88//3yGDx+eG264Ib/85S/T2NiYs846K/vuu2+1S2MvV19fn9NOOy3nn39+Bg4cmGOOOSbHHHNMtcuin1m7dm33H4Dq6uqydu3aKldEf7R48eKccMIJe+zzdcTpEzZs2JB58+blrLPOypAhQ6pdDv3A/fffnxEjRnSvyIAidXR0ZOXKlfmd3/md/N3f/V0GDRqURYsWVbss+oG2tra0tLTk+uuvzxe/+MVs2LAhS5curXZZ9GOlUimlUqnaZdDPfOc730lNTU2mTZu2x64hiNPrtbe3Z968eZk2bVqmTJlS7XLoJx555JHcd999ueCCC3LttdfmZz/7WRYsWFDtsugnGhoa0tDQkLFjxyZJpk6dmpUrV1a5KvqDBx54IKNGjcrw4cNTW1ubKVOm5NFHH612WfQzI0aMyOrVq5Mkq1ev9mwgCtXc3Jz7778/F1100R79I5Cl6fRqnZ2dufHGGzNmzJi84x3vqHY59CPvfe978973vjdJ8uCDD+bf/u3fctFFF1W5KvqLurq6NDQ05Jlnnsno0aPzwAMP5KCDDqp2WfQD+++/fx577LFs3LgxAwcOzAMPPJDDDjus2mXRz0ycODFLlizJ6aefniVLlmTSpEnVLol+YsWKFfne976XK664IoMGDdqj1yp1dnZ27tErQA88/PDDueyyy3LIIYd0/0XqzDPPzHHHHVflyuhPuoK415dRpF/84he58cYb097enlGjRmX27Nle30Mhbrnlltx9992pqanJoYcemvPOOy/77LNPtctiL3XttdfmoYceyrp16zJixIicccYZmTRpUubPn58XX3zR68vYY7Y197773e+mvb29e76NHTs255577h65viAOAAAABbJHHAAAAAokiAMAAECBBHEAAAAokCAOAAAABRLEAQAAoECCOAAAABRIEAcAAIACCeIAAABQIEEcAAAACiSIAwAAQIEEcQAAACiQIA4AAAAFEsQBAACgQII4AAAAFEgQBwAAgAIJ4gAAAFAgQRwAAAAKJIgDAABAgQRxAAAAKJAgDgAAAAUSxAEAAKBAgjgAAAAUSBAHAACAAgniAAAAUCBBHAAAAAokiAMAAECBBHEAAAAokCAOAAAABRLEAQAAoECCOAAAABRIEAcAAIACCeIAAABQIEEcAAAACiSIAwAAQIEEcQAAACiQIA4AAAAFEsQBAACgQII4AAAAFEgQBwAAgAIJ4gAAAFAgQRwAAAAKJIgDAABAgQRxAAAAKJAgDgAAAAUSxAEAAKBAtdUuAID+o7OzM6tWrUp7e3u1S4Gt1NbWpqGhIaVSqdqlANAPlDo7OzurXQQA/cOLL76Y2traDBo0qNqlwFY2btyY9vb27L///tUuBYB+wNJ0AArT3t4uhNMrDRo0yEoNAAojiAMAAECBBHEAAAAokCAOQL+xatWqTJkyJVOmTMmhhx6aww47rHu8adOmPX79H/7whznmmGNy5JFHZv78+T3+vMMPPzxr1qzZ7Z+fOXNmfvKTn+yxz++ycOHCXHLJJT3+nNdj0aJFeeSRR7rHl19+eZYsWZJk5/cNAHuap6YD0OvVXnll2j/96R5/TkNDQ3784x8nSa688soMGzYsc+bM2eqczs7OdHZ2ZsCAyv6tevPmzfnoRz+aH/7whznwwANz0kkn5R3veEfGjh1b0etQduutt2bAgAF54xvfmCS54oorqlwRAPyajjgAvd4+V121Rz//iSeeyHHHHZcPfehDOf744/Pss8/mggsuyIknnpjjjz8+V73q+vfee2+ampoyZcqUnHzyyVm/fn3a29vz8Y9/PNOmTcvkyZOzcOHC11zj3nvvzRvf+MYccsghGTRoUN797nfntttue8153/rWtzJx4sRMmTIlb3vb25KUH3L3sY99LBMnTszkyZPzxS9+sfv8L3zhC5k6dWomT56cxx57LEnS1taWc889N9OmTcvUqVPz7//+70mS9evX533ve18mTJiQM888Mxs2bNjl39HnP//5TJw4MRMnTsw//MM/dB9/z3vekxNOOCHHH3/8Vve9cOHCHH300Zk2bVruvffeHX729u55Z7/T9vb2/NZv/dZWn3P++efnrrvuyn/8x3/k4x//eKZMmZJf/vKXOfvss3Prrbfu8v0CwJ6kIw4ASR555JF8+ctfzvHHH58k+eu//uvU19envb09b3vb2/Kud70rv/3bv50PfvCD+Zd/+ZdMmDAha9euzaBBg3LTTTflgAMOyJ133pmNGzdm+vTpmTVrVg4++ODuz3/mmWdy0EEHdY/HjBmTBx54IEl52fRb3vKWvO1tb8tVV13V3TXvWhb+5S9/Oc8++2x+/OMfp6amJq2trd2fM2rUqNxzzz254YYbsmDBglx33XW5+uqr89a3vjVf+tKXsnr16kyfPj0zZ87MjTfemLq6uixfvjwrVqzISSedtEu/m3vvvTff/OY3c+edd6a9vT0nn3xypk2bliOPPDJf/vKXU19fn/Xr1+ekk07K6aefnpdffjnXXHNN7r777uy3335561vfmsmTJ2/387d1z1/5yle2+TsdPXp0Tj755Nx1113b/bwTTzwxv/u7v5vTTz8973znO3fpHgGgSII4AFUzeMiQip/7yvr1u1VLY2NjdwhPkltuuSVf/epX09HRkWeffTYPP/xwNm7cmIMPPjgTJkxIkowYMSJJcscdd+SRRx7Jt771rSTJSy+9lMcff3yrIL4jr142PXXq1Hz4wx/Ou971rvz+7/9+kmTx4sX58z//89TU1CRJ6uvru8/vOmfChAn54Q9/mCS5/fbb85//+Z/53Oc+lyTZsGFDnnzyyfzoRz/KRz/60STJsccemze/+c27VN///M//5Pd///czePDgJMlpp52Wu+66K0ceeWSuu+66fP/730+SPP300/n5z3+e//u//0tTU1MaGhqSlLvmTz755HY/f1v3vKPf6Y5COAD0BYI4AFWzq6F58JAhux2wd9WQVwX9xx9/PDfccEOWLl2aurq6nH322Ttcxt3Z2Zlrr702p5xyynbPGT16dJ566qnu8dNPP53Ro0e/5rwbbrghLS0t+f73v58TTjgh//M//7PDurvey15TU5OOjo7u49/85jfT2Ni4w5/tqcWLF+euu+5Kc3NzBg8enJkzZ2bjxo2v+3O2dc+78jsdMGBAOjs7u8evZ6k9AFSTPeIA8BteeumlDBs2LMOHD8+zzz6b22+/PUlyxBFH5Mknn8zy5cu7z+vo6MisWbPypS99Ke3t7UmSRx99NK+88spWnzl58uQ8/PDD+b//+79s3Lgx3/nOd3Lqqae+5torV67M5MmTc/nll6euri7PPPNMZsyYkZtuuqk7aL96afq2zJo1a6t93CtWrEiSnHTSSfnmN7+ZJPnpT3+ahx56aJd+HyeccEJuvfXWvPLKK2lra8ttt92WE088MS+99FJGjhyZwYMH56GHHsr999+fJJk0aVKWLFmS1tbWbNq0Kd/97nd3+Pnbuudd+Z0OGDAgdXV1efzxx7Nly5at9oAPGzYsbW1tu3R/AFA0HXEAer3Nn/xkodebMGFCjjjiiBx77LE55JBDMnXq1CTl7vNXv/rVfOQjH8nGjRuz77775gc/+EHOOeecPPXUU93nHXDAAbnlllu2+sx99tknn/vc5/KOd7wjHR0dOfvsszNu3LgkW+8R/9jHPpZf/vKX6ezszMyZMzN+/PiMGzcuTzzxRCZPnpza2tqcc845+fCHP7zd+j/5yU/mkksuyaRJk7Jly5Y0NjbmW9/6Vs4777x8+MMf7r6/Y445Zpd+H5MmTcoZZ5yRadOmJUk+/OEP58gjj8zhhx+ef/zHf8xxxx2XsWPHZtKkSUmSgw46KB//+MfT1NSUurq6jB8/foefv617ftOb3rTN32lHR8dWe8SvvPLKvPOd78wBBxyQCRMmdHfkzzjjjFx44YX5+7//+9f8bwEA1VbqfPWaLgDYg5577rnufdXQ26xduzZveMMbql0GAP2ApekAAABQIEvTAaCfO/HEE7v3Yne5+eabc8QRR1T0OldddVW+973vbXXsD//wD/OXf/mXFb0OAPR2lqYDUBhL0+nNLE0HoCiWpgMAAECBBHEAClNbW7tb75mGPW3jxo2prbVjD4Bi/H/cd6n0DfKSWgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 1224x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"trappy.LinePlot(results['longrun-heavy-multiple']['performance']['ftrace'],\n",
" signals=[\n",
" \"sched_load_se:util\",\n",
" ],\n",
" pivot=\"pid\",\n",
" filters={\"pid\": [4283]},\n",
" marker = '+',\n",
" drawstyle='steps-post',\n",
" ylim=(0, 1100)).view()"
]
}
],
"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.14"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment