blob: 27ed4d6db8c43869f45ca71796d43e0af7df6a02 [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tutorial Goal"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This tutorial aims to show some example of **data analysis and visualization**\n",
"from a set of trace events collected trace. These analysis are mainly supported\n",
"by **TRAPpy** and other standard **PANDAs** APIs."
]
},
{
"cell_type": "code",
"execution_count": 317,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import logging\n",
"from conf import LisaLogging\n",
"LisaLogging.setup()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Trace Parsing"
]
},
{
"cell_type": "code",
"execution_count": 318,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Events we are interested to collect from the trace\n",
"my_events = [\n",
" \"sched_switch\",\n",
" \"sched_wakeup\",\n",
" \"sched_contrib_scale_f\",\n",
" \"sched_load_avg_cpu\",\n",
" \"sched_load_avg_task\",\n",
" \"sched_tune_tasks_update\",\n",
" \"sched_boost_cpu\",\n",
" \"sched_boost_task\",\n",
" \"sched_energy_diff\",\n",
" \"sched_overutilized\",\n",
" \"cpu_frequency\",\n",
" \"cpu_capacity\"\n",
"]\n",
"\n",
"# Let's use an example trace\n",
"trace_file = './example_results/trace.dat'"
]
},
{
"cell_type": "code",
"execution_count": 319,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Use TRAPpy support to convert a trace into a PANDAs DataFrame\n",
"import trappy\n",
"\n",
"ftrace = trappy.FTrace(\n",
" name=\"PandasExamples\",\n",
" path=trace_file,\n",
" scope='custom',\n",
" events=my_events,\n",
" window=(0,None))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Trace visualization"
]
},
{
"cell_type": "code",
"execution_count": 320,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<style>\n",
"/*\n",
"\n",
" * Copyright 2015-2016 ARM Limited\n",
"\n",
" *\n",
"\n",
" * Licensed under the Apache License, Version 2.0 (the \"License\");\n",
"\n",
" * you may not use this file except in compliance with the License.\n",
"\n",
" * You may obtain a copy of the License at\n",
"\n",
" *\n",
"\n",
" * http://www.apache.org/licenses/LICENSE-2.0\n",
"\n",
" *\n",
"\n",
" * Unless required by applicable law or agreed to in writing, software\n",
"\n",
" * distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"\n",
" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"\n",
" * See the License for the specific language governing permissions and\n",
"\n",
" * limitations under the License.\n",
"\n",
" */\n",
"\n",
"\n",
"\n",
".d3-tip {\n",
"\n",
" line-height: 1;\n",
"\n",
" padding: 12px;\n",
"\n",
" background: rgba(0, 0, 0, 0.6);\n",
"\n",
" color: #fff;\n",
"\n",
" border-radius: 2px;\n",
"\n",
" position: absolute !important;\n",
"\n",
" z-index: 99999;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".d3-tip:after {\n",
"\n",
" box-sizing: border-box;\n",
"\n",
" pointer-events: none;\n",
"\n",
" display: inline;\n",
"\n",
" font-size: 10px;\n",
"\n",
" width: 100%;\n",
"\n",
" line-height: 1;\n",
"\n",
" color: rgba(0, 0, 0, 0.6);\n",
"\n",
" content: \"\\25BC\";\n",
"\n",
" position: absolute !important;\n",
"\n",
" z-index: 99999;\n",
"\n",
" text-align: center;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".d3-tip.n:after {\n",
"\n",
" margin: -1px 0 0 0;\n",
"\n",
" top: 100%;\n",
"\n",
" left: 0;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".contextRect {\n",
"\n",
" fill: lightgray;\n",
"\n",
" fill-opacity: 0.5;\n",
"\n",
" stroke: black;\n",
"\n",
" stroke-width: 1;\n",
"\n",
" stroke-opacity: 1;\n",
"\n",
" pointer-events: none;\n",
"\n",
" shape-rendering: crispEdges;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".chart {\n",
"\n",
" shape-rendering: crispEdges;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".mini text {\n",
"\n",
" font: 9px sans-serif;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".main text {\n",
"\n",
" font: 12px sans-serif;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".axis line, .axis path {\n",
"\n",
" stroke: black;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".miniItem {\n",
"\n",
" stroke-width: 8;\n",
"\n",
"}\n",
"\n",
"\n",
"\n",
".brush .extent {\n",
"\n",
"\n",
"\n",
" stroke: #000;\n",
"\n",
" fill-opacity: .125;\n",
"\n",
" shape-rendering: crispEdges;\n",
"\n",
"}\n",
"\n",
"</style>\n",
"<div id=\"fig_d214ad0f1542466fae4421fb3494b551\" class=\"eventplot\">\n",
" <script>\n",
" var req = require.config( {\n",
"\n",
" paths: {\n",
"\n",
" \"EventPlot\": '/nbextensions/plotter_scripts/EventPlot/EventPlot',\n",
" \"d3-tip\": '/nbextensions/plotter_scripts/EventPlot/d3.tip.v0.6.3',\n",
" \"d3-plotter\": '/nbextensions/plotter_scripts/EventPlot/d3.min'\n",
" },\n",
" shim: {\n",
" \"d3-plotter\" : {\n",
" \"exports\" : \"d3\"\n",
" },\n",
" \"d3-tip\": [\"d3-plotter\"],\n",
" \"EventPlot\": {\n",
"\n",
" \"deps\": [\"d3-tip\", \"d3-plotter\" ],\n",
" \"exports\": \"EventPlot\"\n",
" }\n",
" }\n",
" });\n",
" req([\"require\", \"EventPlot\"], function() {\n",
" EventPlot.generate('fig_d214ad0f1542466fae4421fb3494b551', '/nbextensions/');\n",
" });\n",
" </script>\n",
" </div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# NOTE: The interactive trace visualization is available only if you run\n",
"# the workload to generate a new trace-file\n",
"trappy.plotter.plot_trace(ftrace)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Accessing DataFrame tables"
]
},
{
"cell_type": "code",
"execution_count": 321,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 461132\r\n",
"drwxrwxr-x 4 derkling derkling 4096 Mar 3 10:51 .\r\n",
"drwxrwxr-x 14 derkling derkling 4096 Mar 2 16:24 ..\r\n",
"-rw-rw-r-- 1 derkling derkling 9646 Mar 2 16:24 01_IPythonNotebooksUsage.ipynb\r\n",
"-rw-rw-r-- 1 derkling derkling 69766 Mar 2 16:59 02_TestEnvUsage.ipynb\r\n",
"-rw-rw-r-- 1 derkling derkling 49598 Mar 2 17:20 03_WlGenUsage.ipynb\r\n",
"-rw-rw-r-- 1 derkling derkling 18062 Mar 2 17:20 04_ExecutorUsage.ipynb\r\n",
"-rw-rw-r-- 1 derkling derkling 170388 Mar 3 10:51 05_TrappyUsage.ipynb\r\n",
"-rw-rw-r-- 1 derkling derkling 319096 Mar 3 10:46 06_TraceAnalysis.ipynb\r\n",
"drwxrwxr-x 2 derkling derkling 4096 Mar 3 10:36 example_results\r\n",
"drwxr-xr-x 2 derkling derkling 4096 Mar 3 08:56 .ipynb_checkpoints\r\n",
"-rw-rw-r-- 1 derkling derkling 241050436 Mar 2 17:23 trace.raw.txt\r\n",
"-rw-rw-r-- 1 derkling derkling 230468272 Mar 2 17:23 trace.txt\r\n"
]
}
],
"source": [
"# Let's have a look at the generated file\n",
"!ls -la example_results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that the binary trace has been used to generate both textual\n",
"(i.e. trace.txt) trace as well as a raw trace (trace.raw.txt)."
]
},
{
"cell_type": "code",
"execution_count": 322,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:51:52 INFO : Example of (formatted) 'sched_switch' event:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" <...>-20278 [001] 713.575552: sched_switch: trace-cmd:20278 [120] x ==> swapper/1:0 [120]\n",
"\n"
]
}
],
"source": [
"logging.info(\"Example of (formatted) 'sched_switch' event:\")\n",
"with open('./example_results/trace.txt', 'r') as fh:\n",
" for line in fh:\n",
" if line.find('sched_switch') == -1:\n",
" continue\n",
" print line\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 323,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:51:52 INFO : Example of (raw) 'sched_switch' event:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" <...>-20278 [001] 713.575552: sched_switch: prev_comm=trace-cmd prev_pid=20278 prev_prio=120 prev_state=64 next_comm=swapper/1 next_pid=0 next_prio=120\n",
"\n"
]
}
],
"source": [
"logging.info(\"Example of (raw) 'sched_switch' event:\")\n",
"with open('./example_results/trace.raw.txt', 'r') as fh:\n",
" for line in fh:\n",
" if line.find('sched_switch') == -1:\n",
" continue\n",
" print line\n",
" break"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Every event correspond to a \"table\" which is exposed as an attribute of the\n",
"TRAPpy::FTtrace object we created by parsing the trace.\n",
"\n",
"We can use **TRAPpy::FTrace::class_definitions**, which is a dictionary tracking all the collected tables."
]
},
{
"cell_type": "code",
"execution_count": 324,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:51:53 INFO : List of events identified in the trace:\n",
"10:51:53 INFO : sched_load_avg_task\n",
"10:51:53 INFO : cpu_frequency\n",
"10:51:53 INFO : cpu_capacity\n",
"10:51:53 INFO : sched_load_avg_cpu\n",
"10:51:53 INFO : sched_boost_cpu\n",
"10:51:53 INFO : sched_tune_tasks_update\n",
"10:51:53 INFO : sched_boost_task\n",
"10:51:53 INFO : sched_overutilized\n",
"10:51:53 INFO : sched_energy_diff\n",
"10:51:53 INFO : sched_switch\n",
"10:51:53 INFO : sched_contrib_scale_f\n",
"10:51:53 INFO : sched_wakeup\n"
]
}
],
"source": [
"logging.info(\"List of events identified in the trace:\")\n",
"for event in ftrace.class_definitions.keys():\n",
" logging.info(\" %s\", event)"
]
},
{
"cell_type": "code",
"execution_count": 325,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:51:53 INFO : The 'sched_switch' events are collected into this DataFrame:\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>__comm</th>\n",
" <th>__cpu</th>\n",
" <th>__pid</th>\n",
" <th>next_comm</th>\n",
" <th>next_pid</th>\n",
" <th>next_prio</th>\n",
" <th>prev_comm</th>\n",
" <th>prev_pid</th>\n",
" <th>prev_prio</th>\n",
" <th>prev_state</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.000272</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>1</td>\n",
" <td>20278</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>trace-cmd</td>\n",
" <td>20278</td>\n",
" <td>120</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000348</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>sh</td>\n",
" <td>20277</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.001321</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>0</td>\n",
" <td>20277</td>\n",
" <td>sudo</td>\n",
" <td>20276</td>\n",
" <td>120</td>\n",
" <td>sh</td>\n",
" <td>20277</td>\n",
" <td>120</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.001357</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.001458</th>\n",
" <td>rcu_preempt</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.005202</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>0</td>\n",
" <td>20276</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>sudo</td>\n",
" <td>20276</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.005349</th>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>0</td>\n",
" <td>1364</td>\n",
" <td>rsyslogd</td>\n",
" <td>394</td>\n",
" <td>120</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.005464</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.005528</th>\n",
" <td>ksoftirqd/1</td>\n",
" <td>1</td>\n",
" <td>14</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.005612</th>\n",
" <td>rcu_preempt</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.005616</th>\n",
" <td>rsyslogd</td>\n",
" <td>0</td>\n",
" <td>394</td>\n",
" <td>rs:main Q:Reg</td>\n",
" <td>380</td>\n",
" <td>120</td>\n",
" <td>rsyslogd</td>\n",
" <td>394</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.006245</th>\n",
" <td>rs:main</td>\n",
" <td>0</td>\n",
" <td>380</td>\n",
" <td>sudo</td>\n",
" <td>20276</td>\n",
" <td>120</td>\n",
" <td>rs:main Q:Reg</td>\n",
" <td>380</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.007334</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>0</td>\n",
" <td>20276</td>\n",
" <td>rcu_sched</td>\n",
" <td>8</td>\n",
" <td>120</td>\n",
" <td>sudo</td>\n",
" <td>20276</td>\n",
" <td>120</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.007425</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>bash</td>\n",
" <td>19394</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.007450</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>0</td>\n",
" <td>8</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_sched</td>\n",
" <td>8</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.008416</th>\n",
" <td>bash</td>\n",
" <td>1</td>\n",
" <td>19394</td>\n",
" <td>kworker/1:2</td>\n",
" <td>19472</td>\n",
" <td>120</td>\n",
" <td>bash</td>\n",
" <td>19394</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.008562</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>1</td>\n",
" <td>19472</td>\n",
" <td>sshd</td>\n",
" <td>15461</td>\n",
" <td>120</td>\n",
" <td>kworker/1:2</td>\n",
" <td>19472</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.009328</th>\n",
" <td>sshd</td>\n",
" <td>1</td>\n",
" <td>15461</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>sshd</td>\n",
" <td>15461</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.009437</th>\n",
" <td>rcu_preempt</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.009632</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>rcu_sched</td>\n",
" <td>8</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.009731</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>0</td>\n",
" <td>8</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_sched</td>\n",
" <td>8</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.013650</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.013727</th>\n",
" <td>ksoftirqd/1</td>\n",
" <td>1</td>\n",
" <td>14</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.013839</th>\n",
" <td>rcu_preempt</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.017585</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.017587</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.017681</th>\n",
" <td>rcu_preempt</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.017830</th>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>0</td>\n",
" <td>1364</td>\n",
" <td>ksoftirqd/0</td>\n",
" <td>3</td>\n",
" <td>120</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.017886</th>\n",
" <td>ksoftirqd/0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>rcu_sched</td>\n",
" <td>8</td>\n",
" <td>120</td>\n",
" <td>ksoftirqd/0</td>\n",
" <td>3</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.017968</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>0</td>\n",
" <td>8</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_sched</td>\n",
" <td>8</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301101</th>\n",
" <td>sudo</td>\n",
" <td>1</td>\n",
" <td>20990</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301191</th>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1</td>\n",
" <td>1364</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301333</th>\n",
" <td>sudo</td>\n",
" <td>1</td>\n",
" <td>20990</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301381</th>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1</td>\n",
" <td>1364</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301421</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301516</th>\n",
" <td>rcu_preempt</td>\n",
" <td>0</td>\n",
" <td>7</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.301782</th>\n",
" <td>sudo</td>\n",
" <td>1</td>\n",
" <td>20990</td>\n",
" <td>rsyslogd</td>\n",
" <td>394</td>\n",
" <td>120</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.302128</th>\n",
" <td>rsyslogd</td>\n",
" <td>1</td>\n",
" <td>394</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>rsyslogd</td>\n",
" <td>394</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.302198</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>rs:main Q:Reg</td>\n",
" <td>380</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.302846</th>\n",
" <td>rs:main</td>\n",
" <td>0</td>\n",
" <td>380</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rs:main Q:Reg</td>\n",
" <td>380</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.303877</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>sudo</td>\n",
" <td>20991</td>\n",
" <td>120</td>\n",
" <td>swapper/3</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.303987</th>\n",
" <td>sudo</td>\n",
" <td>1</td>\n",
" <td>20990</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.305325</th>\n",
" <td>sh</td>\n",
" <td>3</td>\n",
" <td>20991</td>\n",
" <td>migration/3</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>sudo</td>\n",
" <td>20991</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.305428</th>\n",
" <td>migration/3</td>\n",
" <td>3</td>\n",
" <td>23</td>\n",
" <td>swapper/3</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>migration/3</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.305455</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>sudo</td>\n",
" <td>20991</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.309369</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.309480</th>\n",
" <td>rcu_preempt</td>\n",
" <td>0</td>\n",
" <td>7</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.311031</th>\n",
" <td>sh</td>\n",
" <td>1</td>\n",
" <td>20991</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>sh</td>\n",
" <td>20991</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.311063</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>sh</td>\n",
" <td>20992</td>\n",
" <td>120</td>\n",
" <td>swapper/3</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.311164</th>\n",
" <td>sudo</td>\n",
" <td>1</td>\n",
" <td>20990</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>sudo</td>\n",
" <td>20990</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.311548</th>\n",
" <td>trace-cmd</td>\n",
" <td>3</td>\n",
" <td>20992</td>\n",
" <td>migration/3</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>sh</td>\n",
" <td>20992</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.311645</th>\n",
" <td>migration/3</td>\n",
" <td>3</td>\n",
" <td>23</td>\n",
" <td>swapper/3</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>migration/3</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.311839</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>sh</td>\n",
" <td>20992</td>\n",
" <td>120</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313244</th>\n",
" <td>trace-cmd</td>\n",
" <td>1</td>\n",
" <td>20992</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>trace-cmd</td>\n",
" <td>20992</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313342</th>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1</td>\n",
" <td>1364</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313390</th>\n",
" <td>ksoftirqd/1</td>\n",
" <td>1</td>\n",
" <td>14</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>1024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313429</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313437</th>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1</td>\n",
" <td>1364</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>ksdioirqd/mmc2</td>\n",
" <td>1364</td>\n",
" <td>98</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313485</th>\n",
" <td>ksoftirqd/1</td>\n",
" <td>1</td>\n",
" <td>14</td>\n",
" <td>trace-cmd</td>\n",
" <td>20992</td>\n",
" <td>120</td>\n",
" <td>ksoftirqd/1</td>\n",
" <td>14</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35.313536</th>\n",
" <td>rcu_preempt</td>\n",
" <td>0</td>\n",
" <td>7</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>rcu_preempt</td>\n",
" <td>7</td>\n",
" <td>120</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>130884 rows × 10 columns</p>\n",
"</div>"
],
"text/plain": [
" __comm __cpu __pid next_comm next_pid next_prio \\\n",
"Time \n",
"0.000272 <...> 1 20278 swapper/1 0 120 \n",
"0.000348 <idle> 0 0 sh 20277 120 \n",
"0.001321 <...> 0 20277 sudo 20276 120 \n",
"0.001357 <idle> 1 0 rcu_preempt 7 120 \n",
"0.001458 rcu_preempt 1 7 swapper/1 0 120 \n",
"0.005202 <...> 0 20276 ksdioirqd/mmc2 1364 98 \n",
"0.005349 ksdioirqd/mmc2 0 1364 rsyslogd 394 120 \n",
"0.005464 <idle> 1 0 ksoftirqd/1 14 120 \n",
"0.005528 ksoftirqd/1 1 14 rcu_preempt 7 120 \n",
"0.005612 rcu_preempt 1 7 swapper/1 0 120 \n",
"0.005616 rsyslogd 0 394 rs:main Q:Reg 380 120 \n",
"0.006245 rs:main 0 380 sudo 20276 120 \n",
"0.007334 <...> 0 20276 rcu_sched 8 120 \n",
"0.007425 <idle> 1 0 bash 19394 120 \n",
"0.007450 <...> 0 8 swapper/0 0 120 \n",
"0.008416 bash 1 19394 kworker/1:2 19472 120 \n",
"0.008562 <...> 1 19472 sshd 15461 120 \n",
"0.009328 sshd 1 15461 rcu_preempt 7 120 \n",
"0.009437 rcu_preempt 1 7 swapper/1 0 120 \n",
"0.009632 <idle> 0 0 rcu_sched 8 120 \n",
"0.009731 <...> 0 8 swapper/0 0 120 \n",
"0.013650 <idle> 1 0 ksoftirqd/1 14 120 \n",
"0.013727 ksoftirqd/1 1 14 rcu_preempt 7 120 \n",
"0.013839 rcu_preempt 1 7 swapper/1 0 120 \n",
"0.017585 <idle> 0 0 ksdioirqd/mmc2 1364 98 \n",
"0.017587 <idle> 1 0 rcu_preempt 7 120 \n",
"0.017681 rcu_preempt 1 7 swapper/1 0 120 \n",
"0.017830 ksdioirqd/mmc2 0 1364 ksoftirqd/0 3 120 \n",
"0.017886 ksoftirqd/0 0 3 rcu_sched 8 120 \n",
"0.017968 <...> 0 8 swapper/0 0 120 \n",
"... ... ... ... ... ... ... \n",
"35.301101 sudo 1 20990 ksdioirqd/mmc2 1364 98 \n",
"35.301191 ksdioirqd/mmc2 1 1364 sudo 20990 120 \n",
"35.301333 sudo 1 20990 ksdioirqd/mmc2 1364 98 \n",
"35.301381 ksdioirqd/mmc2 1 1364 sudo 20990 120 \n",
"35.301421 <idle> 0 0 rcu_preempt 7 120 \n",
"35.301516 rcu_preempt 0 7 swapper/0 0 120 \n",
"35.301782 sudo 1 20990 rsyslogd 394 120 \n",
"35.302128 rsyslogd 1 394 sudo 20990 120 \n",
"35.302198 <idle> 0 0 rs:main Q:Reg 380 120 \n",
"35.302846 rs:main 0 380 swapper/0 0 120 \n",
"35.303877 <idle> 3 0 sudo 20991 120 \n",
"35.303987 sudo 1 20990 swapper/1 0 120 \n",
"35.305325 sh 3 20991 migration/3 23 0 \n",
"35.305428 migration/3 3 23 swapper/3 0 120 \n",
"35.305455 <idle> 1 0 sudo 20991 120 \n",
"35.309369 <idle> 0 0 rcu_preempt 7 120 \n",
"35.309480 rcu_preempt 0 7 swapper/0 0 120 \n",
"35.311031 sh 1 20991 sudo 20990 120 \n",
"35.311063 <idle> 3 0 sh 20992 120 \n",
"35.311164 sudo 1 20990 swapper/1 0 120 \n",
"35.311548 trace-cmd 3 20992 migration/3 23 0 \n",
"35.311645 migration/3 3 23 swapper/3 0 120 \n",
"35.311839 <idle> 1 0 sh 20992 120 \n",
"35.313244 trace-cmd 1 20992 ksdioirqd/mmc2 1364 98 \n",
"35.313342 ksdioirqd/mmc2 1 1364 ksoftirqd/1 14 120 \n",
"35.313390 ksoftirqd/1 1 14 ksdioirqd/mmc2 1364 98 \n",
"35.313429 <idle> 0 0 rcu_preempt 7 120 \n",
"35.313437 ksdioirqd/mmc2 1 1364 ksoftirqd/1 14 120 \n",
"35.313485 ksoftirqd/1 1 14 trace-cmd 20992 120 \n",
"35.313536 rcu_preempt 0 7 swapper/0 0 120 \n",
"\n",
" prev_comm prev_pid prev_prio prev_state \n",
"Time \n",
"0.000272 trace-cmd 20278 120 64 \n",
"0.000348 swapper/0 0 120 0 \n",
"0.001321 sh 20277 120 64 \n",
"0.001357 swapper/1 0 120 0 \n",
"0.001458 rcu_preempt 7 120 1 \n",
"0.005202 sudo 20276 120 1024 \n",
"0.005349 ksdioirqd/mmc2 1364 98 1 \n",
"0.005464 swapper/1 0 120 0 \n",
"0.005528 ksoftirqd/1 14 120 1 \n",
"0.005612 rcu_preempt 7 120 1 \n",
"0.005616 rsyslogd 394 120 1 \n",
"0.006245 rs:main Q:Reg 380 120 1 \n",
"0.007334 sudo 20276 120 64 \n",
"0.007425 swapper/1 0 120 0 \n",
"0.007450 rcu_sched 8 120 1 \n",
"0.008416 bash 19394 120 1 \n",
"0.008562 kworker/1:2 19472 120 1 \n",
"0.009328 sshd 15461 120 1 \n",
"0.009437 rcu_preempt 7 120 1 \n",
"0.009632 swapper/0 0 120 0 \n",
"0.009731 rcu_sched 8 120 1 \n",
"0.013650 swapper/1 0 120 0 \n",
"0.013727 ksoftirqd/1 14 120 1 \n",
"0.013839 rcu_preempt 7 120 1 \n",
"0.017585 swapper/0 0 120 0 \n",
"0.017587 swapper/1 0 120 0 \n",
"0.017681 rcu_preempt 7 120 1 \n",
"0.017830 ksdioirqd/mmc2 1364 98 1 \n",
"0.017886 ksoftirqd/0 3 120 1 \n",
"0.017968 rcu_sched 8 120 1 \n",
"... ... ... ... ... \n",
"35.301101 sudo 20990 120 0 \n",
"35.301191 ksdioirqd/mmc2 1364 98 2 \n",
"35.301333 sudo 20990 120 1024 \n",
"35.301381 ksdioirqd/mmc2 1364 98 1 \n",
"35.301421 swapper/0 0 120 0 \n",
"35.301516 rcu_preempt 7 120 1 \n",
"35.301782 sudo 20990 120 1024 \n",
"35.302128 rsyslogd 394 120 1 \n",
"35.302198 swapper/0 0 120 0 \n",
"35.302846 rs:main Q:Reg 380 120 1 \n",
"35.303877 swapper/3 0 120 0 \n",
"35.303987 sudo 20990 120 1 \n",
"35.305325 sudo 20991 120 1024 \n",
"35.305428 migration/3 23 0 1 \n",
"35.305455 swapper/1 0 120 0 \n",
"35.309369 swapper/0 0 120 0 \n",
"35.309480 rcu_preempt 7 120 1 \n",
"35.311031 sh 20991 120 1 \n",
"35.311063 swapper/3 0 120 0 \n",
"35.311164 sudo 20990 120 1 \n",
"35.311548 sh 20992 120 1024 \n",
"35.311645 migration/3 23 0 1 \n",
"35.311839 swapper/1 0 120 0 \n",
"35.313244 trace-cmd 20992 120 1024 \n",
"35.313342 ksdioirqd/mmc2 1364 98 2 \n",
"35.313390 ksoftirqd/1 14 120 1024 \n",
"35.313429 swapper/0 0 120 0 \n",
"35.313437 ksdioirqd/mmc2 1364 98 1 \n",
"35.313485 ksoftirqd/1 14 120 1 \n",
"35.313536 rcu_preempt 7 120 1 \n",
"\n",
"[130884 rows x 10 columns]"
]
},
"execution_count": 325,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's get a reference to the PANDAs DataFrame corresponding to the\n",
"# \"sched_switch\" events\n",
"logging.info(\"The 'sched_switch' events are collected into this DataFrame:\")\n",
"df = ftrace.sched_switch.data_frame\n",
"df#.head(2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**NOTE:** We can use **head()** to report only a limited number of events"
]
},
{
"cell_type": "code",
"execution_count": 326,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:51:53 INFO : This is the DataFrame for 'cpu_frequency' events:\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>__comm</th>\n",
" <th>__cpu</th>\n",
" <th>__pid</th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.661132</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>2</td>\n",
" <td>1807000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.661136</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>3</td>\n",
" <td>1807000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" __comm __cpu __pid cpu frequency\n",
"Time \n",
"0.661132 kschedfreq:2 2 119 2 1807000\n",
"0.661136 kschedfreq:2 2 119 3 1807000"
]
},
"execution_count": 326,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# All events parsed in the trace have an associated DataFrame\n",
"logging.info(\"This is the DataFrame for 'cpu_frequency' events:\")\n",
"df = ftrace.cpu_frequency.data_frame\n",
"df.head(2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Common DataFrame Operations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On DataFrames is possible to execute a number of different operations.\n",
"Most commonly we are interested in:\n",
"- focus only on certain columns\n",
"- filtering events based on different conditions\n",
"- joining two or more DataFrames\n",
"- resuming statistical data of a DataFrame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Columns selection"
]
},
{
"cell_type": "code",
"execution_count": 330,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>__comm</th>\n",
" <th>__cpu</th>\n",
" <th>__pid</th>\n",
" <th>next_comm</th>\n",
" <th>next_pid</th>\n",
" <th>next_prio</th>\n",
" <th>prev_comm</th>\n",
" <th>prev_pid</th>\n",
" <th>prev_prio</th>\n",
" <th>prev_state</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.000272</th>\n",
" <td>&lt;...&gt;</td>\n",
" <td>1</td>\n",
" <td>20278</td>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>trace-cmd</td>\n",
" <td>20278</td>\n",
" <td>120</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000348</th>\n",
" <td>&lt;idle&gt;</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>sh</td>\n",
" <td>20277</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" __comm __cpu __pid next_comm next_pid next_prio prev_comm \\\n",
"Time \n",
"0.000272 <...> 1 20278 swapper/1 0 120 trace-cmd \n",
"0.000348 <idle> 0 0 sh 20277 120 swapper/0 \n",
"\n",
" prev_pid prev_prio prev_state \n",
"Time \n",
"0.000272 20278 120 64 \n",
"0.000348 0 120 0 "
]
},
"execution_count": 330,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = ftrace.sched_switch.data_frame\n",
"df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 331,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>next_comm</th>\n",
" <th>next_pid</th>\n",
" <th>next_prio</th>\n",
" <th>prev_comm</th>\n",
" <th>prev_pid</th>\n",
" <th>prev_prio</th>\n",
" <th>prev_state</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.000272</th>\n",
" <td>swapper/1</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>trace-cmd</td>\n",
" <td>20278</td>\n",
" <td>120</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000348</th>\n",
" <td>sh</td>\n",
" <td>20277</td>\n",
" <td>120</td>\n",
" <td>swapper/0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" next_comm next_pid next_prio prev_comm prev_pid prev_prio \\\n",
"Time \n",
"0.000272 swapper/1 0 120 trace-cmd 20278 120 \n",
"0.000348 sh 20277 120 swapper/0 0 120 \n",
"\n",
" prev_state \n",
"Time \n",
"0.000272 64 \n",
"0.000348 0 "
]
},
"execution_count": 331,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# The \"ix\" operator allow to select ranges of [rows:columns]\n",
"df = df.ix[:,'next_comm':'prev_state']\n",
"df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 332,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:52:30 INFO : Found 130884 sched_switch events: \n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>next_pid</th>\n",
" <th>next_comm</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.000272</th>\n",
" <td>0</td>\n",
" <td>swapper/1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000348</th>\n",
" <td>20277</td>\n",
" <td>sh</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" next_pid next_comm\n",
"Time \n",
"0.000272 0 swapper/1\n",
"0.000348 20277 sh"
]
},
"execution_count": 332,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# We can also filter by listing the columns we are interested into\n",
"tasks = df[['next_pid', 'next_comm']]\n",
"logging.info(\"Found %d sched_switch events: \", len(tasks))\n",
"tasks.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 333,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"10:52:33 INFO : The trace has 855 unique PIDs\n"
]
},
{
"data": {
"text/plain": [
"{0: 'swapper/2',\n",
" 1: 'init',\n",
" 2: 'kthreadd',\n",
" 3: 'ksoftirqd/0',\n",
" 6: 'kworker/u8:0',\n",
" 7: 'rcu_preempt',\n",
" 8: 'rcu_sched',\n",
" 10: 'migration/0',\n",
" 11: 'watchdog/0',\n",
" 12: 'watchdog/1',\n",
" 13: 'migration/1',\n",
" 14: 'ksoftirqd/1',\n",
" 17: 'watchdog/2',\n",
" 18: 'migration/2',\n",
" 19: 'ksoftirqd/2',\n",
" 22: 'watchdog/3',\n",
" 23: 'migration/3',\n",
" 24: 'ksoftirqd/3',\n",
" 31: 'khungtaskd',\n",
" 66: 'fsnotify_mark',\n",
" 83: 'spi32766',\n",
" 88: 'kworker/1:1',\n",
" 89: 'kworker/0:1',\n",
" 110: 'kworker/u8:3',\n",
" 114: 'kworker/0:2',\n",
" 118: 'kschedfreq:0',\n",
" 119: 'kschedfreq:2',\n",
" 122: 'mmcqd/0',\n",
" 123: 'mmcqd/0boot0',\n",
" 124: 'mmcqd/0boot1',\n",
" 125: 'mmcqd/0rpmb',\n",
" 128: 'pvr_defer_free',\n",
" 129: 'pvr_device_wdg',\n",
" 134: 'kworker/3:2',\n",
" 136: 'kworker/0:1H',\n",
" 138: 'kworker/1:1H',\n",
" 166: 'udevd',\n",
" 209: 'jbd2/mmcblk0p1-',\n",
" 239: 'loop0',\n",
" 260: 'jbd2/dm-1-8',\n",
" 264: 'kworker/2:1H',\n",
" 286: 'kworker/3:1H',\n",
" 369: 'rsyslogd',\n",
" 380: 'rs:main Q:Reg',\n",
" 394: 'rsyslogd',\n",
" 395: 'rsyslogd',\n",
" 398: 'dbus-daemon',\n",
" 489: 'wpa_supplicant',\n",
" 492: 'daisydog',\n",
" 606: 'tcsd',\n",
" 615: 'chapsd',\n",
" 648: 'tcsd',\n",
" 649: 'powerd',\n",
" 650: 'permission_brok',\n",
" 656: 'inotify_reader',\n",
" 657: 'cryptohomed',\n",
" 658: 'tcsd',\n",
" 679: 'shill',\n",
" 843: 'dhcpcd',\n",
" 1150: 'mtpd',\n",
" 1179: 'metrics_daemon',\n",
" 1184: 'mtpd',\n",
" 1190: 'cras',\n",
" 1197: 'bluetoothd',\n",
" 1232: 'disks',\n",
" 1252: 'MountThread',\n",
" 1261: 'sshd',\n",
" 1264: 'update_engine',\n",
" 1364: 'ksdioirqd/mmc2',\n",
" 2108: 'warn_collector',\n",
" 2252: 'netfilter-queue',\n",
" 2266: 'tlsdated',\n",
" 2267: 'logger',\n",
" 2298: 'kworker/u9:4',\n",
" 15461: 'sshd',\n",
" 19394: 'bash',\n",
" 19469: 'kworker/2:3',\n",
" 19472: 'kworker/1:2',\n",
" 19861: 'kworker/u8:4',\n",
" 19897: 'session_manager',\n",
" 19918: 'debugd',\n",
" 19933: 'chrome',\n",
" 19936: 'sandbox_ipc_thr',\n",
" 19938: 'chrome',\n",
" 19944: 'nacl_helper_boo',\n",
" 19946: 'nacl_helper_non',\n",
" 19949: 'chrome',\n",
" 19950: 'chrome',\n",
" 19963: 'D-Bus thread',\n",
" 19964: 'WorkerPool/1996',\n",
" 19965: 'WorkerPool/1996',\n",
" 19966: 'CrShutdownDetec',\n",
" 19967: 'BrowserBlocking',\n",
" 19968: 'Chrome_DBThread',\n",
" 19969: 'Chrome_FileThre',\n",
" 19970: 'Chrome_FileUser',\n",
" 19971: 'Chrome_ProcessL',\n",
" 19972: 'Chrome_CacheThr',\n",
" 19973: 'Chrome_IOThread',\n",
" 19974: 'IndexedDB',\n",
" 19975: 'CompositorTileW',\n",
" 19976: 'AudioThread',\n",
" 19979: 'BrowserWatchdog',\n",
" 19987: 'handle-watcher-',\n",
" 19988: 'gpu-process_cra',\n",
" 19990: 'chrome',\n",
" 19994: 'CachePoolWorker',\n",
" 19995: 'BrowserBlocking',\n",
" 19997: 'evdev',\n",
" 20013: 'inotify_reader',\n",
" 20014: 'Chrome_HistoryT',\n",
" 20015: 'BrowserBlocking',\n",
" 20016: 'renderer_crash_',\n",
" 20017: 'chrome',\n",
" 20019: 'chrome',\n",
" 20020: 'Watchdog',\n",
" 20022: 'Chrome_ChildIOT',\n",
" 20023: 'Compositor',\n",
" 20024: 'CompositorTileW',\n",
" 20025: 'CompositorTileW',\n",
" 20026: 'chrome',\n",
" 20027: 'UsbEventHandler',\n",
" 20030: 'handle-watcher-',\n",
" 20032: 'Chrome_ChildIOT',\n",
" 20034: 'DrmThread',\n",
" 20035: 'handle-watcher-',\n",
" 20041: 'HTMLParserThrea',\n",
" 20043: 'WorkerPool/9',\n",
" 20046: 'WorkerPool/12',\n",
" 20052: 'chrome',\n",
" 20054: 'Chrome_ChildIOT',\n",
" 20055: 'Compositor',\n",
" 20056: 'CompositorTileW',\n",
" 20057: 'CompositorTileW',\n",
" 20058: 'handle-watcher-',\n",
" 20060: 'HTMLParserThrea',\n",
" 20062: 'WorkerPool/9',\n",
" 20064: 'WorkerPool/11',\n",
" 20066: 'WorkerPool/12',\n",
" 20067: 'WorkerPool/2006',\n",
" 20088: 'kworker/u9:0',\n",
" 20138: 'watch',\n",
" 20276: 'sudo',\n",
" 20277: 'sh',\n",
" 20282: 'sudo',\n",
" 20283: 'sh',\n",
" 20284: 'watch',\n",
" 20285: 'sh',\n",
" 20286: 'sh',\n",
" 20287: 'sudo',\n",
" 20288: 'sh',\n",
" 20289: 'shutils',\n",
" 20290: 'cat',\n",
" 20291: 'watch',\n",
" 20292: 'sh',\n",
" 20293: 'sh',\n",
" 20294: 'sshd',\n",
" 20295: 'sshd',\n",
" 20296: 'sshd',\n",
" 20297: 'sshd',\n",
" 20298: 'sshd',\n",
" 20299: 'sshd',\n",
" 20300: 'bash',\n",
" 20301: 'bash',\n",
" 20302: 'chrome',\n",
" 20303: 'netstat',\n",
" 20304: 'watch',\n",
" 20305: 'sh',\n",
" 20306: 'netstat',\n",
" 20307: 'sh',\n",
" 20308: 'netstat',\n",
" 20309: 'stop',\n",
" 20310: 'rm',\n",
" 20311: 'job-filter',\n",
" 20312: 'job-filter',\n",
" 20313: 'job-filter',\n",
" 20314: 'sh',\n",
" 20315: 'shill_logout_us',\n",
" 20316: 'sh',\n",
" 20317: 'basename',\n",
" 20318: 'mkdir',\n",
" 20319: 'rm',\n",
" 20320: 'dbus-send',\n",
" 20321: 'rm',\n",
" 20322: 'rm',\n",
" 20323: 'kworker/0:0',\n",
" 20324: 'Shutdown watchd',\n",
" 20325: 'Chrome_ProcessL',\n",
" 20326: 'kworker/u8:1',\n",
" 20327: 'sh',\n",
" 20328: 'bootstat',\n",
" 20329: 'cryptohome',\n",
" 20330: 'sh',\n",
" 20331: 'lsof',\n",
" 20332: 'sort',\n",
" 20333: 'lsof',\n",
" 20334: 'watch',\n",
" 20335: 'sh',\n",
" 20336: 'cat',\n",
" 20337: 'udevd',\n",
" 20338: 'sudo',\n",
" 20339: 'kill',\n",
" 20340: 'ps',\n",
" 20341: 'logger',\n",
" 20342: 'bootstat',\n",
" 20343: 'pkill',\n",
" 20344: 'pgrep',\n",
" 20345: 'sh',\n",
" 20346: 'cryptohome',\n",
" 20347: 'bootstat',\n",
" 20348: 'sshd',\n",
" 20349: 'rm',\n",
" 20350: 'status',\n",
" 20351: 'start',\n",
" 20352: 'job-filter',\n",
" 20353: 'sh',\n",
" 20354: 'job-filter',\n",
" 20355: 'job-filter',\n",
" 20356: 'pvrsrvctl',\n",
" 20357: 'sh',\n",
" 20358: 'sh',\n",
" 20359: 'touch',\n",
" 20360: 'bootstat',\n",
" 20361: 'chmod',\n",
" 20362: 'crossystem',\n",
" 20363: 'dump_vpd_log',\n",
" 20364: 'mkdir',\n",
" 20365: 'mktemp',\n",
" 20366: 'mkdir',\n",
" 20367: 'bootstat',\n",
" 20368: 'chown',\n",
" 20369: 'chmod',\n",
" 20370: 'lockbox-cache',\n",
" 20371: 'chmod',\n",
" 20372: 'mktemp',\n",
" 20373: 'mktemp',\n",
" 20374: 'mktemp',\n",
" 20375: 'getopt',\n",
" 20376: 'getopt',\n",
" 20377: 'dump_vpd_log',\n",
" 20378: 'dump_vpd_log',\n",
" 20379: 'dump_vpd_log',\n",
" 20380: 'dump_vpd_log',\n",
" 20381: 'grep',\n",
" 20382: 'dump_vpd_log',\n",
" 20383: 'grep',\n",
" 20384: 'dump_vpd_log',\n",
" 20385: 'grep',\n",
" 20386: 'watch',\n",
" 20387: 'sh',\n",
" 20388: 'cat',\n",
" 20389: 'dump_vpd_log',\n",
" 20390: 'grep',\n",
" 20391: 'dump_vpd_log',\n",
" 20392: 'grep',\n",
" 20393: 'dump_vpd_log',\n",
" 20394: 'grep',\n",
" 20395: 'dump_vpd_log',\n",
" 20396: 'grep',\n",
" 20397: 'dump_vpd_log',\n",
" 20398: 'grep',\n",
" 20399: 'dump_vpd_log',\n",
" 20400: 'grep',\n",
" 20401: 'dump_vpd_log',\n",
" 20402: 'grep',\n",
" 20403: 'dump_vpd_log',\n",
" 20404: 'grep',\n",
" 20405: 'dump_vpd_log',\n",
" 20406: 'grep',\n",
" 20407: 'dump_vpd_log',\n",
" 20408: 'grep',\n",
" 20409: 'dump_vpd_log',\n",
" 20410: 'dump_vpd_log',\n",
" 20411: 'dump_vpd_log',\n",
" 20412: 'dump_vpd_log',\n",
" 20413: 'dump_vpd_log',\n",
" 20414: 'dump_vpd_log',\n",
" 20415: 'dump_vpd_log',\n",
" 20416: 'dump_vpd_log',\n",
" 20417: 'dump_vpd_log',\n",
" 20418: 'dump_vpd_log',\n",
" 20419: 'dump_vpd_log',\n",
" 20420: 'dump_vpd_log',\n",
" 20421: 'dump_vpd_log',\n",
" 20422: 'dump_vpd_log',\n",
" 20423: 'dump_vpd_log',\n",
" 20424: 'sed',\n",
" 20425: 'dump_vpd_log',\n",
" 20426: 'dump_vpd_log',\n",
" 20427: 'dump_vpd_log',\n",
" 20428: 'dump_vpd_log',\n",
" 20429: 'dump_vpd_log',\n",
" 20430: 'dump_vpd_log',\n",
" 20431: 'dump_vpd_log',\n",
" 20432: 'getopt',\n",
" 20433: 'expr',\n",
" 20434: 'expr',\n",
" 20435: 'dump_vpd_log',\n",
" 20436: 'grep',\n",
" 20437: 'dump_vpd_log',\n",
" 20438: 'expr',\n",
" 20439: 'dump_vpd_log',\n",
" 20440: 'grep',\n",
" 20441: 'dump_vpd_log',\n",
" 20442: 'rm',\n",
" 20443: 'rm',\n",
" 20444: 'rm',\n",
" 20445: 'dirname',\n",
" 20446: 'dirname',\n",
" 20447: 'mkdir',\n",
" 20448: 'dump_vpd_log',\n",
" 20449: 'sed',\n",
" 20450: 'rm',\n",
" 20451: 'sh',\n",
" 20452: 'mkdir',\n",
" 20453: 'date',\n",
" 20454: 'ln',\n",
" 20455: 'chown',\n",
" 20456: 'session_manager',\n",
" 20457: 'job-filter',\n",
" 20458: 'ps',\n",
" 20459: 'sh',\n",
" 20460: 'chgrp',\n",
" 20461: 'chmod',\n",
" 20462: 'chgrp',\n",
" 20463: 'chmod',\n",
" 20464: 'chgrp',\n",
" 20465: 'chmod',\n",
" 20466: 'chgrp',\n",
" 20467: 'chmod',\n",
" 20468: 'chgrp',\n",
" 20469: 'chmod',\n",
" 20470: 'chgrp',\n",
" 20471: 'chmod',\n",
" 20472: 'session_manager',\n",
" 20473: 'cp',\n",
" 20474: 'is_developer_en',\n",
" 20475: 'crossystem',\n",
" 20476: 'debugd',\n",
" 20477: 'chrome',\n",
" 20478: 'minijail0',\n",
" 20479: 'is_developer_en',\n",
" 20480: 'crossystem',\n",
" 20481: 'sandbox_ipc_thr',\n",
" 20482: 'chrome',\n",
" 20483: 'ps',\n",
" 20484: 'chrome',\n",
" 20485: 'cryptohome',\n",
" 20486: 'nacl_helper_boo',\n",
" 20487: 'nacl_helper_boo',\n",
" 20488: 'nacl_helper_non',\n",
" 20489: 'nacl_helper_non',\n",
" 20490: 'chrome',\n",
" 20491: 'chrome',\n",
" 20492: 'chrome',\n",
" 20493: 'watch',\n",
" 20494: 'sh',\n",
" 20495: 'cat',\n",
" 20496: 'wget',\n",
" 20497: 'sleep',\n",
" 20498: 'dbus-send',\n",
" 20499: 'kworker/1:0',\n",
" 20500: 'sleep',\n",
" 20501: 'wget',\n",
" 20502: 'wget',\n",
" 20503: 'wget',\n",
" 20504: 'watch',\n",
" 20505: 'sh',\n",
" 20506: 'sh',\n",
" 20507: 'wget',\n",
" 20508: 'wget',\n",
" 20509: 'wget',\n",
" 20510: 'wget',\n",
" 20511: 'wget',\n",
" 20512: 'wget',\n",
" 20513: 'wget',\n",
" 20514: 'watch',\n",
" 20515: 'sh',\n",
" 20516: 'cat',\n",
" 20517: 'wget',\n",
" 20518: 'wget',\n",
" 20519: 'wget',\n",
" 20520: 'wget',\n",
" 20521: 'watch',\n",
" 20522: 'sh',\n",
" 20523: 'cat',\n",
" 20524: 'wget',\n",
" 20525: 'wget',\n",
" 20526: 'wget',\n",
" 20527: 'chrome',\n",
" 20528: 'watch',\n",
" 20529: 'sh',\n",
" 20530: 'sh',\n",
" 20531: 'sandbox_ipc_thr',\n",
" 20532: 'chrome',\n",
" 20533: 'chrome',\n",
" 20534: 'wget',\n",
" 20535: 'nacl_helper_boo',\n",
" 20536: 'nacl_helper_boo',\n",
" 20537: 'nacl_helper_non',\n",
" 20538: 'nacl_helper_non',\n",
" 20539: 'chrome',\n",
" 20540: 'chrome',\n",
" 20541: 'chrome',\n",
" 20542: 'D-Bus thread',\n",
" 20543: 'WorkerPool/2054',\n",
" 20544: 'WorkerPool/2054',\n",
" 20545: 'CrShutdownDetec',\n",
" 20546: 'BrowserBlocking',\n",
" 20547: 'Chrome_DBThread',\n",
" 20548: 'Chrome_FileThre',\n",
" 20549: 'Chrome_FileUser',\n",
" 20550: 'Chrome_ProcessL',\n",
" 20551: 'Chrome_CacheThr',\n",
" 20552: 'Chrome_IOThread',\n",
" 20553: 'IndexedDB',\n",
" 20554: 'CompositorTileW',\n",
" 20555: 'AudioThread',\n",
" 20556: 'crossystem',\n",
" 20557: 'handle-watcher-',\n",
" 20558: 'BrowserWatchdog',\n",
" 20559: 'gpu-process_cra',\n",
" 20560: 'chrome',\n",
" 20561: 'crossystem',\n",
" 20562: 'crossystem',\n",
" 20563: 'CachePoolWorker',\n",
" 20564: 'crossystem',\n",
" 20565: 'crossystem',\n",
" 20566: 'crossystem',\n",
" 20567: 'mosys',\n",
" 20568: 'crossystem',\n",
" 20569: 'mosys',\n",
" 20570: 'crossystem',\n",
" 20571: 'mosys',\n",
" 20572: 'crossystem',\n",
" 20573: 'crossystem',\n",
" 20574: 'crossystem',\n",
" 20575: 'crossystem',\n",
" 20576: 'wget',\n",
" 20577: 'crossystem',\n",
" 20578: 'crossystem',\n",
" 20579: 'crossystem',\n",
" 20580: 'crossystem',\n",
" 20581: 'crossystem',\n",
" 20582: 'mosys',\n",
" 20583: 'mosys',\n",
" 20584: 'mosys',\n",
" 20585: 'mosys',\n",
" 20586: 'mosys',\n",
" 20587: 'mosys',\n",
" 20588: 'mosys',\n",
" 20589: 'mosys',\n",
" 20590: 'mosys',\n",
" 20591: 'inotify_reader',\n",
" 20592: 'chrome',\n",
" 20593: 'chrome',\n",
" 20594: 'Watchdog',\n",
" 20595: 'evdev',\n",
" 20596: 'Chrome_ChildIOT',\n",
" 20597: 'DrmThread',\n",
" 20598: 'handle-watcher-',\n",
" 20599: 'BrowserBlocking',\n",
" 20600: 'Chrome_HistoryT',\n",
" 20601: 'BrowserBlocking',\n",
" 20602: 'Startup watchdo',\n",
" 20603: 'Chrome_DevTools',\n",
" 20604: 'WorkerPool/2060',\n",
" 20605: 'wget',\n",
" 20606: 'watch',\n",
" 20607: 'sh',\n",
" 20608: 'cat',\n",
" 20609: 'WorkerPool/2060',\n",
" 20610: 'WorkerPool/2061',\n",
" 20611: 'WorkerPool/2061',\n",
" 20612: 'chrome',\n",
" 20613: 'chrome',\n",
" 20614: 'renderer_crash_',\n",
" 20615: 'chrome',\n",
" 20616: 'Chrome_ChildIOT',\n",
" 20617: 'Compositor',\n",
" 20618: 'CompositorTileW',\n",
" 20619: 'CompositorTileW',\n",
" 20620: 'chrome',\n",
" 20621: 'UsbEventHandler',\n",
" 20622: 'handle-watcher-',\n",
" 20623: 'HTMLParserThrea',\n",
" 20624: 'WorkerPool/8',\n",
" 20625: 'watch',\n",
" 20626: 'sh',\n",
" 20627: 'cat',\n",
" 20628: 'WorkerPool/9',\n",
" 20629: 'WorkerPool/10',\n",
" 20630: 'WorkerPool/11',\n",
" 20631: 'watch',\n",
" 20632: 'sh',\n",
" 20633: 'cat',\n",
" 20634: 'cryptohome-path',\n",
" 20635: 'chrome',\n",
" 20636: 'tcsd',\n",
" 20637: 'df',\n",
" 20638: 'WorkerPool/12',\n",
" 20639: 'watch',\n",
" 20640: 'sh',\n",
" 20641: 'cat',\n",
" 20642: 'cryptohome-path',\n",
" 20643: 'df',\n",
" 20644: 'cryptohome-path',\n",
" 20645: 'df',\n",
" 20646: 'cryptohome-path',\n",
" 20647: 'df',\n",
" 20648: 'udevd',\n",
" 20649: 'sshd',\n",
" 20650: 'df',\n",
" 20651: 'sh',\n",
" 20652: 'chapsd',\n",
" 20653: 'crossystem',\n",
" 20654: 'rm',\n",
" 20655: 'job-filter',\n",
" 20656: 'init',\n",
" 20657: 'sh',\n",
" 20658: 'shill_login_use',\n",
" 20659: 'touch',\n",
" 20660: 'basename',\n",
" 20661: 'cryptohome-path',\n",
" 20662: 'basename',\n",
" 20663: 'cryptohome-path',\n",
" 20664: 'mkdir',\n",
" 20665: 'mkdir',\n",
" 20666: 'chrome',\n",
" 20667: 'ln',\n",
" 20668: 'mkdir',\n",
" 20669: 'ln',\n",
" 20670: 'dbus-send',\n",
" 20671: 'dbus-send',\n",
" 20672: 'keygen',\n",
" 20673: 'watch',\n",
" 20674: 'sh',\n",
" 20675: 'cryptohome-path',\n",
" 20676: 'sh',\n",
" 20677: 'Chrome_HistoryT',\n",
" 20678: 'df',\n",
" 20679: 'chrome',\n",
" 20680: 'Chrome_ChildIOT',\n",
" 20681: 'Compositor',\n",
" 20682: 'CompositorTileW',\n",
" 20683: 'CompositorTileW',\n",
" 20684: 'handle-watcher-',\n",
" 20685: 'chrome',\n",
" 20686: 'extension_crash',\n",
" 20687: 'chrome',\n",
" 20688: 'Chrome_ChildIOT',\n",
" 20689: 'Compositor',\n",
" 20690: 'CompositorTileW',\n",
" 20691: 'CompositorTileW',\n",
" 20692: 'handle-watcher-',\n",
" 20693: 'kworker/u9:1',\n",
" 20694: 'HTMLParserThrea',\n",
" 20695: 'HTMLParserThrea',\n",
" 20696: 'watch',\n",
" 20697: 'sh',\n",
" 20698: 'sh',\n",
" 20699: 'WorkerPool/8',\n",
" 20700: 'WorkerPool/9',\n",
" 20701: 'WorkerPool/10',\n",
" 20702: 'WorkerPool/11',\n",
" 20703: 'WorkerPool/12',\n",
" 20704: 'WorkerPool/13',\n",
" 20705: 'chrome',\n",
" 20706: 'Chrome_ChildIOT',\n",
" 20707: 'Compositor',\n",
" 20708: 'CompositorTileW',\n",
" 20709: 'CompositorTileW',\n",
" 20710: 'chrome',\n",
" 20711: 'handle-watcher-',\n",
" 20712: 'HTMLParserThrea',\n",
" 20713: 'chrome',\n",
" 20714: 'WorkerPool/8',\n",
" 20715: 'watch',\n",
" 20716: 'sh',\n",
" 20717: 'cat',\n",
" 20718: 'watch',\n",
" 20719: 'sh',\n",
" 20720: 'cat',\n",
" 20721: 'ScriptStreamerT',\n",
" 20722: 'WorkerPool/10',\n",
" 20723: 'WorkerPool/11',\n",
" 20724: 'watch',\n",
" 20725: 'sh',\n",
" 20726: 'cat',\n",
" 20727: 'watch',\n",
" 20728: 'sh',\n",
" 20729: 'cat',\n",
" 20730: 'chrome',\n",
" 20731: 'chrome',\n",
" 20732: 'Chrome_ChildIOT',\n",
" 20733: 'Compositor',\n",
" 20734: 'CompositorTileW',\n",
" 20735: 'CompositorTileW',\n",
" 20736: 'handle-watcher-',\n",
" 20737: 'chrome',\n",
" 20738: 'HTMLParserThrea',\n",
" 20739: 'watch',\n",
" 20740: 'sh',\n",
" 20741: 'cat',\n",
" 20742: 'watch',\n",
" 20743: 'sh',\n",
" 20744: 'cat',\n",
" 20745: 'watch',\n",
" 20746: 'sh',\n",
" 20747: 'cat',\n",
" 20748: 'mosys',\n",
" 20749: 'sh',\n",
" 20750: 'which',\n",
" 20751: 'flashrom',\n",
" 20752: 'sh',\n",
" 20753: 'sh',\n",
" 20754: 'watch',\n",
" 20755: 'sh',\n",
" 20756: 'cat',\n",
" 20757: 'WorkerPool/12',\n",
" 20758: 'watch',\n",
" 20759: 'sh',\n",
" 20760: 'cat',\n",
" 20761: 'watch',\n",
" 20762: 'sh',\n",
" 20763: 'cat',\n",
" 20764: 'watch',\n",
" 20765: 'sh',\n",
" 20766: 'cat',\n",
" 20767: 'watch',\n",
" 20768: 'sh',\n",
" 20769: 'cat',\n",
" 20770: 'watch',\n",
" 20771: 'sh',\n",
" 20772: 'sh',\n",
" 20773: 'ps',\n",
" 20774: 'watch',\n",
" 20775: 'sh',\n",
" 20776: 'sh',\n",
" 20777: 'status',\n",
" 20778: 'restart',\n",
" 20779: 'job-filter',\n",
" 20780: 'init',\n",
" 20781: 'init',\n",
" 20782: 'sh',\n",
" 20783: 'shill_logout_us',\n",
" 20784: 'basename',\n",
" 20785: 'sh',\n",
" 20786: 'mkdir',\n",
" 20787: 'dbus-send',\n",
" 20788: 'rm',\n",
" 20789: 'rm',\n",
" 20790: 'rm',\n",
" 20791: 'Shutdown watchd',\n",
" 20792: 'chrome',\n",
" 20793: 'Chrome_ProcessL',\n",
" 20794: 'kworker/0:3',\n",
" 20795: 'watch',\n",
" 20796: 'sh',\n",
" 20797: 'sh',\n",
" 20798: 'sh',\n",
" 20799: 'bootstat',\n",
" 20800: 'cryptohome',\n",
" 20801: 'chapsd',\n",
" 20802: 'sh',\n",
" 20803: 'lsof',\n",
" 20804: 'sort',\n",
" 20805: 'lsof',\n",
" 20806: 'sudo',\n",
" 20807: 'kill',\n",
" 20808: 'ps',\n",
" 20809: 'logger',\n",
" 20810: 'udevd',\n",
" 20811: 'bootstat',\n",
" 20812: 'pkill',\n",
" 20813: 'pgrep',\n",
" 20814: 'bootstat',\n",
" 20815: 'cryptohome',\n",
" 20816: 'bootstat',\n",
" 20817: 'job-filter',\n",
" 20818: 'job-filter',\n",
" 20819: 'sh',\n",
" 20820: 'sh',\n",
" 20821: 'init',\n",
" 20822: 'sh',\n",
" 20823: 'sh',\n",
" 20824: 'sh',\n",
" 20825: 'chmod',\n",
" 20826: 'bootstat',\n",
" 20827: 'sh',\n",
" 20828: 'dump_vpd_log',\n",
" 20829: 'mktemp',\n",
" 20830: 'mkdir',\n",
" 20831: 'dump_vpd_log',\n",
" 20832: 'chown',\n",
" 20833: 'bootstat',\n",
" 20834: 'chmod',\n",
" 20835: 'lockbox-cache',\n",
" 20836: 'chmod',\n",
" 20837: 'mktemp',\n",
" 20838: 'dump_vpd_log',\n",
" 20839: 'mktemp',\n",
" 20840: 'dump_vpd_log',\n",
" 20841: 'getopt',\n",
" 20842: 'dump_vpd_log',\n",
" 20843: 'dump_vpd_log',\n",
" 20844: 'awk',\n",
" 20845: 'dump_vpd_log',\n",
" 20846: 'grep',\n",
" 20847: 'dump_vpd_log',\n",
" 20848: 'grep',\n",
" 20849: 'dump_vpd_log',\n",
" 20850: 'dump_vpd_log',\n",
" 20851: 'dump_vpd_log',\n",
" 20852: 'grep',\n",
" 20853: 'watch',\n",
" 20854: 'sh',\n",
" 20855: 'dump_vpd_log',\n",
" 20856: 'grep',\n",
" 20857: 'sh',\n",
" 20858: 'dump_vpd_log',\n",
" 20859: 'grep',\n",
" 20860: 'dump_vpd_log',\n",
" 20861: 'grep',\n",
" 20862: 'dump_vpd_log',\n",
" 20863: 'grep',\n",
" 20864: 'dump_vpd_log',\n",
" 20865: 'grep',\n",
" 20866: 'dump_vpd_log',\n",
" 20867: 'grep',\n",
" 20868: 'dump_vpd_log',\n",
" 20869: 'grep',\n",
" 20870: 'dump_vpd_log',\n",
" 20871: 'grep',\n",
" 20872: 'dump_vpd_log',\n",
" 20873: 'grep',\n",
" 20874: 'dump_vpd_log',\n",
" 20875: 'dump_vpd_log',\n",
" 20876: 'dump_vpd_log',\n",
" 20877: 'dump_vpd_log',\n",
" 20878: 'dump_vpd_log',\n",
" 20879: 'dump_vpd_log',\n",
" 20880: 'dump_vpd_log',\n",
" 20881: 'dump_vpd_log',\n",
" 20882: 'dump_vpd_log',\n",
" 20883: 'dump_vpd_log',\n",
" 20884: 'dump_vpd_log',\n",
" 20885: 'dump_vpd_log',\n",
" 20886: 'dump_vpd_log',\n",
" 20887: 'dump_vpd_log',\n",
" 20888: 'dump_vpd_log',\n",
" 20889: 'dump_vpd_log',\n",
" 20890: 'dump_vpd_log',\n",
" 20891: 'dump_vpd_log',\n",
" 20892: 'dump_vpd_log',\n",
" 20893: 'dump_vpd_log',\n",
" 20894: 'dump_vpd_log',\n",
" 20895: 'dump_vpd_log',\n",
" 20896: 'dump_vpd_log',\n",
" 20897: 'getopt',\n",
" 20898: 'expr',\n",
" 20899: 'expr',\n",
" 20900: 'dump_vpd_log',\n",
" 20901: 'grep',\n",
" 20902: 'dump_vpd_log',\n",
" 20903: 'expr',\n",
" 20904: 'dump_vpd_log',\n",
" 20905: 'grep',\n",
" 20906: 'dump_vpd_log',\n",
" 20907: 'rm',\n",
" 20908: 'rm',\n",
" 20909: 'rm',\n",
" 20910: 'dirname',\n",
" 20911: 'dirname',\n",
" 20912: 'mkdir',\n",
" 20913: 'dump_vpd_log',\n",
" 20914: 'sed',\n",
" 20915: 'rm',\n",
" 20916: 'sh',\n",
" 20917: 'mkdir',\n",
" 20918: 'date',\n",
" 20919: 'ln',\n",
" 20920: 'chown',\n",
" 20921: 'session_manager',\n",
" 20922: 'job-filter',\n",
" 20923: 'sshd',\n",
" 20924: 'sh',\n",
" 20925: 'chgrp',\n",
" 20926: 'sh',\n",
" 20927: 'sh',\n",
" 20928: 'sh',\n",
" 20929: 'sh',\n",
" 20930: 'sh',\n",
" 20931: 'sshd',\n",
" 20932: 'sh',\n",
" 20933: 'crossystem',\n",
" 20934: 'chmod',\n",
" 20935: 'sh',\n",
" 20936: 'chmod',\n",
" 20937: 'is_developer_en',\n",
" 20938: 'sh',\n",
" 20939: 'crossystem',\n",
" 20940: 'chmod',\n",
" 20941: 'watch',\n",
" 20942: 'sh',\n",
" 20943: 'sh',\n",
" 20944: 'cp',\n",
" 20945: 'debugd',\n",
" 20946: 'mosys',\n",
" 20947: 'sh',\n",
" 20948: 'which',\n",
" 20949: 'flashrom',\n",
" 20950: 'sh',\n",
" 20951: 'crossystem',\n",
" 20952: 'sshd',\n",
" 20953: 'sshd',\n",
" 20954: 'sshd',\n",
" 20955: 'sshd',\n",
" 20956: 'cryptohome-path',\n",
" 20957: 'minijail0',\n",
" 20958: 'is_developer_en',\n",
" 20959: 'is_developer_en',\n",
" 20960: 'chrome',\n",
" 20961: 'sshd',\n",
" 20962: 'sshd',\n",
" 20963: 'sandbox_ipc_thr',\n",
" 20964: 'chrome',\n",
" 20965: 'chrome',\n",
" 20966: 'sshd',\n",
" 20967: 'sshd',\n",
" 20968: 'sshd',\n",
" 20969: 'sshd',\n",
" 20970: 'bash',\n",
" 20971: 'nacl_helper_boo',\n",
" 20972: 'nacl_helper_boo',\n",
" 20973: 'nacl_helper_non',\n",
" 20974: 'nacl_helper_non',\n",
" 20975: 'chrome',\n",
" 20976: 'chrome',\n",
" 20977: 'chrome',\n",
" 20978: 'sudo',\n",
" 20979: 'sh',\n",
" 20980: 'shutils',\n",
" 20981: 'cat',\n",
" 20982: 'watch',\n",
" 20983: 'sh',\n",
" 20984: 'sh',\n",
" 20985: 'sudo',\n",
" 20986: 'sudo',\n",
" 20987: 'watch',\n",
" 20988: 'sh',\n",
" 20989: 'sh',\n",
" 20990: 'sudo',\n",
" 20991: 'sudo',\n",
" 20992: 'trace-cmd'}"
]
},
"execution_count": 333,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create a map of {PID: TaskName}\n",
"pid_to_task = {int(task[0]): task[1] for task in tasks.drop_duplicates().values}\n",
"logging.info(\"The trace has %s unique PIDs\", len(pid_to_task))\n",
"pid_to_task"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Events grouping"
]
},
{
"cell_type": "code",
"execution_count": 118,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>next_comm</th>\n",
" <th>prev_comm</th>\n",
" </tr>\n",
" <tr>\n",
" <th>next_pid</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">0</th>\n",
" <th>count</th>\n",
" <td>20400</td>\n",
" <td>20400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>unique</th>\n",
" <td>4</td>\n",
" <td>158</td>\n",
" </tr>\n",
" <tr>\n",
" <th>top</th>\n",
" <td>swapper/1</td>\n",
" <td>chrome</td>\n",
" </tr>\n",
" <tr>\n",
" <th>freq</th>\n",
" <td>8442</td>\n",
" <td>5964</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>count</th>\n",
" <td>372</td>\n",
" <td>372</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" next_comm prev_comm\n",
"next_pid \n",
"0 count 20400 20400\n",
" unique 4 158\n",
" top swapper/1 chrome\n",
" freq 8442 5964\n",
"1 count 372 372"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Group events by \"PID\" and compute \n",
"most_switching = df.groupby('next_pid').describe(include=['object'])\n",
"most_switching.head()"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th colspan=\"4\" halign=\"left\">next_comm</th>\n",
" <th colspan=\"4\" halign=\"left\">prev_comm</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>unique</th>\n",
" <th>top</th>\n",
" <th>freq</th>\n",
" <th>count</th>\n",
" <th>unique</th>\n",
" <th>top</th>\n",
" <th>freq</th>\n",
" </tr>\n",
" <tr>\n",
" <th>next_pid</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20400</td>\n",
" <td>4</td>\n",
" <td>swapper/1</td>\n",
" <td>8442</td>\n",
" <td>20400</td>\n",
" <td>158</td>\n",
" <td>chrome</td>\n",
" <td>5964</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>372</td>\n",
" <td>1</td>\n",
" <td>init</td>\n",
" <td>372</td>\n",
" <td>372</td>\n",
" <td>33</td>\n",
" <td>dbus-daemon</td>\n",
" <td>90</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>kthreadd</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>swapper/1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>761</td>\n",
" <td>1</td>\n",
" <td>ksoftirqd/0</td>\n",
" <td>761</td>\n",
" <td>761</td>\n",
" <td>36</td>\n",
" <td>rcu_preempt</td>\n",
" <td>246</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2275</td>\n",
" <td>1</td>\n",
" <td>kworker/u8:0</td>\n",
" <td>2275</td>\n",
" <td>2275</td>\n",
" <td>64</td>\n",
" <td>chrome</td>\n",
" <td>475</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" next_comm prev_comm \\\n",
" count unique top freq count unique top \n",
"next_pid \n",
"0 20400 4 swapper/1 8442 20400 158 chrome \n",
"1 372 1 init 372 372 33 dbus-daemon \n",
"2 5 1 kthreadd 5 5 5 swapper/1 \n",
"3 761 1 ksoftirqd/0 761 761 36 rcu_preempt \n",
"6 2275 1 kworker/u8:0 2275 2275 64 chrome \n",
"\n",
" \n",
" freq \n",
"next_pid \n",
"0 5964 \n",
"1 90 \n",
"2 1 \n",
"3 246 \n",
"6 475 "
]
},
"execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"most_switching = most_switching.unstack()\n",
"most_switching.head()"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>unique</th>\n",
" <th>top</th>\n",
" <th>freq</th>\n",
" </tr>\n",
" <tr>\n",
" <th>next_pid</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20400</td>\n",
" <td>4</td>\n",
" <td>swapper/1</td>\n",
" <td>8442</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20552</th>\n",
" <td>9224</td>\n",
" <td>2</td>\n",
" <td>Chrome_IOThread</td>\n",
" <td>9223</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20527</th>\n",
" <td>8309</td>\n",
" <td>2</td>\n",
" <td>chrome</td>\n",
" <td>8307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20560</th>\n",
" <td>6898</td>\n",
" <td>3</td>\n",
" <td>chrome</td>\n",
" <td>6797</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>5516</td>\n",
" <td>1</td>\n",
" <td>rcu_preempt</td>\n",
" <td>5516</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count unique top freq\n",
"next_pid \n",
"0 20400 4 swapper/1 8442\n",
"20552 9224 2 Chrome_IOThread 9223\n",
"20527 8309 2 chrome 8307\n",
"20560 6898 3 chrome 6797\n",
"7 5516 1 rcu_preempt 5516"
]
},
"execution_count": 124,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"most_switching = most_switching['next_comm']\\\n",
" .sort_values(by=['count'], ascending=False)\n",
"most_switching.head()"
]
},
{
"cell_type": "code",
"execution_count": 231,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"07:08:50 INFO : The second most swithing task is: [20552:Chrome_IOThread]\n"
]
}
],
"source": [
"most_switching_pid = most_switching.index[1]\n",
"most_switching_task = most_switching.values[1][2]\n",
"task_name = \"{}:{}\".format(most_switching_pid, most_switching_task)\n",
"logging.info(\"The second most swithing task is: [%s]\", task_name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Filtering by column value"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"06:45:37 INFO : Total events: 220234\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comm</th>\n",
" <th>cpu</th>\n",
" <th>load_avg</th>\n",
" <th>load_sum</th>\n",
" <th>period_contrib</th>\n",
" <th>pid</th>\n",
" <th>util_avg</th>\n",
" <th>util_sum</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.000014</th>\n",
" <td>trace-cmd</td>\n",
" <td>1</td>\n",
" <td>58</td>\n",
" <td>2811439</td>\n",
" <td>916</td>\n",
" <td>20278</td>\n",
" <td>33</td>\n",
" <td>1601714</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000229</th>\n",
" <td>trace-cmd</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>2820191</td>\n",
" <td>111</td>\n",
" <td>20278</td>\n",
" <td>33</td>\n",
" <td>1612418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000334</th>\n",
" <td>sh</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>957</td>\n",
" <td>20277</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.000982</th>\n",
" <td>sh</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>285169</td>\n",
" <td>710</td>\n",
" <td>20277</td>\n",
" <td>3</td>\n",
" <td>164585</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.001178</th>\n",
" <td>sh</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>355825</td>\n",
" <td>903</td>\n",
" <td>20277</td>\n",
" <td>3</td>\n",
" <td>205364</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comm cpu load_avg load_sum period_contrib pid util_avg \\\n",
"Time \n",
"0.000014 trace-cmd 1 58 2811439 916 20278 33 \n",
"0.000229 trace-cmd 1 59 2820191 111 20278 33 \n",
"0.000334 sh 0 0 0 957 20277 0 \n",
"0.000982 sh 0 5 285169 710 20277 3 \n",
"0.001178 sh 0 5 355825 903 20277 3 \n",
"\n",
" util_sum \n",
"Time \n",
"0.000014 1601714 \n",
"0.000229 1612418 \n",
"0.000334 0 \n",
"0.000982 164585 \n",
"0.001178 205364 "
]
},
"execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Lets use the previous information to filter values of another DataFrame\n",
"# Here we use the events reporting the task utilization signal\n",
"df = ftrace.sched_load_avg_task.data_frame.ix[:,'comm':'util_sum']\n",
"logging.info(\"Total events: %d\", len(df))\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"06:45:37 INFO : Selected events: 19129\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comm</th>\n",
" <th>cpu</th>\n",
" <th>load_avg</th>\n",
" <th>load_sum</th>\n",
" <th>period_contrib</th>\n",
" <th>pid</th>\n",
" <th>util_avg</th>\n",
" <th>util_sum</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>10.277545</th>\n",
" <td>chrome</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>279939</td>\n",
" <td>876</td>\n",
" <td>20552</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10.278066</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>421520</td>\n",
" <td>374</td>\n",
" <td>20552</td>\n",
" <td>3</td>\n",
" <td>147580</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10.278226</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>421520</td>\n",
" <td>501</td>\n",
" <td>20552</td>\n",
" <td>3</td>\n",
" <td>147580</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10.279379</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>15</td>\n",
" <td>739012</td>\n",
" <td>629</td>\n",
" <td>20552</td>\n",
" <td>9</td>\n",
" <td>470942</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10.279542</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>15</td>\n",
" <td>739012</td>\n",
" <td>765</td>\n",
" <td>20552</td>\n",
" <td>9</td>\n",
" <td>470942</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comm cpu load_avg load_sum period_contrib pid \\\n",
"Time \n",
"10.277545 chrome 3 5 279939 876 20552 \n",
"10.278066 Chrome_IOThread 3 8 421520 374 20552 \n",
"10.278226 Chrome_IOThread 3 8 421520 501 20552 \n",
"10.279379 Chrome_IOThread 3 15 739012 629 20552 \n",
"10.279542 Chrome_IOThread 3 15 739012 765 20552 \n",
"\n",
" util_avg util_sum \n",
"Time \n",
"10.277545 0 0 \n",
"10.278066 3 147580 \n",
"10.278226 3 147580 \n",
"10.279379 9 470942 \n",
"10.279542 9 470942 "
]
},
"execution_count": 189,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Select only events for the task of interest\n",
"select = (df.pid == most_switching_pid)\n",
"\n",
"task_events = df[select]\n",
"logging.info(\"Selected events: %d\", len(task_events))\n",
"task_events.head()"
]
},
{
"cell_type": "code",
"execution_count": 194,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"06:47:30 INFO : Selected events: 2007\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comm</th>\n",
" <th>cpu</th>\n",
" <th>load_avg</th>\n",
" <th>load_sum</th>\n",
" <th>period_contrib</th>\n",
" <th>pid</th>\n",
" <th>util_avg</th>\n",
" <th>util_sum</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>17.112905</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>989</td>\n",
" <td>47260557</td>\n",
" <td>91</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21592551</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17.113017</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>989</td>\n",
" <td>47333261</td>\n",
" <td>196</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21592551</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17.113273</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>989</td>\n",
" <td>47571853</td>\n",
" <td>429</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21831143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17.113552</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>989</td>\n",
" <td>47866765</td>\n",
" <td>717</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21831143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17.114018</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>990</td>\n",
" <td>47295142</td>\n",
" <td>143</td>\n",
" <td>20552</td>\n",
" <td>456</td>\n",
" <td>21817410</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comm cpu load_avg load_sum period_contrib pid \\\n",
"Time \n",
"17.112905 Chrome_IOThread 3 989 47260557 91 20552 \n",
"17.113017 Chrome_IOThread 3 989 47333261 196 20552 \n",
"17.113273 Chrome_IOThread 3 989 47571853 429 20552 \n",
"17.113552 Chrome_IOThread 3 989 47866765 717 20552 \n",
"17.114018 Chrome_IOThread 3 990 47295142 143 20552 \n",
"\n",
" util_avg util_sum \n",
"Time \n",
"17.112905 452 21592551 \n",
"17.113017 452 21592551 \n",
"17.113273 452 21831143 \n",
"17.113552 452 21831143 \n",
"17.114018 456 21817410 "
]
},
"execution_count": 194,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# We can also compose a query using multiple conditions\n",
"select = (((task_events.cpu != 1) & (task_events.cpu != 2)) & ~(task_events.util_avg < 450))\n",
"\n",
"task_events = task_events[select]\n",
"logging.info(\"Selected events: %d\", len(task_events))\n",
"task_events.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Row selection"
]
},
{
"cell_type": "code",
"execution_count": 198,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comm</th>\n",
" <th>cpu</th>\n",
" <th>load_avg</th>\n",
" <th>load_sum</th>\n",
" <th>period_contrib</th>\n",
" <th>pid</th>\n",
" <th>util_avg</th>\n",
" <th>util_sum</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>21.983876</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>860</td>\n",
" <td>41072776</td>\n",
" <td>117</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21610419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.983908</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>860</td>\n",
" <td>41109640</td>\n",
" <td>153</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21610419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.983928</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>860</td>\n",
" <td>41129096</td>\n",
" <td>172</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21629875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.983987</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>860</td>\n",
" <td>41188488</td>\n",
" <td>230</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21629875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.984067</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>860</td>\n",
" <td>41263240</td>\n",
" <td>303</td>\n",
" <td>20552</td>\n",
" <td>452</td>\n",
" <td>21704627</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comm cpu load_avg load_sum period_contrib pid \\\n",
"Time \n",
"21.983876 Chrome_IOThread 3 860 41072776 117 20552 \n",
"21.983908 Chrome_IOThread 3 860 41109640 153 20552 \n",
"21.983928 Chrome_IOThread 3 860 41129096 172 20552 \n",
"21.983987 Chrome_IOThread 3 860 41188488 230 20552 \n",
"21.984067 Chrome_IOThread 3 860 41263240 303 20552 \n",
"\n",
" util_avg util_sum \n",
"Time \n",
"21.983876 452 21610419 \n",
"21.983908 452 21610419 \n",
"21.983928 452 21629875 \n",
"21.983987 452 21629875 \n",
"21.984067 452 21704627 "
]
},
"execution_count": 198,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Row selection is also possible, which in our case corresponds to limiting \n",
"# the events on a specified time frame\n",
"task_events.ix[21.1:22.9,].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataFrame Merging"
]
},
{
"cell_type": "code",
"execution_count": 218,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"06:59:46 INFO : Selected events: 17\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>21.215426</th>\n",
" <td>0</td>\n",
" <td>1001000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.265745</th>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.412728</th>\n",
" <td>0</td>\n",
" <td>507000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.465761</th>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21.541466</th>\n",
" <td>0</td>\n",
" <td>507000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cpu frequency\n",
"Time \n",
"21.215426 0 1001000\n",
"21.265745 0 1404000\n",
"21.412728 0 507000\n",
"21.465761 0 1404000\n",
"21.541466 0 507000"
]
},
"execution_count": 218,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's make use of yet another DataFrame, let's look at the frequencies\n",
"frequencies = ftrace.cpu_frequency.data_frame\n",
"\n",
"select = (frequencies.cpu == 0)\n",
"frequencies = frequencies.ix[21.1:22.9,'cpu':'frequency'][select]\n",
"logging.info(\"Selected events: %d\", len(frequencies))\n",
"frequencies.head()"
]
},
{
"cell_type": "code",
"execution_count": 222,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"06:59:59 INFO : Selected events: 2024\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comm</th>\n",
" <th>cpulx_</th>\n",
" <th>load_avg</th>\n",
" <th>load_sum</th>\n",
" <th>period_contrib</th>\n",
" <th>pid</th>\n",
" <th>util_avg</th>\n",
" <th>util_sum</th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>22.701783</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42702053</td>\n",
" <td>124</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21865198</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.701807</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42727653</td>\n",
" <td>149</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21865198</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.701824</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42743013</td>\n",
" <td>164</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21880558</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.768356</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1183000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.818657</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comm cpulx_ load_avg load_sum period_contrib pid \\\n",
"Time \n",
"22.701783 Chrome_IOThread 3 893 42702053 124 20552 \n",
"22.701807 Chrome_IOThread 3 893 42727653 149 20552 \n",
"22.701824 Chrome_IOThread 3 893 42743013 164 20552 \n",
"22.768356 NaN NaN NaN NaN NaN NaN \n",
"22.818657 NaN NaN NaN NaN NaN NaN \n",
"\n",
" util_avg util_sum cpu frequency \n",
"Time \n",
"22.701783 457 21865198 NaN NaN \n",
"22.701807 457 21865198 NaN NaN \n",
"22.701824 457 21880558 NaN NaN \n",
"22.768356 NaN NaN 0 1183000 \n",
"22.818657 NaN NaN 0 1404000 "
]
},
"execution_count": 222,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's merge the task signal frame with the CPUs frequencies\n",
"task_util_and_freq = task_events.join(\n",
" frequencies,\n",
" how='outer',\n",
" lsuffix='lx_')#[['util_avg', 'frequency']]\n",
"logging.info(\"Selected events: %d\", len(task_util_and_freq))\n",
"task_util_and_freq.tail()"
]
},
{
"cell_type": "code",
"execution_count": 223,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2024"
]
},
"execution_count": 223,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# The new table has the union of events from the two original tables\n",
"len(task_events) + len(frequencies)"
]
},
{
"cell_type": "code",
"execution_count": 224,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>comm</th>\n",
" <th>cpulx_</th>\n",
" <th>load_avg</th>\n",
" <th>load_sum</th>\n",
" <th>period_contrib</th>\n",
" <th>pid</th>\n",
" <th>util_avg</th>\n",
" <th>util_sum</th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>22.701783</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42702053</td>\n",
" <td>124</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21865198</td>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.701807</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42727653</td>\n",
" <td>149</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21865198</td>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.701824</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42743013</td>\n",
" <td>164</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21880558</td>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.768356</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42743013</td>\n",
" <td>164</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21880558</td>\n",
" <td>0</td>\n",
" <td>1183000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22.818657</th>\n",
" <td>Chrome_IOThread</td>\n",
" <td>3</td>\n",
" <td>893</td>\n",
" <td>42743013</td>\n",
" <td>164</td>\n",
" <td>20552</td>\n",
" <td>457</td>\n",
" <td>21880558</td>\n",
" <td>0</td>\n",
" <td>1404000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comm cpulx_ load_avg load_sum period_contrib pid \\\n",
"Time \n",
"22.701783 Chrome_IOThread 3 893 42702053 124 20552 \n",
"22.701807 Chrome_IOThread 3 893 42727653 149 20552 \n",
"22.701824 Chrome_IOThread 3 893 42743013 164 20552 \n",
"22.768356 Chrome_IOThread 3 893 42743013 164 20552 \n",
"22.818657 Chrome_IOThread 3 893 42743013 164 20552 \n",
"\n",
" util_avg util_sum cpu frequency \n",
"Time \n",
"22.701783 457 21865198 0 1404000 \n",
"22.701807 457 21865198 0 1404000 \n",
"22.701824 457 21880558 0 1404000 \n",
"22.768356 457 21880558 0 1183000 \n",
"22.818657 457 21880558 0 1404000 "
]
},
"execution_count": 224,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's propagate missing columns values...\n",
"task_util_and_freq = task_util_and_freq.fillna(method='ffill')\n",
"task_util_and_freq.tail()"
]
},
{
"cell_type": "code",
"execution_count": 226,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# NOTE: missing values at the beginning can be fixe as well\n",
"# ...but that behind that demo!\n",
"# LISA has a set of methods which provides a complete and realiable solutions\n",
"# to do this kind of compositions on data frames"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Plotting"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using pylab"
]
},
{
"cell_type": "code",
"execution_count": 227,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: pylab import has clobbered these variables: ['e', 'select']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n"
]
}
],
"source": [
"# Enable generation of Notebook emebedded plots\n",
"%pylab inline"
]
},
{
"cell_type": "code",
"execution_count": 229,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f0c7e2c0890>"
]
},
"execution_count": 229,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEPCAYAAAC+35gCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmY1tV99/H3BxUNCAgoOyKKWDBuqKi1NhMsi8ZHNHHB\nBVC5kj6BtNGmjRgrQoyXik1CNcU2LRHUwLilEXwQRiKTNEYUjAYjyEAjCIOMkc0oRrbv88d9GG6G\nGebHLAwzfF7XxeXv/p7lPkd0vvM757coIjAzM8uiWUMPwMzMGg8nDTMzy8xJw8zMMnPSMDOzzJw0\nzMwsMycNMzPLrNqkIWmKpDJJiyvE/07SUklvSbo/L36HpOWpbFBevJ+kxZJKJE3KizeXVJjavCLp\n+Lyykan+Mkkj8uInSFqQymZIOrw2/xLMzCybLGcajwKD8wOSCoD/A5wWEacB/5LifYBrgD7AJcBk\nSUrNHgFGRURvoLekXX2OAjZExMnAJGBi6qstMA44FzgPuFtSm9TmAeD7qa9NqQ8zM6tn1SaNiPg1\nsLFC+OvA/RGxPdX5MMWHAoURsT0iVgLLgf6SOgGtImJhqvcYcEVem2np+BlgQDoeDBRFxOaI2AQU\nAUNS2QDg2XQ8Dbgyw1zNzKyWarqn0Rv467RENF/S2SneFVidV680xboCa/Lia1JsjzYRsQPYLKld\nVX1Jag9sjIideX11qeE8zMxsP9R0L+BwoG1EnC/pXOBp4MQ6GpOqr5KpjpmZ1bGaJo3VwM8AImKh\npB3pDKAUOD6vXrcUKwW6VxInr2ytpMOA1hGxQVIpUFChzfyIWC+pjaRm6Wwjv6+9SPLDtczMaiAi\n9voFPevylNjzt/ufk/YeJPUGmkfEemAmcG26Iqon0At4LSLWkVt26p82xkcAz6W+ZgIj0/HVwEvp\neC4wMCWItsDAFAOYn+qS2u7qq1IR0WT+3H333Q0+Bs/V8/Rcm/5cq1LtmYak6eR+428v6T3gbuAn\nwKOS3gI+S0mAiFgi6SlgCbANGB27v30MMBU4CpgdEXNSfArwuKTlwHpgWOpro6R7gEVAABMityEO\nMBYoTOVvpD7MzKyeVZs0IuL6KoqGV1H/PuC+SuKvA6dVEv+M3GW6lfU1lVyiqRh/l9xluGZmdgD5\njvBGpqCgoKGHcMAcKnM9VOYJnmtToH2tXTUFkqKpz9HMrK5JIirZCD9kH79xwgknsGrVqoYehlWh\nR48erFy5sqGHYWYVHLJnGimLNsCILAv//Zg1rKrONLynYWZmmTlpmJlZZk4aZmaWmZNGE3Dffffx\nta99DYBVq1bRrFkzdu7cWU0rM7P9543wRuaXv/wlN954I6tXr660fNWqVZx44ols27aNZs0a7+8E\njfXvx6yp8EZ4ExER7H6vlZnZgeWkcRBq1qwZf/jDH8o/33zzzYwbN44tW7Zw6aWXsnbtWlq1akXr\n1q1Zt24dEyZMYPjwSp/qUqWpU6fSt29fWrduTa9evfjxj39cXta3b19mz55d/nnHjh106NCBN998\nE4DHHnuME044geOOO47vfe979OzZk5deemmv7zCzpsdJ4yBU1ZlEixYteOGFF+jSpQt/+tOf+Oij\nj+jUqdM+21SlY8eOzJ49m48++ohHH32U2267rTwpXHfddUyfPr287pw5czjuuOM488wzWbJkCWPG\njGHGjBm8//77bN68mbVr19ZwpmbW2DhpVEGqmz81cSDW8i+55BJOOOEEAC666CIGDRrE//zP/wBw\n/fXXM3PmTP785z8DMGPGDK677joAnn32WS6//HIuuOACDj/8cL773e/W+1jN7ODhpFGFiLr5c7B6\n4YUXuOCCC2jfvj1t27blhRde4MMPc696P+mkk+jbty+zZs3i008/ZebMmdxwww0ArF27lu7dd79P\n63Of+xzt27dvkDmY2YF3yD576mDWokULtmzZUv553bp15T+o62ITfOvWrVx11VU88cQTDB06lGbN\nmnHllVfucYYzbNgwpk+fzo4dOzj11FPp2bMnAJ07d6akpKS83qeffsr69etrPSYzaxx8pnEQOuus\ns5g+fTo7d+5kzpw5/PKXvywv69ixI+vXr+ejjz6qsn11y1tbt25l69atHHvssTRr1owXXniBoqKi\nPeoMGzaMoqIiHnnkEa6/fvcrVa666ipmzZrFggUL2LZtG+PHj6/ZJM2sUXLSOAhNmjSJmTNn0rZt\nW2bMmMGVV15ZXnbKKadw3XXXceKJJ9KuXTvWrVu3V/vqzkaOPvpoHnroIa6++mratWtHYWEhQ4cO\n3aNOp06duOCCC1iwYAHXXnttebxv3748/PDDXHvttXTp0oXWrVvToUMHjjzyyFrO2swaA9/cZ7Xy\nySefcMwxx7BixQp69OhRZ/3678esYfnmPqszzz//PJ9++imffPIJ3/rWtzj99NPrNGGY2cGr2qQh\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0cb5032610>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"task_util_and_freq[['util_avg', 'frequency']].plot(drawstyle=\"steps-post\")"
]
},
{
"cell_type": "code",
"execution_count": 260,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nzE0j4hAgM/Ooev9fAl/MzGv6OVbX9Aj39PQ8/wuisphtubox227pEe7GbLuF2ZbLbMtltmXr2LNG\nR8QKEbFiff/FwK7ATcCFwPR6tw8AF9T3LwTeExHLRsQGwIbAtWNatCRJkiSpCG3pEa4bs+dRDX1e\nGjg9M4+MiNWAs4F1gbuAvTNzTv2YQ4EPAvOBgzPzkgGO3TU9wpLUCbqlR1iSJI2NVvQIj4uh0a1k\nQ1iSxpe114Zp0+CSS+D886uGbyMbwpIkaSg6dmi0WqN3IrnKY7bl6tZs3/UuePnL4Zxz2l3J6OnW\nbLuB2ZbLbMtltmrGhrAkadRtsQW88Y3trkKSJKni0GhJ0qhae22YMQNOPhnmzoXDD198u0OjJUnS\nUDg0WpIkSZKkIbIh3MGc+1Ausy2X2S7ZhAmL3/7jP9pd0eCZbbnMtlxmWy6zVTM2hCVJ48LWW8OC\nBYtup50Gs2e3uypJklSipdtdgIZv6tSp7S5Bo8Rsy2W2A+vtBW5c7iRmWy6zLZfZlsts1UyH/TdD\nkiRJkqSRsSHcwZz7UC6zLVe3ZHvXXfCd77S7irHVLdl2I7Mtl9mWy2zVjA1hSVLLXXIJfPSj7a5C\nkiSpfzaEO5hzH8pltuUy23KZbbnMtlxmWy6zVTM2hCVJkiRJXcWGcAdz7kO5zLZcZlsusy2X2ZbL\nbMtltmrGhrAkadSsvTZktrsKSZKkxdkQ7mDOfSiX2ZarW7KNgA98AB58sHsawt2SbTcy23KZbbnM\nVs3YEJYkjYqll64axJIkSeONDeEO5tyHcpltucy2XGZbLrMtl9mWy2zVjA1hSZIkSVJXsSHcwZz7\nUC6zLZfZlstsy2W25TLbcpmtmrEhLEmSJEnqKjaEO5hzH8pltuUy23KZbbnMtlxmWy6zVTM2hCVJ\nkiRJXcWGcAdz7kO5zLZcZlsusy2X2ZbLbMtltmrGhrAkSZIkqavYEO5gzn0ol9mWy2zLZbblMtty\nmW25zFbN2BCWJEmSJHUVG8IdzLkP5TLbcpltucy2XGZbLrMtl9mqGRvCkiRJkqSuYkO4gzn3oVxm\nWy6zLZfZlstsy2W25TJbNWNDWJIkSZLUVWwIdzDnPpTLbMtltuUy23KZbbnMtlxmq2ZsCEuSJEmS\nuooN4Q7m3IdymW25zLZcZlsusy2X2ZbLbNWMDWFJkiRJUlexIdzBnPtQLrMtl9mWy2zLZbblMtty\n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\nZg4BG4BDImI+8OLMXFetdynwzhYNuac496FcZlsusy2X2ZbLbMtltuUyWzXT9jnCEbES2JiZd45Z\ntADY2NDeXPUtADY19G+q+iRJkiRJ2mlz2rmziNgdOJP6adEt84IXtO6xf/mX4ZZbWvf44xkZgYUL\n4fHHxy5Z0d6BqI1WdHoAz7joInjf+9q7z7/4CzjrrPbus31WjNv7+c/DiSe2dySd8rGP1TPepbjL\nNa7o9ADUMis6PYCW+vSn4ZRT2rvP88+HNWvau8/xrXhezxvfCDfd1N5RDA3Ba18L27e3d7/d5oUv\nhOFh2HffmT/WihUrprzu3nvDPffAvHkz3696R1sLYeDVwABwezX/dyFwW0QcQv0I8KKGdRdWfZuB\n/cbpn9C73rWKgYEBAPbccy5Lly595sUweprEdNrDw/Crv1qjVpve9tNtb9sGe+yxgoceas/+bNse\nbf/+79e4+WZ43/vau//771/B+efD0qXd9e/RqvbVV6/g/vu7ZzztyPdzn4MlS7pjPLZt93P729/u\nzO+f226rceKJcNFF3fXvsd9+KzjyyPbv/4Ybarz85XDPPd3179Hu9gknrOCxx+D732/v/p98ssaN\nN8Ixx3T2+dueuD04OMjIyAgAQ0NDzIaWXjUaICIGgCsz83XjLPsxsCwzH4yIg4DLgEOpn/p8HbB/\nZmZE3AScAqwDvgl8NjOvnmB/Lbtq9PAwLF9ev22nLVtg2bL6baNarfbMfxCVpVuyPfNM2GOP+m07\nnXYaLFpUvy3NeNmuXg177VW/7QcnnQQHH1y/LUm3vG41+0rO9pxzYMeO+m07feQjsM8+9dtOGpvt\nD38IRxxRv22nO++E44+v3/azgQGo1eq3M7Uzr9t58+BHP/KIcC/p+qtGR8SXgX+jfqXneyPiD8es\nkkAAZOZ64ApgPXAVcHJDRfvHwMXA3cCGiYpgSZIkSZKaaemp0Zl5fJPlrxrTPhc4d5z1bgWed0S5\n35X66bTMtmRmWy6zLZfZlstsy2W2aqalR4QlSZIkSeo2FsI9bHQiucpjtuUy23KZbbnMtlxmWy6z\nVTMWwpIkSZKkvmIh3MOc+1Ausy2X2ZbLbMtltuUy23KZrZqxEJYkSZIk9RUL4R7m3IdymW25zLZc\nZlsusy2X2ZbLbNWMhbAkSZIkqa9YCPcw5z6Uy2zLZbblMttymW25zLZcZqtmLIQlSZIkSX3FQriH\n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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0c785c7850>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.gridspec as gridspec\n",
"\n",
"t_min = 21.5\n",
"t_max = 23.0\n",
"\n",
"gs = gridspec.GridSpec(2, 1, height_ratios=[2,1]);\n",
"\n",
"plt.figure(figsize=(16, 8));\n",
"plt.suptitle(\"Task Utilization vs Frequency\",\n",
" y=.97, fontsize=16, horizontalalignment='center');\n",
"\n",
"# Plot Utilization\n",
"data = task_util_and_freq['util_avg']\n",
"axes = plt.subplot(gs[0,0]);\n",
"data.plot(ax=axes, drawstyle='steps-post');\n",
"axes.set_title('Task [{}] Utilization'.format(task_name));\n",
"axes.set_ylabel('Utilization')\n",
"axes.set_xlim(t_min, t_max);\n",
"axes.grid(True);\n",
"axes.set_xticklabels([])\n",
"axes.set_xlabel('')\n",
"\n",
"\n",
"# Plot Frequencies\n",
"data = task_util_and_freq['frequency']/1000\n",
"axes = plt.subplot(gs[1,0]);\n",
"data.plot(ax=axes, drawstyle='steps-post');\n",
"axes.set_title('Frequencies');\n",
"axes.set_ylabel('MHz')\n",
"axes.set_xlim(t_min, t_max);\n",
"axes.grid(True);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plots can be much better with just a little bit of setup and using the proper APIs.<br>\n",
"That's why **LISA** aims at providing a **predefined set of plot functions** for commonly used analysis."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using TRAPpy LinePlotter"
]
},
{
"cell_type": "code",
"execution_count": 306,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"08:01:48 INFO : Table for 'cpu_frequency' events:\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>__comm</th>\n",
" <th>__cpu</th>\n",
" <th>__pid</th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" <th>start</th>\n",
" <th>delta</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.661132</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>2</td>\n",
" <td>1807000</td>\n",
" <td>0.661132</td>\n",
" <td>0.000004</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" __comm __cpu __pid cpu frequency start delta\n",
"Time \n",
"0.661132 kschedfreq:2 2 119 2 1807000 0.661132 0.000004"
]
},
"execution_count": 306,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Consider the data frame for the frequency switching events\n",
"logging.info(\"Table for 'cpu_frequency' events:\")\n",
"ftrace.cpu_frequency.data_frame.head(1)"
]
},
{
"cell_type": "code",
"execution_count": 309,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA60AAAHRCAYAAACB2l9MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VNX9//H3JIRAEkoMGKRgWAREliACghhkUb8u0H5B\nFBG1YkW/iD9BUDEItrW2bG6EVS22+v0CikpBRa0gexQVVJBNkUUWC7JEkDQsCZnfHzDXzGQmmSxD\nzj15PR8PHzIzdznve8+dM5+ZOROP1+v1CgAAAAAAA0VVdAMAAAAAAAiFohUAAAAAYCyKVgAAAACA\nsShaAQAAAADGomgFAAAAABirSkU3AAAAAOXP6/Xq+++/16lTpyq6KQBQrKpVq6phw4byeDyFHvPw\nJ28AAADss3PnTlWtWlVxcXEV3RQAKFZOTo5OnTqlRo0aFXqMrwcDAABY6NSpUxSsAFwjLi4u5DdD\nKFoBAAAAAMaiaAUAAAAAGIuiFQAAANZ57bXXdOONN1Z0M86JBx54QGPHjq3oZpTJwYMH1bNnTzVo\n0EB/+MMfKro5FeLvf/+7mjdvrpSUFB05cqSim2MUfj0YAAAA51SbNm106NAhRUdHKz4+Xj169NDT\nTz9d7nNwg/0KaUns2bNHl156qeLj4/3unzx5snr37l2mbcPfq6++qtq1a2vXrl0V3ZQKkZeXpyee\neEKLFy9WixYtKro5xuGTVgAAgEqoSmZmhW3D4/Ho9ddf1+7du7Vs2TKtW7dOzz77bJnbEwkej0e7\ndu3S7t27nf8oWMvfnj17dPHFF4d8/PTp0+ewNefejz/+qJMnT4Y8BrbnLw5FKwAAQCVUkUWrdObv\nyErSBRdcoGuuuUZbtmzRnDlz1KlTJ6WkpKhdu3Z65ZVXnOU//vhjtWrVStOmTdPFF1+sli1bas6c\nOc7jP/30kwYMGKAGDRro2muv1c6dO/32N2rUKLVu3VoNGjTQ1VdfrU8//dR57Msvv9TVV1+tBg0a\n6JJLLtETTzwRtK0F5ebmqmvXrvrb3/4mScrPz9cNN9ygZ555xtnmddddp0aNGqlly5Z67LHHlJeX\n56xfq1Yt/f3vf1f79u3VoEEDjR07Vt9//72zzqBBg5zlfdmff/55NW3aVG3bttVbb70V8th++OGH\n6tq1qxo1aqQbbrhBmzdvdh7LyMhQy5YtlZKSoo4dO2rVqlVBt5Gfn6/nnntO7dq1c47Zv//9b6ft\nL730ki677DI1a9ZMf/zjH531JkyYoMGDBzu39+zZo1q1aik/Pz9kex944AG9/vrrmjx5slJSUrRy\n5UpNmDBBAwcO1ODBg9WwYUO99tpr8nq9mjRpktq1a6emTZvqnnvu0dGjR53tzJ07V23atFHTpk31\n3HPP6dJLL9XKlSudfRT8CrXvmPrs379fd911l5o1a6bLLrtML730kl+m3//+9xoyZIhSUlJ05ZVX\nav369c7jP/zwg373u9+pWbNmatq0qdLT05Wbm6uLLrpIW7ZscZY7dOiQ6tevr6ysLL/827dvV6dO\nnSRJjRo1Up8+fZzj/PLLL6tDhw7q0KGDJGnr1q266aabdNFFF6ljx45asGCBs53Aa2Ds2LHOV+SD\nnYff/va3mjVrlnN71qxZ6tSpky666CLdcsst2rt3r/NYrVq19Morr6hDhw5q3LixRo4c6Zfh1Vdf\nda7dzp07a8OGDZoyZYruuusuv+XS09P1+OOPq6QoWgEAAFBh9u7dq8WLF6t169Y6//zzNXfuXO3e\nvVtTp07VmDFjtGHDBmfZAwcOKDs7W5s3b9akSZM0cuRI/fzzz5KkRx55RNWrV9e3336ryZMna/bs\n2X77adeunTIzM7Vz50717dtXd999t/PnNUaNGqXBgwdr165d+uKLLwp9khqsaI2JidELL7yg8ePH\na+vWrXr++eeVn5+vhx9+WJIUHR2tsWPHaseOHfrwww+1cuVKvfzyy37bWLZsmVasWKFFixZpypQp\neuihhzRz5kx9/fXX2rRpk+bNm+eX/aefftLmzZs1bdo0DR8+XNu3by/Urq+//lpDhw7VpEmTtGPH\nDg0cOFADBgxQbm6utm3bppkzZ2rZsmXavXu35s2bp5SUFEnSp59+qsaNGzvbmTp1qubPn68333xT\nu3bt0pQpU/y+vv3+++9r+fLlWrZsmT744AO/4ifwa9nFfU172rRpuvnmmzV06FDt3r1bV111lSTp\nX//6l3r37q3vv/9et9xyi1588UV98MEHeu+997R582YlJibqkUcekSR98803evTRR/Xiiy9q8+bN\nysrK0r59+4rcr69dXq9XAwYMUGpqqrZs2aIFCxboxRdf1LJly5xlP/zwQ/Xt21e7du3S9ddfr0cf\nfVTSmeL+tttuU4MGDZzz1qdPH8XExKhv37568803nW3MmzdPXbt2VVJSkqQzBepnn32miy66SJ98\n8okkadeuXZo/f77fcf7oo4+0evVq5eTkqG/fvurXr5+2bduml19+WY8++qi2bt0qKfg1UPDYF3Ue\n3n//fWVkZGjWrFn67rvvdMUVV2jQoEF+yyxatEhLly7VypUrtWDBAi1dulSStGDBAj399NN68cUX\ntXv3bs2ZM0fnnXee+vXrp2XLljnX6OnTpzV//nzddtttRZ6XYChaAQAAKokqmZmqNn68qo0fr+oT\nJ+q8pKQy/Vd94kRneyX91PWOO+5Q48aN1atXL3Xp0kUjRozQtddeqwYNGkiSrrjiCnXv3l2rV692\n1qlataoeffRRRUdH69prr1V8fLy+++475efna+HChXr88cdVrVo1XXLJJYVeGN98882qWbOmoqKi\nNGTIEJ08eVLbtm1ztrtjxw5lZWUpLi5O7dq1c9bzer1q2rSpGjdurEaNGqlx48b67rvvJEmXXHKJ\nHn74Yd15552aPn26XnzxRacwaNOmjdq1ayePx6P69evrrrvu0scff+zXpqFDhyo+Pl4XX3yxLrnk\nEvXo0UMXXnihatSooWuuuUZff/21s6zH49Hjjz+umJgYde7cWddee63fp2w+//u//6uBAweqbdu2\n8ng8uvXWWxUbG6u1a9cqOjpaubm52rJli/Ly8lS/fn3neHfq1Ek7duxwtjN79myNGTPGKWRbtGih\nxMRE5/Fhw4bpV7/6lerVq6fBgwf7FdjlpUOHDrr++uslSbGxsXrllVc0ZswYXXDBBYqJidGjjz6q\nd955R/n5+Xr33Xd13XXXqVOnToqJidHjjz8e9pzmL774QocPH9bDDz+s6OhopaSk6M4779Q///lP\nZ5mOHTvq6quvlsfjUb9+/ZxPr9euXasff/xRTz75pKpVq6aqVauqY8eOkqR+/fr5fSL+xhtvqF+/\nfs7tnTt3Osv6BL5BMmLECNWsWVOxsbH68MMP1aBBA/Xv318ej0etWrXSb37zG7399tthXQNFeeWV\nV/TQQw+pSZMmioqK0kMPPaSNGzf6fdr60EMPqUaNGqpfv77S0tK0ceNGSWc+oR06dKjatGkjSWrY\nsKHq16+vOnXqqFOnTnr77bclSR999JFq1aql1q1bh90uH36ICQAAoJLIS0tTXlqac/tEenqZtldt\n/PhSb2P27Nnq0qWL332LFy/W008/re3btys/P18nTpzw+1Ga8847T1FRv3zmUr16df3nP//RoUOH\ndPr0af361792Hqtfv77ftqdMmaLZs2frxx9/lCRlZ2fr8OHDks78sNLYsWPVsWNHNWjQQCNHjtR/\n/dd/STpTLG7fvj1kAdS/f3/95S9/0W9/+1s1bNjQuX/79u0aM2aM1q1bp+PHj+v06dPOi3qf888/\n3/l3tWrVlJyc7Hf74MGDzu3ExERVq1bNuX3hhRdq//79hdqzZ88ezZ071/nastfrVV5envbt26cr\nrrhCf/3rXzVhwgR9++236tGjh5566ildcMEFhbbzww8/OAVtMAWPdai2lFW9evX8bu/du1d33nmn\n0we8Xq9iYmJ04MAB7d+/32/5uLg45xPN4uzdu1f79u1zCnSv16v8/Hx17tzZWaZOnTp+2z5x4oTy\n8/P173//WxdeeKFfv/Rp3769qlevro8//ljJycnauXOnbrjhhvAPgPyP8549e7R27Vq/dp4+fVr9\n+/fXoUOHlJeXV+Q1UJQ9e/Zo1KhRzlfjvV6vPB6P9u3b52ynYP+sXr26srOzJZ3pK40aNQq63Vtv\nvVWvvvqq7rzzTr355pu69dZbw25TQRStAAAAOOcCP1E6deqU7r77br3wwgu68cYbFRUVpTvvvDPo\nV3MD1a5dW9HR0frhhx/UpEkTSWdeSPusXr1aU6dO1dtvv63mzZtLkho3buxsu1GjRk6R984772jg\nwIF+X731vYAP5pFHHtF1112npUuX6tNPP3XmJj7yyCNKTU3Vyy+/rLi4OL3wwgt69913wz08hRw5\nckTHjx9X9erVJZ0ptIL9ymy9evU0YsQIDR8+POh2+vbtq759+yo7O1vDhw/Xn//8Z02fPj3odr7/\n/nvneAX64YcfnB8N2rt3r1P4xsXFKScnx1muLMVs4DGvV6+epkyZossvv7zQsnXq1HE+AZeknJwc\nv7mj8fHxOn78eNB21atXTw0bNtTnn39e4jbWq1dPe/fuVX5+ftDC9bbbbtPcuXNVp04d/fa3v1XV\nqlVLtP2Cx6BevXq68sorg36qnZ+fr5iYmJDXgO+r3Tk5OUpISJAk5w0c37YfeeQR9e3bt0Tt860b\nOIfcp2fPnho5cqS2bNmiRYsW6cknnyzx9iW+HgwAAFApFfzEtSK34XPq1CmdOnVKtWrVUlRUlBYv\nXuw3p7AoUVFR+s1vfqMJEybo+PHj+uabb/Taa685j2dnZ6tKlSpKSkrSqVOnNHHiROdTIkl68803\nnU9df/WrX8nj8fh9mheqcJ47d66+/vprTZs2TePGjdMDDzzgFGzHjh1TjRo1FBcXp61bt+of//hH\nqY6Lj9fr1fjx45Wbm6vVq1dr8eLFQX/F+He/+53+8Y9/6IsvvpAk/ec//9HixYv1n//8R9u2bdOq\nVat06tQpVa1aVdWqVQtZjN9xxx3OnFxJ2rx5s9/fDp0yZYqOHj2qvXv36oUXXtBNN90kSWrdurVW\nr16tvXv36ueff1ZGRkaZchc0cOBA/eUvf3G+snro0CF98MEHks78qNCHH36ozz77TLm5uRo3bpzf\neWvVqpUWL16sI0eO6Mcff9SLL77oPNauXTslJCRo8uTJOnHihE6fPq0tW7boq6++CtkW37bbtWun\nOnXq6Mknn1ROTo5Onjypzz77zFnu5ptv1nvvvac333xT/fv3LzJfcW/QXHfdddq+fbveeOMN5eXl\nKTc3V1999ZW+++47RUVFqVevXiGvgVq1aqlu3bp68803lZ+fr1mzZun77793Hr/77rv13HPP6Ztv\nvpEk/fzzz87Xeotz5513aurUqc6PU+3cudM5R9WqVVOvXr103333qV27doU+PQ8XRSsAAEAlVJFF\na7BCKSEhQePHj9fdd9+txo0ba/78+cV+lbLgdiZMmKDs7GxdcsklevDBB3X77bc7j1199dXq0aOH\nOnTooLZt26p69ep+L56XLFmizp07KyUlRaNHj9bLL7+s2NhYZx+NGjVSSkqK89+MGTO0d+9ejRkz\nRjNmzFBcXJz69u2rtm3bavTo0ZKkp556Sm+++aZSUlI0YsQI5xdhQx2D4uZf1qlTR4mJiWrRooUG\nDx6s5557ThdddFGhdS+99FJNmjRJjz32mBo3bqzLL7/cKV5OnTqlJ598Uk2bNlWLFi10+PBh/eEP\nf5B05oeYfD/KJJ35td3evXurb9++atCggYYOHer3SeWNN96o7t27q3v37rr++ut1xx13SJK6deum\nPn36qEuXLrr66qt13XXXFZkr3PySNHjwYN1www1Om66//np9+eWXkqTmzZvr6aef1r333qsWLVoo\nKSnJ76uyt956q1q2bKk2bdrolltucYps6cybHq+99po2bNigtm3bqlmzZnrooYd07NixYtsbFRWl\nOXPmaMeOHUpNTVXr1q395hrXr19fqamp8ng8zqfwPikpKX6/Yl1cn0hISNC8efP0z3/+Uy1atFCL\n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\nbZuOHDmi48ePq0mTJpKkq666yllnzZo1zrY6deqkjRs3SpLWr1+v1NRUxcXFKT4+Xqmpqc4LiI0b\nN6pjx46SpK5du+rzzz8v84Eoq3P5YiAS65vIxkyAG7jt2mOcCk9FjzNu61emKm3RivLFMa9YHP/K\np1RzWo8eParExERJUmJioo4ePSpJysrKcr4yJUlJSUnKyspSVlaWatWq5dxfq1YtZWVlOev4HouK\nilJcXJyys7MLrePb1rFjx5SQkKCoqChnWz/99FNpYrgW8wbMwzlBJNG/So5xqmLZ0mdtySHZlcUm\ntpwXW3LAXMXOaQ2Hx+Mpj81IkvM1rbIucy5Uycx03umpPnGic39eWpry0tL8HpekxDp1lNehg/JT\nUiRJcUOGSJJqdOmiKps2SZK80dHynD6tKpmZygvx9apmc+Y4t71RUfLk5/vtP27IEJ0aMCDo+hWt\n0DGpW1cnhg1zHpOkhF69JJ05pt6oKNXo0kX5ycmSJK+kUL2t2vjxzrEvTtyQIYravdu57fV45Ano\nVzW6dDnTxjp1JEnxffv6PV6zQQPn31eMGuXXjoL/D2yT7xj49u/L642JCStD4DH07SvUetXGj3f2\n5esvvmy+PijJ6Zeni2iHL5N0pq86bY+NlefkyaDL+cTOmCHP2cLBlzehVy9nv4FqdOnit3xBv0pN\n/WU7ZzMVFOo6CjxuBc+7ry2nBgwIuk/TBPaDwHMgBT8PxflVaqqi9+49s02dud4KHuOSXGcmYZwq\n2zgV37evqi5b5lxbUui+4PZxSvrlucKXw3ctxc6YIemX45J4/vmSfhkvpMiPU9UnTnTOQ+CxLdgO\nyaxxynd/qPV8x9Qt45TvNUrB8aigguNL4HIFH2s2Z46qSE6OosYpb3S0c+24AeMUylOpPmlNTEzU\nkSNHJElHjhxRzZo1JZ15l/nQoUPOcocPH1ZSUpKSkpJ0+PDhQvf71vE9lp+fr+PHjyshISHktmrU\nqKGcnBzln+2YBbdVnILvAmVmZpb59nJJJ9LTdSI9XZL0UVqaTqSnKy8tze9xSfq2f395cnOVvXCh\ncqZPlyQtOvukc2zVKmeZIwcPSpKWh2hvXlqaks+u/23//jpS4Bh927+/JCln+vSQ6xd1bMr7+IRq\nv98xOXnSub387LLZCxc66x05dEjHVq3Sh8OHn8l79pOPgo6PHCnpzPH3PUEV155FAwboX2f3e3zk\nSC18++1C2/1g3DhJkic3V5L04fDhzvLf9u+v92bP1vGRI3V85EitPrusdOacf9u/f6H+4Nt/Xlqa\nPkpL06IBA3R85EhlL1yob/v318J584IuH9h+3/ofpaX5ZV8uBV3+RHq6Fg0Y4PSX4yNH6oNx4/Rt\n//7KmT5dOdOna9GAAc72fv7xx0LbK5jNl2/h/PnKXrjwzPF7802/5QLbJ0lLWrf2X3/ePOd68PXd\nwOP/89df+23Dd/zfP3sNSGf6SMH1j48cqYVn5y8G9ofAAezI4cPO+fxXerpypk8POsgFXjvh9PeS\nLB+4TnGPSyr0/BJ4DiT/56fi3gX3HcOfv/7auX0kK+vM8VywwHn8RHp6sc8v4eSNNMap8h2n/jNv\nniRp4fz5xT7vuH2ckn557th6Nr/vGC1p3dppvySngD+2apXzvFpwnPLlLe9xyvdaYeGCBX7HyDdu\nmThOSQo5Tvnyum2cWrhgQchxyu98HTqk9wts48jhw86/k8+OO+GMUwvnz2eckj3jFEomrE9avV6v\n37vG7dq10/Lly9W7d28tX75c7du3lyS1b99ekydPVq9evZSVlaX9+/erSZMm8ng8iouL07Zt23TR\nRRdp5cqVuuGGG5x1VqxYoaZNm2r16tVq1aqVJKlNmzZ6/fXXnYF/w4YNuv322yVJLVu21KeffqrO\nnTtrxYoVzv6LU3CSeOCE8bLeLm77KUHepQu2zIkS7K/g8oH7CGf9oh6P9O3A9hbXxrS0NFXLzPTL\nG2yZ8mxfUcukpKQoOS1NOvsEF+xcJofTnrPrh718iPXDWb7g8Qt2u6jtBSppvsBlAtcP5/oo6rHi\n+lJJ8xS3v3P9/FHc8sW1P9Q2Cgo8hoHPR9VCnMvS3I4ExqlzM06lFfG8Z+M4VZI2Bhuninpuqmzj\nVOAylW2cCnweLclroGDtCWd/5Xk78D7GKZxrxX7SmpGRoSeeeEL79u3T/fffr2XLlql3797asGGD\nhg0bpo0bN6p3796SpPr16+uKK67Q8OHDNW7cOA0aNMj5StY999yjGTNmaNiwYbrgggt06aWXSpJ6\n9Oihn3/+WUOHDtX777+vAWff1UxISFDfvn2Vnp6u0aNH6+abb3Z+aOP222/XwoULNWzYMGVnZ6tH\njx4ROTjlKS+MiyGcZaRf3jkKXD7c9U3x1dlPPsIVKl9Zc5d0/by0X94p9/078N25cLdZcDulUZL1\nAvcVbN1gWYrbb1FtCPeclWQbododzrZCbd/0a6e4c1Ie7Q91nMvaR88FxqnyUdLnraLYMk6V9JOX\n4ggvoSYAACAASURBVK6j0mKc8l/GjeNUqDaFm8X0a4dxCpFW7Cetw87ONwz0xBNPBL2/T58+6tOn\nT6H7GzdurGeffbbQ/TExMRoxYkTQbXXr1k3dunUrdH9ycrLGjh1bRKvNU55Fa6jl3XaxHj77Natw\nmVS0Fvq3RS8GArMUt18TXgyUtWh1u8r+YoBxqnyUZ9EaalmT+1F5MKloLfRvxqkSte9cFa3hsOG6\nqezjFMquVHNaUbHSLLkobckhkQWRxTmB29jSZ23JIZHFVLZksSUHzEXRCgAAAAAwFkWrC9ny62a2\n5JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoks\nprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiL\notWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBt\nbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6K\nVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsO\niSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIq\nW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsSha\nXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaW\nPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgF\nAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDI\ngsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIl\niy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWF\nbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmz\ntuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAA\nAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyI\nLM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LY\nkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciW\neQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtL\nDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAA\nABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsji\nnMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05\nYC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQyGIqW7LYkgPmomgFAAAAABiLotWFbJk3\nYEsOiSyILM4J3MaWPmtLDoksprIliy05YC6KVgAAAACAsShaXciWeQO25JDIgsjinMBtbOmztuSQ\nyGIqW7LYkgPmomgFAAAAABiLotWFbJk3YEsOiSyILM4J3MaWPmtLDoksprIliy05YK4qZVl5/vz5\nWrVqlaKiopSSkqIhQ4boxIkTmjRpkg4ePKjk5GQNHz5ccXFxzvLLli1TdHS0Bg4cqDZt2kiSduzY\noenTpys3N1dt27bVwIEDJUl5eXmaOnWqduzYoRo1amj48OGqXbu2JGn58uWaP3++JOmmm25S165d\nyxIFAGAhxikAANyv1J+0Hjx4UEuWLNHEiRP1zDPP6PTp08rMzNSCBQvUunVrZWRkqGXLls6AvXfv\n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\nDunuu+/Wrl279PnPfz4xYff09Oivf/2rOjs7tWnTJj3//PMKgkCS9Pzzz+v73/++du3apX//+986\nefKkJOlPf/qTGhoatHv3bn3961/Xiy++KEnq7+/XH/7wB23btk1bt27V73//e129erWYKF6xsm7A\nSg6JLC6ykkOylWW8MU+VhpUxayWHRBaEiz5B2AouWq9evarTp0/rgQcekCRVVlaqrq5Ox48fT3ya\n3NLSou7ubknS8ePH9ZWvfEWVlZWaMmWKpk6dqjNnzujKlSu6du2aZs2aJUm6//77E6/p7u5OHOvL\nX/6y/vnPf0qS/v73v2v27Nmqq6tTfX29Zs+enfgFAgAAiXkKAAArCi5aL1y4oAkTJmj//v368Y9/\nrF/96le6fv26+vr61NTUJElqampSX1+fJKm3tzfxlSlJikaj6u3tVW9vryZPnpzYPnnyZPX29iZe\nE3+uoqJCdXV16u/vH/Ga+LHKhZV1A1ZySGRxkZUckq0s44l5qnSsjFkrOSSyIFz0CcJWcNEai8V0\n9uxZPfjgg9q+fbtqamp06NChEftFIpGiGpgs/jUtAABGwzwFAIANBRet0WhUkydP1syZMyXd/FrU\n2bNn1dTUpCtXrkiSrly5osbGxsT+ly5dSrz+8uXLikajikajunz58ojt8dfEn4vFYrp27ZoaGhoy\nHms0yZ8CdXV1jenjbOfK9DjbPumOHd8WXzdQTPvSHTvM65PL9Sr2+GHmGa29YeQp1eP58+cXlC/b\n86n75HK9872/xno85Hu+Ys6fLl8ubcjn+KO9H5Ty/g8L89T4z1NxzFPMU2E+tjJPjfV4yvd8+eyf\nLl8ubcjn+KO9HxRz/GLvJ5ReJCjiY+HNmzfre9/7nj75yU/qlVde0fXr1yVJDQ0NWr58uQ4dOqSP\nPvpIjz76qHp6erR7925t3bpVvb292rJli3bv3q1IJKKnn35aa9as0cyZM9XR0aElS5Zozpw5ev31\n13X+/HmtXbtWx44dU3d3t5544gn19/dr06ZN2r59u2KxmDZt2qSOjg7V19dnbOvhw4c1b968QqNm\nNSnpF5H3k77+lbo93X6ZtiXvH/859djvZ/iqWbrnUo+V2q5MxwpLuoyp7Sz0mPnsN9prJqX5JTPb\ndc/2fCmMVd/mkm20+yDXdqTbP9u9M1qb0t0L+Y6TXM9XyHmSj53L8dPdM6Ndk9T7LVnye8BoGcdi\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0c7d426990>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# It is possible to mix in the same plot multiple events\n",
"\n",
"# The LinePlot module requires to specify a list of signals to plot.\n",
"# Each signal is defined as:\n",
"# <event>:<column>\n",
"# where:\n",
"# <event> is one of the events collected from the trace by the FTrace object\n",
"# <column> is one of the column of the previously defined event\n",
"my_signals = [\n",
" 'cpu_frequency:frequency',\n",
"]\n",
"\n",
"# These two paramatere are passed to the LinePlot call as long with the\n",
"# TRAPpy FTrace object\n",
"trappy.LinePlot(\n",
" \n",
" # FTrace object\n",
" ftrace,\n",
" \n",
" # Signals to be plotted\n",
" signals=my_signals,\n",
" \n",
" # Generate one plot for each value of the specified column\n",
" pivot='cpu',\n",
" \n",
" # Generate only plots which satisfy these filters\n",
" filters = {\n",
" # Column\n",
" # | Values\n",
" # | |\n",
" 'cpu' : [0, 1]\n",
" },\n",
" \n",
" # Formatting style\n",
" drawstyle='steps-post',\n",
" marker = '+'\n",
"\n",
").view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using TRAPpy Interactive LinePlotter"
]
},
{
"cell_type": "code",
"execution_count": 298,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<table style=\"border-style: hidden;\">\n",
"<tr>\n",
"<td style=\"border-style: hidden;\"><div class=\"ilineplot\" id=\"fig_6b43ce4d5c7a47799d847802f8915e43\">\n",
" <script>\n",
" var ilp_req = require.config( {\n",
"\n",
" paths: {\n",
" \"dygraph-sync\": '/nbextensions/plotter_scripts/ILinePlot/synchronizer',\n",
" \"dygraph\": '/nbextensions/plotter_scripts/ILinePlot/dygraph-combined',\n",
" \"ILinePlot\": '/nbextensions/plotter_scripts/ILinePlot/ILinePlot',\n",
" \"underscore\": '/nbextensions/plotter_scripts/ILinePlot/underscore-min',\n",
" },\n",
"\n",
" shim: {\n",
" \"dygraph-sync\": [\"dygraph\"],\n",
" \"ILinePlot\": {\n",
"\n",
" \"deps\": [\"dygraph-sync\", \"dygraph\", \"underscore\"],\n",
" \"exports\": \"ILinePlot\"\n",
" }\n",
" }\n",
" });\n",
" ilp_req([\"require\", \"ILinePlot\"], function() {\n",
" ILinePlot.generate('fig_6b43ce4d5c7a47799d847802f8915e43', '/nbextensions/');\n",
" });\n",
" </script>\n",
" </div></td>\n",
"</tr>\n",
"<tr>\n",
"<td style=\"border-style: hidden;\"><div style=\"text-align:right\" id=\"fig_6b43ce4d5c7a47799d847802f8915e43_legend\"></div></td>\n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table style=\"border-style: hidden;\">\n",
"<tr>\n",
"<td style=\"border-style: hidden;\"><div class=\"ilineplot\" id=\"fig_34331fb9b3114bc892e55571e87c4bff\">\n",
" <script>\n",
" var ilp_req = require.config( {\n",
"\n",
" paths: {\n",
" \"dygraph-sync\": '/nbextensions/plotter_scripts/ILinePlot/synchronizer',\n",
" \"dygraph\": '/nbextensions/plotter_scripts/ILinePlot/dygraph-combined',\n",
" \"ILinePlot\": '/nbextensions/plotter_scripts/ILinePlot/ILinePlot',\n",
" \"underscore\": '/nbextensions/plotter_scripts/ILinePlot/underscore-min',\n",
" },\n",
"\n",
" shim: {\n",
" \"dygraph-sync\": [\"dygraph\"],\n",
" \"ILinePlot\": {\n",
"\n",
" \"deps\": [\"dygraph-sync\", \"dygraph\", \"underscore\"],\n",
" \"exports\": \"ILinePlot\"\n",
" }\n",
" }\n",
" });\n",
" ilp_req([\"require\", \"ILinePlot\"], function() {\n",
" ILinePlot.generate('fig_34331fb9b3114bc892e55571e87c4bff', '/nbextensions/');\n",
" });\n",
" </script>\n",
" </div></td>\n",
"</tr>\n",
"<tr>\n",
"<td style=\"border-style: hidden;\"><div style=\"text-align:right\" id=\"fig_34331fb9b3114bc892e55571e87c4bff_legend\"></div></td>\n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also produce interacive plots\n",
"trappy.ILinePlot(\n",
" ftrace, # TRAPpy RUN object\n",
" signals=[\n",
" 'cpu_frequency:frequency'\n",
" ],\n",
" drawstyle='steps-post',\n",
" per_line=1,\n",
"# sync_zoom=True,\n",
"# group='UtilVsFrequency',\n",
" marker = '+').view()\n",
"\n",
"trappy.ILinePlot(\n",
" ftrace, # TRAPpy RUN object\n",
" signals=[\n",
" 'sched_load_avg_task:util_avg'\n",
" ],\n",
" filters={\n",
" 'pid': [most_switching_pid]\n",
" },\n",
" drawstyle='steps-post',\n",
" per_line=1,\n",
"# sync_zoom=True,\n",
"# group='UtilVsFrequency',\n",
" marker = '+').view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can find much more exaples of plotting in TRAPpy on the example\n",
"notebook available on the GitHub:<br>\n",
" https://github.com/ARM-software/trappy/blob/master/doc/Plotter.ipynb"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data aggregation and analysis"
]
},
{
"cell_type": "code",
"execution_count": 274,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>__comm</th>\n",
" <th>__cpu</th>\n",
" <th>__pid</th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" <th>start</th>\n",
" <th>delta</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.661132</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>2</td>\n",
" <td>1807000</td>\n",
" <td>0.661132</td>\n",
" <td>0.000004</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.661136</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>3</td>\n",
" <td>1807000</td>\n",
" <td>0.661136</td>\n",
" <td>0.051760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.712896</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>2</td>\n",
" <td>507000</td>\n",
" <td>0.712896</td>\n",
" <td>0.000009</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.712905</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>3</td>\n",
" <td>507000</td>\n",
" <td>0.712905</td>\n",
" <td>0.473305</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1.186210</th>\n",
" <td>sh</td>\n",
" <td>0</td>\n",
" <td>20289</td>\n",
" <td>0</td>\n",
" <td>507000</td>\n",
" <td>1.186210</td>\n",
" <td>0.000252</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" __comm __cpu __pid cpu frequency start delta\n",
"Time \n",
"0.661132 kschedfreq:2 2 119 2 1807000 0.661132 0.000004\n",
"0.661136 kschedfreq:2 2 119 3 1807000 0.661136 0.051760\n",
"0.712896 kschedfreq:2 2 119 2 507000 0.712896 0.000009\n",
"0.712905 kschedfreq:2 2 119 3 507000 0.712905 0.473305\n",
"1.186210 sh 0 20289 0 507000 1.186210 0.000252"
]
},
"execution_count": 274,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = ftrace.cpu_frequency.data_frame\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 275,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>__comm</th>\n",
" <th>__cpu</th>\n",
" <th>__pid</th>\n",
" <th>cpu</th>\n",
" <th>frequency</th>\n",
" <th>start</th>\n",
" <th>delta</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.661132</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>2</td>\n",
" <td>1807000</td>\n",
" <td>0.661132</td>\n",
" <td>0.000004</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.661136</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>3</td>\n",
" <td>1807000</td>\n",
" <td>0.661136</td>\n",
" <td>0.051760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.712896</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>2</td>\n",
" <td>507000</td>\n",
" <td>0.712896</td>\n",
" <td>0.000009</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.712905</th>\n",
" <td>kschedfreq:2</td>\n",
" <td>2</td>\n",
" <td>119</td>\n",
" <td>3</td>\n",
" <td>507000</td>\n",
" <td>0.712905</td>\n",
" <td>0.473305</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1.186210</th>\n",
" <td>sh</td>\n",
" <td>0</td>\n",
" <td>20289</td>\n",
" <td>0</td>\n",
" <td>507000</td>\n",
" <td>1.186210</td>\n",
" <td>0.000252</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" __comm __cpu __pid cpu frequency start delta\n",
"Time \n",
"0.661132 kschedfreq:2 2 119 2 1807000 0.661132 0.000004\n",
"0.661136 kschedfreq:2 2 119 3 1807000 0.661136 0.051760\n",
"0.712896 kschedfreq:2 2 119 2 507000 0.712896 0.000009\n",
"0.712905 kschedfreq:2 2 119 3 507000 0.712905 0.473305\n",
"1.186210 sh 0 20289 0 507000 1.186210 0.000252"
]
},
"execution_count": 275,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Lets compute the residency on each OPP\n",
"df.loc[:,'start'] = df.index\n",
"df.loc[:,'delta'] = (df['start'] - df['start'].shift()).fillna(0).shift(-1)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 276,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"07:37:46 INFO : Residency time per OPP:\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>delta</th>\n",
" </tr>\n",
" <tr>\n",
" <th>frequency</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>507000</th>\n",
" <td>11.141186</td>\n",
" </tr>\n",
" <tr>\n",
" <th>702000</th>\n",
" <td>1.832051</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1001000</th>\n",
" <td>2.810101</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1105000</th>\n",
" <td>1.160819</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1183000</th>\n",
" <td>1.321498</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1209000</th>\n",
" <td>2.794528</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1404000</th>\n",
" <td>9.991687</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1612000</th>\n",
" <td>0.506026</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1807000</th>\n",
" <td>2.727041</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" delta\n",
"frequency \n",
"507000 11.141186\n",
"702000 1.832051\n",
"1001000 2.810101\n",
"1105000 1.160819\n",
"1183000 1.321498\n",
"1209000 2.794528\n",
"1404000 9.991687\n",
"1612000 0.506026\n",
"1807000 2.727041"
]
},
"execution_count": 276,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Now we can get group by frequency and sum the partional residency times\n",
"freq_residencies = df.groupby('frequency')['delta'].sum()\n",
"logging.info(\"Residency time per OPP:\")\n",
"df = pd.DataFrame(freq_residencies)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 283,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"07:43:01 INFO : Freq 507000Hz : 32.5%\n",
"07:43:01 INFO : Freq 702000Hz : 5.3%\n",
"07:43:01 INFO : Freq 1001000Hz : 8.2%\n",
"07:43:01 INFO : Freq 1105000Hz : 3.4%\n",
"07:43:01 INFO : Freq 1183000Hz : 3.9%\n",
"07:43:01 INFO : Freq 1209000Hz : 8.2%\n",
"07:43:01 INFO : Freq 1404000Hz : 29.1%\n",
"07:43:01 INFO : Freq 1612000Hz : 1.5%\n",
"07:43:01 INFO : Freq 1807000Hz : 8.0%\n"
]
}
],
"source": [
"# Compute the relative residency time\n",
"tot = sum(freq_residencies)\n",
"#df = df.apply(lambda delta : 100*delta/tot)\n",
"for f in freq_residencies.index:\n",
" logging.info(\"Freq %10dHz : %5.1f%%\", f, 100*freq_residencies[f]/tot)"
]
},
{
"cell_type": "code",
"execution_count": 281,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f0c79c6c9d0>"
]
},
"execution_count": 281,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5sAAAFqCAYAAACUOk6FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xu4JHd5H/jvKw2WuUnoYjQyFw0EyNoOMQJBYIH4YBsE\nsc0lWMgmMSzGMY6N8RKvjUz8wLDEBIjDGuMHslxWCLJcjbgGWeLig8FeAUaSERcDiZFAgARiJK4B\nSfDuH90aRmdmNGdm6pyq0/35PE8/dFdXnXrpV11T366qX1V3BwAAAIZ0xNgFAAAAsHiETQAAAAYn\nbAIAADA4YRMAAIDBCZsAAAAMTtgEAABgcAcMm1V1VFV9sKouqqqPV9Vz5tOfWVWXV9WF88dDN75c\nAAAAtoJaz302q+oW3f3tqjoyyV8n+d0kP5vkG939gg2uEQAAgC1mXafRdve350+Pmi9z9fx1bURR\nAAAAbG3rCptVdURVXZTkiiSr3f2J+VtPrqqLq+rlVXXMhlUJAADAlrKu02h3z1x1dJLzkzwtySeS\nXNXdXVX/IclJ3f3EjSkTAACArWTbwczc3V+vqv+W5NTuft8eb70sydv3tUxVrT/NAgAAsOV0916X\nWK5nNNoTbjhFtqpunuTBSS6uqu17zPYvk3zsJla85R/PfOYzR6/BQy+m9tCL6Tz0YjoPvZjWQz+m\n89CL6Tz0YjqPRenF/qznyOZJSc6uqpqH01d393uq6lVVdY8k309yaZInreNvAQAAsAQOGDa7+5Ik\n99zH9MdtSEUAAABseesajZZkZWVl7BKY04vp0Ivp0Ivp0Itp0Y/p0Ivp0IvpWPReHNRotIe0gqre\n6HUAAAAwjqpK72OAoIMajRYAAGDR7NixI5dddtnYZUzeySefnEsvvXTd8zuyCQAALLX5kbmxy5i8\n/X1O+zuy6ZpNAAAABidsAgAAMDhhEwAAgMEJmwAAAFvIE57whDzjGc844Hx3utOd8t73vncTKto3\nYRMAAGDBPetZz8rjHve4TV2nsAkAALDG9u07UlUb9ti+fcfY/xc3nLAJAACwxpVXXpakN+wx+/vr\nc9FFF+Ve97pXjjnmmPzSL/1SvvOd7+x+7x3veEdOOeWUHHvssXnAAx6QSy65ZK/lzzvvvDznOc/J\n61//+tz61rfOKaeckiR55StfmR//8R/P0Ucfnbvc5S556UtfehCf0IEJmwAAABN13XXX5VGPelQe\n//jHZ9euXTn99NPzpje9KUly8cUX54lPfGJe9rKXZdeuXXnSk56Uhz/84bnuuutu9DdOO+20PP3p\nT88ZZ5yRb3zjG7nooouSJCeeeGLe+c535utf/3rOOuusPPWpT83FF188WO3CJgAAwERdcMEFuf76\n6/OUpzwlRx55ZB796Efn3ve+d5LkpS99aX7jN34jp556aqoqv/Irv5KjjjoqF1xwwbr+9sMe9rDs\n2LEjSfLABz4wD3nIQ/L+979/sNqFTQAAgIn64he/mNvd7nY3mnbyyScnSS677LL88R//cY477rgc\nd9xxOfbYY3P55Zfni1/84rr+9rnnnpv73e9+Of7443Psscfm3HPPzVVXXTVY7cImAADARJ100kn5\nwhe+cKNpn/vc55Ikd7zjHfOHf/iH2bVrV3bt2pWrr7463/zmN3PGGWfs9Xeq6kavr7322vziL/5i\nfv/3fz9f+cpXcvXVV+dhD3tYunuw2oVNAACAibrf/e6Xbdu25UUvelGuv/76nHPOOfnQhz6UJPm1\nX/u1vOQlL9n9+lvf+lbe+c535lvf+tZef+fEE0/MpZdeujtMXnvttbn22mtzwgkn5Igjjsi5556b\n888/f9DaFyJsbvSwxJvxWIahjwEAgINzs5vdLOecc07OOuusHH/88XnjG9+YRz/60UmSe93rXnn5\ny1+eJz/5yTnuuONyt7vdLWefffbuZfc8mnn66aenu3P88cfn1FNPza1udau88IUvzOmnn57jjjsu\nr3vd6/KIRzxi0NpryMOk+1xBVW/COjIbQngrq0EPWQMAAOtTtfe++PbtOw7q9iQH68QTT84VV1y6\nYX9/I+zrc9pjeu01XdicCmETAADGsL8QxY0dbNhciNNoAQAAmBZhEwAAgMEJmwAAAAxO2AQAAGBw\nwiYAAACDEzYBAAAY3LaxCwAAABjTySefPL+dIjfl5JNPPqj53WdzMtzbBwAA2HrcZxMAAIBNI2wC\nAAAwOGETAACAwQmbAAAADO6AYbOqjqqqD1bVRVX18ap6znz6sVV1flV9qqrOq6pjNr5cAAAAtoJ1\njUZbVbfo7m9X1ZFJ/jrJ7yZ5eJKvdvfzq+ppSY7t7jP3sazRaNfFaLQAAMDWc1ij0Xb3t+dPj5ov\nc3WSRyQ5ez797CSPHKBOAAAAFsC6wmZVHVFVFyW5Islqd38iyYndfWWSdPcVSW67cWUCAACwlWxb\n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\nazYXWVUdk+Sh+cF9Q7+Q5Lzuvma8qpaXfgAAwNbjyOYaVfW4JBcmWUlyi/njQUk+Mn+PTaQfAACw\nNRkgaI2q+lSSf7b2qFlVHZvkg919t3EqW076MR1VtS3JE5M8KsmPzid/IclbMxuN+rqxals2ejEd\nejEt+jEdejEdejEdy9gLYXONqvp0knt399fWTD8myd92913HqWw56cd0VNVrk1yT5Owkl88n3z7J\n45Mc191njFXbstGL6dCLadGP6dCL6dCL6VjGXgiba1TV45M8I7P7h35+PvmOSR6c5Nnd/cqRSltK\n+jEdVfXp/R1Jvqn3GJ5eTIdeTIt+TIdeTIdeTMcy9sI1m2t099lJTk3yviTfnT9Wk5wq2Gw+/ZiU\nXVV1elXt3m5U1RFVdUaSq0esaxnpxXToxbTox3ToxXToxXQsXS8c2bwJVXVcknT3rrFrQT/GVlU7\nkjwvyU9ntkGsJMck+cskZ3b3Z0crbsnoxXToxbTox3ToxXToxXQsYy+EzTWq6o5Jnp/ZfwRfy+w/\ngqOTvDez/wguHa+65aMf01RVxydJd3917FqWnV5Mh15Mi35Mh15Mh15Mx7L0Qthco6r+vyR/kuTP\nu/t782lHJjk9yf/e3fcds75lox/T4p6n06EX06EX06If06EX06EX07FsvXDN5t5O6O7X3xBskqS7\nv9fdr0ty/Ih1LSv9mAj3PJ0OvZgOvZgW/ZgOvZgOvZiOZeyFI5trVNXrkuzKbEjiG0Y/vUNmQxKf\n0N2PGau2ZaQf0+Gep9OhF9OhF9OiH9OhF9OhF9OxjL3YNnYBE/S4zG62+qzc+PD225K8Yqyilph+\nTEcl2devU9+fv8fm0Yvp0Itp0Y/p0Ivp0IvpWLpeCJtrdPe1SV4yfzAy/ZiUP0pyYVXt856no1W1\nnPRiOvRiWvRjOvRiOvRiOpauF06j3YeqOi3JI3PjI2lv7e6/GK+q5aUf0zE/zeO07H1R+0LeG2rK\n9GI69GJa9GM69GI69GI6lq0XwuYaVfUnSe6W5FVJLp9Pvn1mp3N+prt/Z6zalpF+TJN7nk6HXkyH\nXkyLfkyHXkyHXkzHsvRC2Fyjqj69r4tzq6qSfLq77zpCWUtLP6bDPU+nQy+mQy+mRT+mQy+mQy+m\nYxl74dYne/tOVd17H9PvneQ7m10M+jEhr0/y5iQndfddu/suSU5K8pYkrxu1suWjF9OhF9OiH9Oh\nF9OhF9OxdL1wZHONqrpXkhcnuXV+cNrmHTL79eG3uvsjY9W2jKrqnpkNDqQfI6uqz+zvSPJNvcfw\n9GI69GJa9GM69GI69GI6lrEXwuZ+VNX27HHhbndfMWY9y04/xueep9OhF9OhF9OiH9OhF9OhF9Ox\njL0QNteoqn/a3R8duw5urKpu1t3XrZl2QndfNVZNy6aqfiize54+Ij8I/pcneXuSV3T3d8eqbdns\npxe77z+rF5tHL6ZFP6ZDL6bDv9/TsYy9EDbXqKrvJfmHzM6bfm13f2LkkpZaVT0oyauT/HCSC5P8\n+g0XT1fVhd19zxHLAwAA9sMAQXv7aJJHZfbZvK2q/q6qzqyqHaNWtbyen+S07j4hyUuTvKuq7jt/\nr8Yriz1V1TPGrmGZVNUJa17/66r606r69flIzWySqtpWVf+qqh46f/24qnpRVT1RL8ZRVQ+qqj+r\nqrdW1TlV9dyqusvYdZFU1XvHrmFZVdVp8+3SyWum/+pYNS2jqnpBVd1/7Do2kyOba6w9WlZV90ny\nS0kek+Rz3f2/jlbcEqqqv+vun9zj9U8kOSfJ05I8w5HNaaiqz3X3HceuY1nsuZ2qqj9M8sAkr0ny\n80ku7+6njlnfMqmqlye5TZIfSvI/kxyV5E1Jfi7J57v790Ysb+lU1X9Msj3Je5I8Mslnk3w6yW8m\neU53v3HE8pZKVa29JKkyu2/2p5Kku//pphe1pKrqOUkekNkZYr+Q5E+6+0Xz95wltomq6itJLkvy\nI5mNTPva7r5o3Ko2lrC5RlVd1N2n7GN6Jfnn3f2+EcpaWlX1t0l+fs8Bgarq9knekeQfdfetRytu\nyVTV1/f3VpKbd/e2zaxnme25naqqC5M8sLu/VVU3S3Jhd9993AqXR1V9rLv/yfyzvyKz4eyvrapt\nST6y549lbLyquuSG//7nPXhfd9+/qo5N8v7u/ifjVrg8quptSb6e5D9k9kNMJXl/ZqEn3X3ZeNUt\nl6q6JMkp3X19Vd0msx8nP9XdT93ffi8b44bPu6ruluSMzA5oHZnktZkFz0+PWuAGcBrt3v7Tvib2\njKC5+c5McuKeE7r78iQrSZ47RkFL7Jokd+3uo9c8bp3kS2MXt2RuXlWnzG/VdLPu/laSzAfR+t64\npS2d65Ldn/2Hu/va+evrk/g1d/N9v6qOmz//0cx24tLdV8elF5uqux+e2VH+lyb5yfl4C9d192WC\n5qbbNt8mpbuvyezo5tFV9cbMzspg83SSdPenu/vZ3f0TmZ09+cNJ3jlqZRtE2Fyju18zdg38QHe/\nu7v/bh/Tr+nuPxqjpiX2qiQn7+c935vN9aUkL0jyx0muqqqTkqSqjk9y/ZiFLaErqupWSdLdD71h\n4vx2TdeOVtXyek6Si6rqXUk+kOTZSVJVP5Jkr39L2Fjd/eYkD0uyUlVvjWAzlv9RVT91w4vu/l53\nPzGzU5p/bLyyltJeP3p190e7+w+6eyGvLXca7RpVdUySP8jsWo/bZvYLxJeTvDXJc+e/CLFJ9APW\nr6qOTHJUd3977FqWXVXdMsktu/vLY9eybOZHNu+c5L/7N2I6quonk9yvu//L2LUsm6q6eZJ09//c\nx3u36+4vbH5Vy6mqbtXd3xy7js3kGqu9vSHJe5Os3HCd4PwX6sfP33vIiLUtI/2YkPm1y/fJje+Z\n9qH2q9Wmu4leCJqbrKrumOTr3X3NfOTyU5P8fXd/bNTCltfVmZ0++9PzAYFtp0ayj+3URVVVerG5\n9hUy92Dsi03U3d9ctn0pRzbXqKpPdfc/Ptj32Bj6MR1V9ZAkL07ymcw2jEly+yR3SfKb3X3+WLUt\nG72Yjqo6M8mTknw3s9Oa/48kf53kvpndoPsFI5a3dHw3pkMvtgajyW+uZfxeCJtrVNX5Sd6d5Ozu\nvnI+7cQk/1uSB3f3z45Y3tLRj+moqk8medh8kIc9p98pyTu723Ufm0QvpqOqPp7ZkcxbJLk0yZ27\n+yvz02g/aPTTzeW7MR16MR1V9af7eyvJ47v76M2sZ5kt4/fCAEF7OyPJ8UneV1VXV9WuJKtJjsts\ntCg2l35Mx7Ykl+9j+heS3GyTa1l2ejEd35ufonZNZrd3+GqSzEcI9mvu5vPdmA69mI4nJPlYko+s\nefxtDGS22Zbue+GazTXmw6M/bf5IVT0ws/OqL+nuXWPWtqR+JcmfdffTxi6E/D9JPlxVr0vy+fm0\nO2R2j6hXjFbVctKL6fhYVb0myS2TnJfkDVX15iQ/E6OfjsF3Yzr21Ys7ZvYjsl5srg8n+Vh3/83a\nN6pq5+aXs9SWbhvlNNo1qupD3X2f+fNfS/JbSd6S2UA0b+9u93bcRFX1tSTfSvI/Mru9xhu7+6px\nq1peVfXjSR6eG1/U/rbu/sR4VS2nqvqxJI+IXoyqqo7KbCfhiu4+r6r+VZL7J/n7JP93d3931AKX\nkO3UdNhOTcN8hObvGEBuGpZtGyVsrlFVF3X3KfPnH07yL/a4/uaC7r77uBUul6q6KMm9kvxsZr+G\nPjyzUz/JWkUvAAAGeklEQVRem+Sc7v7GiOUBAOtUVbd1O6BpqKrju/urY9fB4nPN5t6OqKpj5zdH\nP7K7v5Lsvv7GzdI3X3f397v7/PkNiH80s1G8HprkH8YtbblU1TFV9dyq+vuq2lVVX62qT86n3Wbs\n+pipqnPHroEZvdh8VXV0Vf3Hqnp1Vf3ymvdePFZdy6iqjlv7SPKh+T7WcWPXt0zm/06fMH9+alX9\nQ5IPVtVlVfVTI5e3VOaf/19W1X+tqjtU1buq6pqq+nBVnTJ2fRvBNZt7OyazI2eVpKvqpO7+UlXd\naj6NzXWjz7y7r0vytiRvq6pbjFPS0nLP04moqnvu760k99jMWpadXkzOWZndUuBNSX61qn4xyWPn\npzPfd9TKls9VSS5bM+12SS7MbPCsO296Rcvr57r7zPnz/5TkjO7+cFXdLbNLlE4dr7Sl8+Ikz0xy\nmyR/k+Sp3f3gqvqZ+Xv3G7O4jeA02nWaB5sTu/uzY9eyTKrqbt396bHrwD1Pp6Sqvpfkfdn3D2D3\n7e6bb3JJS0svpqWqLu7ue+zx+t8n+ReZXYLxru7e348DDKyqfjfJg5P8XndfMp/22e6+07iVLZ/5\n7Tbu3t3XV9UF3X3fPd67xCVim2fN5Xo3usfpnu8tEkc212l+UbWguckEzUm5rKp+P/u+5+nnb2pB\nBvfJJE/q7s+sfaOq9GJz6cW0HFVVR3T395Oku/+oqr6Q5K+S3Grc0pZLd//nqnp9kv9r/l14ZtwO\naCwvTvLOqnpukr+oqhcmOSfJTye5eNTKls91VfWQzM6krKp6ZHe/ZX4680LehkbYBNbrjCRnZnbP\n09vOp12Z2WnNp49W1XLamf1fc//bm1gHejE1b89sB/rdN0zo7ldW1RVJXjRaVUuquy9PcnpVPTzJ\nu5K4/GUE3f2iqrokyb9NcrfM9v/vmtndFp49Zm1L6LeSPD/JlzIbufwVVfWqzE7///UxC9soTqMF\nDltVPaG7zxq7DvRiSvRiWvRjXFV18yT/qLs/phfToRfTsai9EDaBw7b2ugPGoxfToRfToh/ToRfT\noRfTsai9cBotsC5V9dH9vZXkxM2sZdnpxXToxbTox3ToxXToxXQsYy+ETWC9TkxyWpKr10yvzIbv\nZvPoxXToxbTox3ToxXToxXQsXS+ETWC93pHkVt2918h1VbW6+eUsNb2YDr2YFv2YDr2YDr2YjqXr\nhWs2AQAAGNz+hmsHAACAQyZsAgAAMDhhEwAAgMEJmwAslap6SlV9oqpePXYtALDIDBAEwFKpqk8m\n+Znu/uIe047s7u+NWBYALBxHNgFYGlX1kiR3SvIXVXVNVb2qqj6Q5FVVdURVPb+qPlhVF1fVv9lj\nuT+rqk9W1flV9d+q6l/Op3+2qo6bP79XVf3l/PktquoVVXVBVX2kqn5hPv3xVfWmqjq3qj5VVc/b\nYx0Pnc97cVW9q2Y+XVXHz9+vqvrMDa8BYOrcZxOApdHd/7aqTkuykuS3k/x8kvt397XzcHlNd/+z\nqvqhJH9dVecnuWeSu3b3j1XVSUk+keQVN/zJtauY/++/T/Ke7n5iVR2T5ENV9e75ez+Z5B5Jrkvy\nqar60yTfTfLSJA/o7s9V1W26u+en+v7rJC9M8rNJLu7urw78sQDAhhA2AVhmb+vua+fPH5Lk7lV1\n+vz10UnumuSfJ3ltknT3l6rqvXssX/v5uw9J8gtV9Xvz1z+U5I7z5+/p7m8mSVV9PMnJSY5L8r7u\n/tx8PdfM5z0ryVsyC5u/On8NAFuCsAnAMvvWHs8ryW9397v2nKGqfu4mlr8+P7gk5YfX/K1Hd/dn\n1vyt+2Z2FPMG388P/i3eK7h29+VVdWVVPSjJvZM89iZqAYBJcc0mAMtmf0cjz0vym1W1LUmq6q5V\ndYskf5XkjPk1nScledAey3w2yb3mzx+95m89ZfcKq+5xgJouSPLAqjp5Pv+xe7z3iiT/Nckb2qh+\nAGwhwiYAy2Z/ge3lmV2PeWFVXZLkvyQ5srvfnOS/J/l4klcm+Zs9lvk/k/xpVX0os6OcN3h2kptV\n1Uer6mPz+fZbS3dfleTXk7y5qi5K8ro95nlbklvO1w0AW4ZbnwDAQaiqs5K8vbvP2aT1nZrkP3f3\nT23G+gBgKK7ZBICDs2m/0lbV05L8RlyrCcAW5MgmAAAAg3PNJgAAAIMTNgEAABicsAkAAMDghE0A\nAAAGJ2wCAAAwOGETAACAwf3/5O/Pbo8cf7AAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0c77c5ccd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot residency time\n",
"fig, axes = plt.subplots(1, 1, figsize=(16, 5));\n",
"df.plot(kind='bar', ax=axes)"
]
}
],
"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
}