allwinner_a64/android/external/lisa/ipynb/tutorial/03_WlGenUsage.ipynb
2018-08-08 16:14:42 +08:00

1426 lines
48 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tutorial Goal"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This tutorial aims to show how to **configure and run** a **synthetic workload** using the **wlgen module** provided by LISA."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Configure logging"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import logging\n",
"from conf import LisaLogging\n",
"LisaLogging.setup()"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Execute this cell to enabled devlib debugging statements\n",
"logging.getLogger('ssh').setLevel(logging.DEBUG)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Other python modules required by this notebook\n",
"import json\n",
"import os"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test environment setup"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Setup a target configuration\n",
"conf = {\n",
" \n",
" # Target is localhost\n",
" \"platform\" : 'linux',\n",
" \"board\" : \"juno\",\n",
" \n",
" # Login credentials\n",
" \"host\" : \"192.168.0.1\",\n",
" \"username\" : \"root\",\n",
" \"password\" : \"\",\n",
"\n",
" # Binary tools required to run this experiment\n",
" # These tools must be present in the tools/ folder for the architecture\n",
" \"tools\" : ['rt-app', 'taskset', 'trace-cmd'],\n",
" \n",
" # Comment the following line to force rt-app calibration on your target\n",
"# \"rtapp-calib\" : {\n",
"# \"0\": 355, \"1\": 138, \"2\": 138, \"3\": 355, \"4\": 354, \"5\": 354\n",
"# },\n",
" \n",
" # FTrace events end buffer configuration\n",
" \"ftrace\" : {\n",
" \"events\" : [\n",
" \"sched_switch\",\n",
" \"cpu_frequency\"\n",
" ],\n",
" \"buffsize\" : 10240\n",
" },\n",
"\n",
" # Where results are collected\n",
" \"results_dir\" : \"WlgenExample\",\n",
" \n",
" # Devlib modules we'll need\n",
" \"modules\": [\"cpufreq\"]\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:22:12 INFO : Target - Using base path: /home/derkling/Code/lisa\n",
"12:22:12 INFO : Target - Loading custom (inline) target configuration\n",
"12:22:12 INFO : Target - Devlib modules to load: ['bl', 'hwmon', 'cpufreq']\n",
"12:22:12 INFO : Target - Connecting linux target:\n",
"12:22:12 INFO : Target - username : root\n",
"12:22:12 INFO : Target - host : 192.168.0.1\n",
"12:22:12 INFO : Target - password : \n",
"12:22:50 INFO : Target - Initializing target workdir:\n",
"12:22:50 INFO : Target - /root/devlib-target\n",
"12:22:59 INFO : Target - Topology:\n",
"12:22:59 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n",
"12:23:01 INFO : Platform - Loading default EM:\n",
"12:23:01 INFO : Platform - /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n",
"12:23:02 INFO : FTrace - Enabled tracepoints:\n",
"12:23:02 INFO : FTrace - sched_switch\n",
"12:23:02 INFO : FTrace - cpu_frequency\n",
"12:23:02 INFO : EnergyMeter - Scanning for HWMON channels, may take some time...\n",
"12:23:02 INFO : EnergyMeter - Channels selected for energy sampling:\n",
"12:23:02 INFO : EnergyMeter - a57_energy\n",
"12:23:02 INFO : EnergyMeter - a53_energy\n",
"12:23:02 WARNING : Target - Using configuration provided RTApp calibration\n",
"12:23:02 INFO : Target - Using RT-App calibration values:\n",
"12:23:02 INFO : Target - {\"0\": 355, \"1\": 138, \"2\": 138, \"3\": 355, \"4\": 354, \"5\": 354}\n",
"12:23:02 WARNING : TestEnv - Wipe previous contents of the results folder:\n",
"12:23:02 WARNING : TestEnv - /home/derkling/Code/lisa/results/WlgenExample\n",
"12:23:02 INFO : TestEnv - Set results folder to:\n",
"12:23:02 INFO : TestEnv - /home/derkling/Code/lisa/results/WlgenExample\n",
"12:23:02 INFO : TestEnv - Experiment results available also in:\n",
"12:23:02 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n"
]
}
],
"source": [
"# Support to access the remote target\n",
"from env import TestEnv\n",
"\n",
"# Initialize a test environment using:\n",
"# the provided target configuration (my_target_conf)\n",
"# the provided test configuration (my_test_conf)\n",
"te = TestEnv(conf)\n",
"target = te.target"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Workload execution utility"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def execute(te, wload, res_dir):\n",
" \n",
" logging.info('# Create results folder for this execution')\n",
" !mkdir {res_dir}\n",
" \n",
" logging.info('# Setup FTrace')\n",
" te.ftrace.start()\n",
"\n",
" logging.info('## Start energy sampling')\n",
" te.emeter.reset()\n",
"\n",
" logging.info('### Start RTApp execution')\n",
" wload.run(out_dir=res_dir)\n",
"\n",
" logging.info('## Read energy consumption: %s/energy.json', res_dir)\n",
" nrg_report = te.emeter.report(out_dir=res_dir)\n",
"\n",
" logging.info('# Stop FTrace')\n",
" te.ftrace.stop()\n",
"\n",
" trace_file = os.path.join(res_dir, 'trace.dat')\n",
" logging.info('# Save FTrace: %s', trace_file)\n",
" te.ftrace.get_trace(trace_file)\n",
"\n",
" logging.info('# Save platform description: %s/platform.json', res_dir)\n",
" plt, plt_file = te.platform_dump(res_dir)\n",
" \n",
" logging.info('# Report collected data:')\n",
" logging.info(' %s', res_dir)\n",
" !ls -la {res_dir}\n",
" \n",
" return nrg_report, plt, plt_file, trace_file"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Single task RTApp workload"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1) creation"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:38:37 INFO : WlGen - Setup new workload example1\n"
]
}
],
"source": [
"# Support to configure and run RTApp based workloads\n",
"from wlgen import RTA\n",
"\n",
"# Create a new RTApp workload generator using the calibration values\n",
"# reported by the TestEnv module\n",
"rtapp_name = 'example1'\n",
"rtapp = RTA(target, rtapp_name, calibration=te.calibration())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2) configuration"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:38:39 INFO : RTApp - Workload duration defined by longest task\n",
"12:38:39 INFO : RTApp - Default policy: SCHED_OTHER\n",
"12:38:39 INFO : RTApp - ------------------------\n",
"12:38:39 INFO : RTApp - task [task_p20], sched: {'policy': 'OTHER', 'priotity': 130}\n",
"12:38:39 INFO : RTApp - | calibration CPU: 1\n",
"12:38:39 INFO : RTApp - | loops count: 1\n",
"12:38:39 INFO : RTApp - | CPUs affinity: 0\n",
"12:38:39 INFO : RTApp - + phase_000001: duration 5.000000 [s] (50 loops)\n",
"12:38:39 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n",
"12:38:39 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n"
]
}
],
"source": [
"# RTApp configurator for generation of PERIODIC tasks\n",
"from wlgen import Periodic \n",
"\n",
"# Configure this RTApp instance to:\n",
"rtapp.conf(\n",
"\n",
" # 1. generate a \"profile based\" set of tasks\n",
" kind = 'profile',\n",
" \n",
" # 2. define the \"profile\" of each task\n",
" params = {\n",
" \n",
" # 3. PERIODIC task with\n",
" 'task_p20': Periodic (\n",
" period_ms = 100, # period [ms]\n",
" duty_cycle_pct = 20, # duty cycle [%]\n",
" duration_s = 5, # duration [s]\n",
" delay_s = 0, # start after that delay [s]\n",
" sched = { # run as a low-priority SCHED_OTHER task\n",
" 'policy' : 'OTHER',\n",
" 'priotity' : 130,\n",
" },\n",
" cpus = # pinned on first online CPU\n",
" str(target.list_online_cpus()[0])\n",
" # ADD OTHER PARAMETERS\n",
" ).get(),\n",
"\n",
" },\n",
" \n",
");"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:38:42 INFO : Generated RTApp JSON file:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"global\": {\n",
" \"calibration\": 138, \n",
" \"default_policy\": \"SCHED_OTHER\", \n",
" \"duration\": -1, \n",
" \"logdir\": \"/root/devlib-target\"\n",
" }, \n",
" \"tasks\": {\n",
" \"task_p20\": {\n",
" \"cpus\": [\n",
" 0\n",
" ], \n",
" \"loop\": 1, \n",
" \"phases\": {\n",
" \"p000001\": {\n",
" \"loop\": 50, \n",
" \"run\": 20000, \n",
" \"timer\": {\n",
" \"period\": 100000, \n",
" \"ref\": \"task_p20\"\n",
" }\n",
" }\n",
" }, \n",
" \"policy\": \"SCHED_OTHER\", \n",
" \"priotity\": 130\n",
" }\n",
" }\n",
"}\n"
]
}
],
"source": [
"# Inspect the JSON file used to run the application\n",
"with open('./{}_00.json'.format(rtapp_name), 'r') as fh:\n",
" rtapp_json = json.load(fh)\n",
"logging.info('Generated RTApp JSON file:')\n",
"print json.dumps(rtapp_json, indent=4, sort_keys=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3) execution"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:38:45 INFO : # Create results folder for this execution\n",
"12:38:45 INFO : # Setup FTrace\n",
"12:38:49 INFO : ## Start energy sampling\n",
"12:38:51 INFO : ### Start RTApp execution\n",
"12:38:51 INFO : WlGen - Workload execution START:\n",
"12:38:51 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/example1_00.json\n",
"12:38:57 INFO : ## Read energy consumption: /home/derkling/Code/lisa/results/WlgenExample/example1/energy.json\n",
"12:38:57 INFO : EnergyReport - Energy [ a53]: 5.125284\n",
"12:38:57 INFO : EnergyReport - Energy [ a57]: 3.037161\n",
"12:38:57 INFO : # Stop FTrace\n",
"12:38:59 INFO : # Save FTrace: /home/derkling/Code/lisa/results/WlgenExample/example1/trace.dat\n",
"12:39:01 INFO : # Save platform description: /home/derkling/Code/lisa/results/WlgenExample/example1/platform.json\n",
"12:39:01 INFO : # Report collected data:\n",
"12:39:01 INFO : /home/derkling/Code/lisa/results/WlgenExample/example1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 4008\r\n",
"drwxrwxr-x 2 derkling derkling 4096 Mar 2 12:39 .\r\n",
"drwxrwxr-x 3 derkling derkling 4096 Mar 2 12:38 ..\r\n",
"-rw-rw-r-- 1 derkling derkling 52 Mar 2 12:38 energy.json\r\n",
"-rw-r--r-- 1 derkling derkling 644 Mar 2 12:38 example1_00.json\r\n",
"-rw-rw-r-- 1 derkling derkling 235 Mar 2 12:38 output.log\r\n",
"-rw-rw-r-- 1 derkling derkling 1075 Mar 2 12:39 platform.json\r\n",
"-rw-r--r-- 1 derkling derkling 6360 Mar 2 12:38 rt-app-task_p20-0.log\r\n",
"-rw-r--r-- 1 derkling derkling 6360 Mar 2 12:38 rt-app-task_p20-3.log\r\n",
"-rw-r--r-- 1 derkling derkling 4063232 Mar 2 12:39 trace.dat\r\n"
]
}
],
"source": [
"res_dir = os.path.join(te.res_dir, rtapp_name)\n",
"nrg_report, plt, plt_file, trace_file = execute(te, rtapp, res_dir)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4) Check collected data"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:39:07 INFO : Energy: /home/derkling/Code/lisa/results/WlgenExample/example1/energy.json\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"LITTLE\": \"5.125284\", \n",
" \"big\": \"3.037161\"\n",
"}\n"
]
}
],
"source": [
"# Dump the energy measured for the LITTLE and big clusters\n",
"logging.info('Energy: %s', nrg_report.report_file)\n",
"print json.dumps(nrg_report.channels, indent=4, sort_keys=True)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:39:07 INFO : Platform description: /home/derkling/Code/lisa/results/WlgenExample/example1/platform.json\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"clusters\": {\n",
" \"big\": [\n",
" 1, \n",
" 2\n",
" ], \n",
" \"little\": [\n",
" 0, \n",
" 3, \n",
" 4, \n",
" 5\n",
" ]\n",
" }, \n",
" \"cpus_count\": 6, \n",
" \"freqs\": {\n",
" \"big\": [\n",
" 450000, \n",
" 625000, \n",
" 800000, \n",
" 950000, \n",
" 1100000\n",
" ], \n",
" \"little\": [\n",
" 450000, \n",
" 575000, \n",
" 700000, \n",
" 775000, \n",
" 850000\n",
" ]\n",
" }, \n",
" \"nrg_model\": {\n",
" \"big\": {\n",
" \"cluster\": {\n",
" \"nrg_max\": 64\n",
" }, \n",
" \"cpu\": {\n",
" \"cap_max\": 1024, \n",
" \"nrg_max\": 616\n",
" }\n",
" }, \n",
" \"little\": {\n",
" \"cluster\": {\n",
" \"nrg_max\": 57\n",
" }, \n",
" \"cpu\": {\n",
" \"cap_max\": 447, \n",
" \"nrg_max\": 93\n",
" }\n",
" }\n",
" }, \n",
" \"topology\": [\n",
" [\n",
" 0, \n",
" 3, \n",
" 4, \n",
" 5\n",
" ], \n",
" [\n",
" 1, \n",
" 2\n",
" ]\n",
" ]\n",
"}\n"
]
}
],
"source": [
"# Dump the platform descriptor, which could be useful for further analysis\n",
"# of the generated results\n",
"logging.info('Platform description: %s', plt_file)\n",
"print json.dumps(plt, indent=4, sort_keys=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5) trace inspection"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"version = 6\n",
"trace-cmd: No such file or directory\n",
" [vmscan:mm_vmscan_writepage] function sizeof not defined\n",
" unknown op '~'\n",
" Error: expected type 5 but read 0\n",
" Error: expected type 4 but read 0\n",
" unknown op '~'\n",
" Error: expected type 5 but read 0\n",
" Error: expected type 4 but read 0\n",
" unknown op '~'\n",
" Error: expected type 5 but read 0\n",
" Error: expected type 4 but read 0\n",
" unknown op '~'\n",
" Error: expected type 5 but read 0\n",
" Error: expected type 4 but read 0\n",
" [sunrpc:xs_tcp_data_recv] function __builtin_constant_p not defined\n",
" [sunrpc:xprt_transmit] function __builtin_constant_p not defined\n",
" [sunrpc:xprt_lookup_rqst] function __builtin_constant_p not defined\n",
" [sunrpc:xprt_complete_rqst] function __builtin_constant_p not defined\n",
" [sunrpc:svc_send] function __builtin_constant_p not defined\n",
" [sunrpc:svc_recv] function __builtin_constant_p not defined\n",
" [sunrpc:svc_process] function __builtin_constant_p not defined\n",
" [ras:mc_event] function mc_event_error_type not defined\n",
" [libata:ata_qc_complete_internal] function libata_trace_parse_qc_flags not defined\n",
" [libata:ata_qc_complete_failed] function libata_trace_parse_qc_flags not defined\n",
" [libata:ata_qc_complete_done] function libata_trace_parse_qc_flags not defined\n",
" [libata:ata_eh_link_autopsy_qc] function libata_trace_parse_qc_flags not defined\n",
" [libata:ata_eh_link_autopsy] function libata_trace_parse_eh_action not defined\n",
" [kvm:kvm_arm_set_regset] function __print_array not defined\n",
" [kmem:mm_page_pcpu_drain] function sizeof not defined\n",
" [kmem:mm_page_free_batched] function sizeof not defined\n",
" [kmem:mm_page_free] function sizeof not defined\n",
" [kmem:mm_page_alloc_zone_locked] function sizeof not defined\n",
" Error: expected type 4 but read 0\n",
" [kmem:mm_page_alloc_extfrag] function sizeof not defined\n",
" [kmem:mm_page_alloc] function sizeof not defined\n",
" Error: expected type 4 but read 0\n",
" [filemap:mm_filemap_delete_from_page_cache] function sizeof not defined\n",
" [filemap:mm_filemap_add_to_page_cache] function sizeof not defined\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n",
"\n",
"(kernelshark:11002): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkStatusbar'\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_statusbar_push: assertion 'GTK_IS_STATUSBAR (statusbar)' failed\n",
"\n",
"(kernelshark:11002): Gtk-CRITICAL **: IA__gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed\n"
]
}
],
"source": [
"!kernelshark {trace_file} 2>/dev/null"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Workload composition using RTApp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1) creation"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:43:40 INFO : WlGen - Setup new workload example2\n"
]
}
],
"source": [
"# Support to configure and run RTApp based workloads\n",
"from wlgen import RTA\n",
"\n",
"# Create a new RTApp workload generator using the calibration values\n",
"# reported by the TestEnv module\n",
"rtapp_name = 'example2'\n",
"rtapp = RTA(target, rtapp_name, calibration=te.calibration())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2) configuration"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:44:39 INFO : RTApp - Workload duration defined by longest task\n",
"12:44:39 INFO : RTApp - Default policy: SCHED_OTHER\n",
"12:44:39 INFO : RTApp - ------------------------\n",
"12:44:39 INFO : RTApp - task [task_ramp], sched: using default policy\n",
"12:44:39 INFO : RTApp - | calibration CPU: 1\n",
"12:44:39 INFO : RTApp - | loops count: 1\n",
"12:44:39 INFO : RTApp - | CPUs affinity: 1\n",
"12:44:39 INFO : RTApp - + phase_000001: duration 1.000000 [s] (100 loops)\n",
"12:44:39 INFO : RTApp - | period 10000 [us], duty_cycle 10 %\n",
"12:44:39 INFO : RTApp - | run_time 1000 [us], sleep_time 9000 [us]\n",
"12:44:39 INFO : RTApp - + phase_000002: duration 1.000000 [s] (20 loops)\n",
"12:44:39 INFO : RTApp - | period 50000 [us], duty_cycle 10 %\n",
"12:44:39 INFO : RTApp - | run_time 5000 [us], sleep_time 45000 [us]\n",
"12:44:39 INFO : RTApp - + phase_000003: duration 1.000000 [s] (20 loops)\n",
"12:44:39 INFO : RTApp - | period 50000 [us], duty_cycle 30 %\n",
"12:44:39 INFO : RTApp - | run_time 15000 [us], sleep_time 35000 [us]\n",
"12:44:39 INFO : RTApp - + phase_000004: duration 1.000000 [s] (20 loops)\n",
"12:44:39 INFO : RTApp - | period 50000 [us], duty_cycle 50 %\n",
"12:44:39 INFO : RTApp - | run_time 25000 [us], sleep_time 25000 [us]\n",
"12:44:39 INFO : RTApp - + phase_000005: duration 1.000000 [s] (20 loops)\n",
"12:44:39 INFO : RTApp - | period 50000 [us], duty_cycle 70 %\n",
"12:44:39 INFO : RTApp - | run_time 35000 [us], sleep_time 15000 [us]\n",
"12:44:39 INFO : RTApp - + phase_000006: duration 1.000000 [s] (20 loops)\n",
"12:44:39 INFO : RTApp - | period 50000 [us], duty_cycle 90 %\n",
"12:44:39 INFO : RTApp - | run_time 45000 [us], sleep_time 5000 [us]\n",
"12:44:39 INFO : RTApp - + phase_000007: duration 0.100000 [s] (1 loops)\n",
"12:44:39 INFO : RTApp - | period 100000 [us], duty_cycle 90 %\n",
"12:44:39 INFO : RTApp - | run_time 90000 [us], sleep_time 10000 [us]\n"
]
}
],
"source": [
"# RTApp configurator for generation of PERIODIC tasks\n",
"from wlgen import Periodic, Ramp\n",
"\n",
"# Light workload\n",
"light = Periodic(duty_cycle_pct=10, duration_s=1.0, period_ms= 10,\n",
" cpus=str(target.bl.bigs_online[0]))\n",
"# Ramp workload\n",
"ramp = Ramp(start_pct=10, end_pct=90, delta_pct=20, time_s=1, period_ms=50)\n",
"# Heavy workload\n",
"heavy = Periodic(duty_cycle_pct=90, duration_s=0.1, period_ms=100)\n",
"\n",
"# Composed workload\n",
"lrh_task = light + ramp + heavy\n",
"\n",
"# Configure this RTApp instance to:\n",
"rtapp.conf(\n",
"\n",
" # 1. generate a \"profile based\" set of tasks\n",
" kind = 'profile',\n",
" \n",
" # 2. define the \"profile\" of each task\n",
" params = {\n",
" \n",
" # 3. PERIODIC task with\n",
" 'task_ramp': lrh_task.get() \n",
"\n",
" },\n",
" \n",
");"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:45:34 INFO : Generated RTApp JSON file:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"global\": {\n",
" \"calibration\": 138, \n",
" \"default_policy\": \"SCHED_OTHER\", \n",
" \"duration\": -1, \n",
" \"logdir\": \"/root/devlib-target\"\n",
" }, \n",
" \"tasks\": {\n",
" \"task_ramp\": {\n",
" \"cpus\": [\n",
" 1\n",
" ], \n",
" \"loop\": 1, \n",
" \"phases\": {\n",
" \"p000001\": {\n",
" \"loop\": 100, \n",
" \"run\": 1000, \n",
" \"timer\": {\n",
" \"period\": 10000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }, \n",
" \"p000002\": {\n",
" \"loop\": 20, \n",
" \"run\": 5000, \n",
" \"timer\": {\n",
" \"period\": 50000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }, \n",
" \"p000003\": {\n",
" \"loop\": 20, \n",
" \"run\": 15000, \n",
" \"timer\": {\n",
" \"period\": 50000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }, \n",
" \"p000004\": {\n",
" \"loop\": 20, \n",
" \"run\": 25000, \n",
" \"timer\": {\n",
" \"period\": 50000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }, \n",
" \"p000005\": {\n",
" \"loop\": 20, \n",
" \"run\": 35000, \n",
" \"timer\": {\n",
" \"period\": 50000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }, \n",
" \"p000006\": {\n",
" \"loop\": 20, \n",
" \"run\": 45000, \n",
" \"timer\": {\n",
" \"period\": 50000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }, \n",
" \"p000007\": {\n",
" \"loop\": 1, \n",
" \"run\": 90000, \n",
" \"timer\": {\n",
" \"period\": 100000, \n",
" \"ref\": \"task_ramp\"\n",
" }\n",
" }\n",
" }, \n",
" \"policy\": \"SCHED_OTHER\"\n",
" }\n",
" }\n",
"}\n"
]
}
],
"source": [
"# Inspect the JSON file used to run the application\n",
"with open('./{}_00.json'.format(rtapp_name), 'r') as fh:\n",
" rtapp_json = json.load(fh)\n",
"logging.info('Generated RTApp JSON file:')\n",
"print json.dumps(rtapp_json, indent=4, sort_keys=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3) execution"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:48:02 INFO : # Create results folder for this execution\n",
"12:48:02 INFO : # Setup FTrace\n",
"12:48:06 INFO : ## Start energy sampling\n",
"12:48:07 INFO : ### Start RTApp execution\n",
"12:48:07 INFO : WlGen - Workload execution START:\n",
"12:48:07 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/example2_00.json\n",
"12:48:14 INFO : ## Read energy consumption: /home/derkling/Code/lisa/results/WlgenExample/example2/energy.json\n",
"12:48:16 INFO : EnergyReport - Energy [ a53]: 1.495969\n",
"12:48:16 INFO : EnergyReport - Energy [ a57]: 25.145680\n",
"12:48:16 INFO : # Stop FTrace\n",
"12:48:17 INFO : # Save FTrace: /home/derkling/Code/lisa/results/WlgenExample/example2/trace.dat\n",
"12:48:19 INFO : # Save platform description: /home/derkling/Code/lisa/results/WlgenExample/example2/platform.json\n",
"12:48:19 INFO : # Report collected data:\n",
"12:48:19 INFO : /home/derkling/Code/lisa/results/WlgenExample/example2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 4124\r\n",
"drwxrwxr-x 2 derkling derkling 4096 Mar 2 12:48 .\r\n",
"drwxrwxr-x 4 derkling derkling 4096 Mar 2 12:48 ..\r\n",
"-rw-rw-r-- 1 derkling derkling 53 Mar 2 12:48 energy.json\r\n",
"-rw-r--r-- 1 derkling derkling 2121 Mar 2 12:48 example2_00.json\r\n",
"-rw-rw-r-- 1 derkling derkling 235 Mar 2 12:48 output.log\r\n",
"-rw-rw-r-- 1 derkling derkling 1075 Mar 2 12:48 platform.json\r\n",
"-rw-r--r-- 1 derkling derkling 25084 Mar 2 12:48 rt-app-task_ramp-0.log\r\n",
"-rw-r--r-- 1 derkling derkling 4169728 Mar 2 12:48 trace.dat\r\n"
]
}
],
"source": [
"res_dir = os.path.join(te.res_dir, rtapp_name)\n",
"nrg_report, plt, plt_file, trace_file = execute(te, rtapp, res_dir)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4) trace inspection"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"version = 6\r\n"
]
}
],
"source": [
"!kernelshark {trace_file} 2>/dev/null"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Custom RTApp connfiguration"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:55:36 INFO : WlGen - Setup new workload example3\n"
]
}
],
"source": [
"# Support to configure and run RTApp based workloads\n",
"from wlgen import RTA\n",
"\n",
"# Create a new RTApp workload generator using the calibration values\n",
"# reported by the TestEnv module\n",
"rtapp_name = 'example3'\n",
"rtapp = RTA(target, rtapp_name, calibration=te.calibration())\n",
"\n",
"# Configure this RTApp to use a custom JSON\n",
"rtapp.conf(\n",
"\n",
" # 1. generate a \"custom\" set of tasks\n",
" kind = 'custom',\n",
" \n",
" # 2. define the \"profile\" of each task\n",
" params = \"../../assets/mp3-short.json\",\n",
" \n",
" # In this case only few values of the orignal JSON can be tuned:\n",
" # DURATION : maximum duration of the workload [s]\n",
" # PVALUE : calibration value\n",
" # LOGDIR : folder used for generated logs\n",
" # WORKDIR : working directory on target\n",
" \n",
" # 3. defined a maximum duration for that workload\n",
" duration = 5,\n",
" \n",
");"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:55:53 INFO : # Create results folder for this execution\n",
"12:55:53 INFO : # Setup FTrace\n",
"12:55:57 INFO : ## Start energy sampling\n",
"12:55:58 INFO : ### Start RTApp execution\n",
"12:55:58 INFO : WlGen - Workload execution START:\n",
"12:55:58 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/example3_00.json\n",
"12:56:03 INFO : ## Read energy consumption: /home/derkling/Code/lisa/results/WlgenExample/example3/energy.json\n",
"12:56:04 INFO : EnergyReport - Energy [ a53]: 2.481205\n",
"12:56:04 INFO : EnergyReport - Energy [ a57]: 8.981533\n",
"12:56:04 INFO : # Stop FTrace\n",
"12:56:05 INFO : # Save FTrace: /home/derkling/Code/lisa/results/WlgenExample/example3/trace.dat\n",
"12:56:07 INFO : # Save platform description: /home/derkling/Code/lisa/results/WlgenExample/example3/platform.json\n",
"12:56:07 INFO : # Report collected data:\n",
"12:56:07 INFO : /home/derkling/Code/lisa/results/WlgenExample/example3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 5048\r\n",
"drwxrwxr-x 2 derkling derkling 4096 Mar 2 12:56 .\r\n",
"drwxrwxr-x 5 derkling derkling 4096 Mar 2 12:55 ..\r\n",
"-rw-rw-r-- 1 derkling derkling 52 Mar 2 12:56 energy.json\r\n",
"-rw-r--r-- 1 derkling derkling 1324 Mar 2 12:56 example3_00.json\r\n",
"-rw-rw-r-- 1 derkling derkling 807 Mar 2 12:56 output.log\r\n",
"-rw-rw-r-- 1 derkling derkling 1075 Mar 2 12:56 platform.json\r\n",
"-rw-r--r-- 1 derkling derkling 5144576 Mar 2 12:56 trace.dat\r\n"
]
}
],
"source": [
"res_dir = os.path.join(te.res_dir, rtapp_name)\n",
"nrg_report, plt, plt_file, trace_file = execute(te, rtapp, res_dir)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"12:56:21 INFO : Generated RTApp JSON file:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"global\": {\n",
" \"calibration\": 138, \n",
" \"default_policy\": \"SCHED_OTHER\", \n",
" \"duration\": 5, \n",
" \"frag\": 1, \n",
" \"ftrace\": false, \n",
" \"gnuplot\": false, \n",
" \"lock_pages\": true, \n",
" \"log_basename\": \"mp3\", \n",
" \"logdir\": \"/root/devlib-target\"\n",
" }, \n",
" \"tasks\": {\n",
" \"AudioOut\": {\n",
" \"loop\": -1, \n",
" \"priority\": -19, \n",
" \"resume\": \"AudioTrack\", \n",
" \"run\": 4725, \n",
" \"suspend\": \"AudioOut\"\n",
" }, \n",
" \"AudioTick\": {\n",
" \"cpus\": [\n",
" 0\n",
" ], \n",
" \"loop\": -1, \n",
" \"phases\": {\n",
" \"p1\": {\n",
" \"loop\": 1, \n",
" \"resume\": \"AudioOut\", \n",
" \"timer\": {\n",
" \"period\": 6000, \n",
" \"ref\": \"tick\"\n",
" }\n",
" }, \n",
" \"p2\": {\n",
" \"loop\": 4, \n",
" \"timer\": {\n",
" \"period\": 6000, \n",
" \"ref\": \"tick\"\n",
" }\n",
" }\n",
" }, \n",
" \"priority\": -19\n",
" }, \n",
" \"AudioTrack\": {\n",
" \"loop\": -1, \n",
" \"priority\": -16, \n",
" \"resume\": \"mp3.decoder\", \n",
" \"run\": 300, \n",
" \"suspend\": \"AudioTrack\"\n",
" }, \n",
" \"OMXCall\": {\n",
" \"lock\": \"mutex\", \n",
" \"loop\": -1, \n",
" \"priority\": -2, \n",
" \"run\": 300, \n",
" \"signal\": \"queue\", \n",
" \"unlock\": \"mutex\", \n",
" \"wait\": {\n",
" \"mutex\": \"mutex\", \n",
" \"ref\": \"queue\"\n",
" }\n",
" }, \n",
" \"mp3.decoder\": {\n",
" \"lock\": \"mutex\", \n",
" \"loop\": -1, \n",
" \"priority\": -2, \n",
" \"run\": 150, \n",
" \"signal\": \"queue\", \n",
" \"suspend\": \"mp3.decoder\", \n",
" \"unlock\": \"mutex\", \n",
" \"wait\": {\n",
" \"mutex\": \"mutex\", \n",
" \"ref\": \"queue\"\n",
" }\n",
" }\n",
" }\n",
"}\n"
]
}
],
"source": [
"# Inspect the JSON file used to run the application\n",
"with open('./{}_00.json'.format(rtapp_name), 'r') as fh:\n",
" rtapp_json = json.load(fh)\n",
"logging.info('Generated RTApp JSON file:')\n",
"print json.dumps(rtapp_json, indent=4, sort_keys=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Running Hackbench"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1) creation and configuration"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"01:08:28 INFO : WlGen - Setup new workload hackbench\n"
]
},
{
"data": {
"text/plain": [
"'hackbench_00'"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Support to configure and run RTApp based workloads\n",
"from wlgen import PerfMessaging\n",
"\n",
"# Create a \"perf bench sched messages\" (i.e. hackbench) workload\n",
"perf_name = 'hackbench'\n",
"perf = PerfMessaging(target, perf_name)\n",
"\n",
"perf.conf(group=1, loop=100, pipe=True, thread=True)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2) execution"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"01:08:29 INFO : # Create results folder for this execution\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mkdir: cannot create directory /home/derkling/Code/lisa/results/WlgenExample/hackbench: File exists\r\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"01:08:29 INFO : # Setup FTrace\n",
"01:08:31 INFO : ## Start energy sampling\n",
"01:08:31 INFO : ### Start RTApp execution\n",
"01:08:31 INFO : WlGen - Workload execution START:\n",
"01:08:31 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 100\n",
"01:08:32 INFO : PerfBench - Completion time: 0.126000, Performance 7.936508\n",
"01:08:32 INFO : ## Read energy consumption: /home/derkling/Code/lisa/results/WlgenExample/hackbench/energy.json\n",
"01:08:33 INFO : EnergyReport - Energy [ a53]: 1.066525\n",
"01:08:33 INFO : EnergyReport - Energy [ a57]: 2.245705\n",
"01:08:33 INFO : # Stop FTrace\n",
"01:08:34 INFO : # Save FTrace: /home/derkling/Code/lisa/results/WlgenExample/hackbench/trace.dat\n",
"01:08:36 INFO : # Save platform description: /home/derkling/Code/lisa/results/WlgenExample/hackbench/platform.json\n",
"01:08:36 INFO : # Report collected data:\n",
"01:08:36 INFO : /home/derkling/Code/lisa/results/WlgenExample/hackbench\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"total 10396\r\n",
"drwxrwxr-x 2 derkling derkling 4096 Mar 2 13:08 .\r\n",
"drwxrwxr-x 6 derkling derkling 4096 Mar 2 13:08 ..\r\n",
"-rw-rw-r-- 1 derkling derkling 52 Mar 2 13:08 energy.json\r\n",
"-rw-rw-r-- 1 derkling derkling 147 Mar 2 13:08 output.log\r\n",
"-rw-rw-r-- 1 derkling derkling 61 Mar 2 13:08 performance.json\r\n",
"-rw-rw-r-- 1 derkling derkling 1075 Mar 2 13:08 platform.json\r\n",
"-rw-r--r-- 1 derkling derkling 10620928 Mar 2 13:08 trace.dat\r\n"
]
}
],
"source": [
"res_dir = os.path.join(te.res_dir, perf_name)\n",
"nrg_report, plt, plt_file, trace_file = execute(te, perf, res_dir)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3) explore the performance report"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"01:10:40 INFO : Generated performance JSON file:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"ctime\": 0.126, \n",
" \"performance\": 7.936507936507937\n",
"}\n"
]
}
],
"source": [
"# Inspect the generated performance report\n",
"perf_file = os.path.join(te.res_dir, perf_name, 'performance.json')\n",
"with open(perf_file, 'r') as fh:\n",
" perf_json = json.load(fh)\n",
"logging.info('Generated performance JSON file:')\n",
"print json.dumps(perf_json, indent=4, sort_keys=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4) trace inspection "
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"version = 6\r\n"
]
}
],
"source": [
"!kernelshark {trace_file} 2>/dev/null"
]
}
],
"metadata": {
"celltoolbar": "Raw Cell Format",
"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
}