{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial goal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial aims to show how to **configure** a **test environment** using\n", "the **TestEnv module** provided by LISA." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Configure logging" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import logging\n", "from conf import LisaLogging\n", "LisaLogging.setup()" ] }, { "cell_type": "code", "execution_count": 2, "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": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Other python modules required by this notebook\n", "import json\n", "import time\n", "import os" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Test environment setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Do you have custom scripts to deploy and use on target?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[01;34m../../tools\u001b[00m\r\n", "├── \u001b[01;34marm64\u001b[00m\r\n", "│ ├── \u001b[01;32mperf\u001b[00m\r\n", "│ ├── \u001b[01;32mrt-app\u001b[00m\r\n", "│ ├── \u001b[01;32mtaskset\u001b[00m\r\n", "│ └── \u001b[01;32mtrace-cmd\u001b[00m\r\n", "├── \u001b[01;34marmeabi\u001b[00m\r\n", "│ ├── \u001b[01;32mbusybox\u001b[00m\r\n", "│ ├── \u001b[01;32mdaemonize\u001b[00m\r\n", "│ ├── htop\r\n", "│ ├── htop.armv7\r\n", "│ ├── \u001b[01;32mperf\u001b[00m\r\n", "│ ├── \u001b[01;32mrt-app\u001b[00m\r\n", "│ ├── \u001b[01;32msysbench\u001b[00m\r\n", "│ ├── \u001b[01;32mtaskset\u001b[00m\r\n", "│ ├── \u001b[01;31mterminfo.tar.bz2\u001b[00m\r\n", "│ └── \u001b[01;32mtrace-cmd\u001b[00m\r\n", "├── LICENSE.busybox\r\n", "├── LICENSE.perf\r\n", "├── LICENSE.rt-app\r\n", "├── LICENSE.taskset\r\n", "├── LICENSE.trace-cmd\r\n", "├── \u001b[01;32mplots.py\u001b[00m\r\n", "├── \u001b[01;32mreport.py\u001b[00m\r\n", "├── report.pyc\r\n", "├── \u001b[01;34mscripts\u001b[00m\r\n", "│ ├── \u001b[01;32mcgroup_run_into.sh\u001b[00m\r\n", "│ ├── \u001b[01;32mcgroup_tasks_move.sh\u001b[00m\r\n", "│ ├── \u001b[01;32mcpuidle_sampling.sh\u001b[00m\r\n", "│ ├── \u001b[01;32modroid_sampler.py\u001b[00m\r\n", "│ ├── \u001b[01;32modroid_sampler.sh\u001b[00m\r\n", "│ ├── \u001b[01;32mtrace_frequencies.sh\u001b[00m\r\n", "│ └── \u001b[01;32mtraceview_extract.awk\u001b[00m\r\n", "├── \u001b[01;34mx86\u001b[00m\r\n", "│ ├── \u001b[01;32mbusybox\u001b[00m\r\n", "│ └── \u001b[01;32mchrt\u001b[00m\r\n", "└── \u001b[01;34mx86_64\u001b[00m\r\n", " ├── \u001b[01;32mbusybox\u001b[00m\r\n", " ├── \u001b[01;32mchrt\u001b[00m\r\n", " ├── \u001b[01;32mperf\u001b[00m\r\n", " ├── \u001b[01;32mrt-app\u001b[00m\r\n", " ├── \u001b[01;32mtaskset\u001b[00m\r\n", " ├── \u001b[01;32mtrace-cmd\u001b[00m\r\n", " └── \u001b[01;32mwlg\u001b[00m\r\n", "\r\n", "5 directories, 38 files\r\n" ] } ], "source": [ "# Custom scrips must be deployed under $LISA_HOME/tools\n", "!tree ../../tools" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#!/bin/bash\r\n", "\r\n", "# CPU to monitor\r\n", "CPU=${1:-0}\r\n", "# Sampling time\r\n", "SLEEP=${2:-1}\r\n", "# Samples to collect\r\n", "COUNT=${3:-3}\r\n", "\r\n", "# Enter CPU's sysfs\r\n", "cd /sys/devices/system/cpu\r\n", "\r\n", "# Initial C-State residencies counter\r\n", "ISC=$(find cpu0/cpuidle -name \"state*\" | wc -l)\r\n", "for I in $(seq 0 $((ISC-1))); do\r\n", "\tLCS[$I]=`cat cpu$CPU/cpuidle/state$I/usage`\r\n", "done\r\n", "\r\n", "# Dump header\r\n", "printf \"#%13s \" \"Time\"\r\n", "for I in $(seq 0 $((ISC-1))); do\r\n", " printf \"%14s \" \"idle$I\"\r\n", "done\r\n", "echo\r\n", "\r\n", "# Sampling loop\r\n", "for I in $(seq $COUNT); do\r\n", "\r\n", "\tsleep $SLEEP\r\n", "\r\n", "\t# Dump CPU C-State residencies\r\n", "\tnow=$(date +%s)\r\n", "\tprintf \"%14d \" $now\r\n", "\tfor I in $(seq 0 $((ISC-1))); do\r\n", "\t\tU=`cat cpu$CPU/cpuidle/state$I/usage`\r\n", "\t\tCCS=$(($U - ${LCS[$I]}))\r\n", "\t\tprintf \"%14d \" $CCS\r\n", "\t\tLCS[$I]=$U\r\n", "\tdone\r\n", "\techo\r\n", "\r\n", "\r\n", "done\r\n", "\r\n", "# vim: ts=2\r\n" ] } ], "source": [ "# This is the (not so fancy) script we want to deploy\n", "!cat ../../tools/scripts/cpuidle_sampling.sh" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Which devlib modules you need for your experiments?" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:34:06 INFO : Devlib provided modules are found under:\n", "04:34:06 INFO : $LISA_HOME/libs/devlib/devlib/module/\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " thermal.py\r\n", " vexpress.py\r\n", " cooling.py\r\n", " android.py\r\n", " biglittle.py\r\n", " cpuidle.py\r\n", " hotplug.py\r\n", " cpufreq.py\r\n", " hwmon.py\r\n", " cgroups.py\r\n" ] } ], "source": [ "# You can have a look at the devlib supported modules by lising the\n", "devlib_modules_folder = 'libs/devlib/devlib/module/'\n", "\n", "logging.info(\"Devlib provided modules are found under:\")\n", "logging.info(\" $LISA_HOME/{}\".format(devlib_modules_folder))\n", "!cd ../../ ; find {devlib_modules_folder} -name \"*.py\" | sed 's|libs/devlib/devlib/module/| |' | grep -v __init__ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup you TestEnv confguration" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Setup a target configuration\n", "conf = {\n", "\n", " # Define the kind of target platform to use for the experiments\n", " \"platform\" : 'linux', # platform type, valid other options are:\n", " # android - access via ADB\n", " # linux - access via SSH\n", " # host - direct access\n", " \n", " # Preload settings for a specific target\n", " \"board\" : 'juno', # board type, valid options are:\n", " # - juno - JUNO Development Board\n", " # - tc2 - TC2 Development Board\n", "\n", " # Login credentials\n", " \"host\" : \"192.168.0.1\",\n", " \"username\" : \"root\",\n", " \"password\" : \"\",\n", "\n", " # Custom tools to deploy on target, they must be placed under:\n", " # $LISA_HOME/tools/(ARCH|scripts)\n", " \"tools\" : [ \"cpuidle_sampling.sh\" ],\n", "\n", " # FTrace configuration\n", " \"ftrace\" : {\n", " \"events\" : [\n", " \"cpu_idle\",\n", " \"sched_switch\",\n", " ],\n", " \"buffsize\" : 10240,\n", " },\n", " \n", " # Where results are collected\n", " \"results_dir\" : \"TestEnvExample\",\n", " \n", " # Devlib module required (or not required)\n", " 'modules' : [ \"cpufreq\", \"cgroups\" ],\n", " #\"exclude_modules\" : [ \"hwmon\" ],\n", " \n", " # Local installation path used for kernel/dtb installation on target\n", " # The specified path MUST be accessible from the board, e.g.\n", " # - JUNO/TC2: it can be the mount path of the VMESD disk image\n", " # - Other board: it can be a TFTP server path used by the board bootloader\n", " \"tftp\" : {\n", " \"folder\" : \"/var/lib/tftpboot\",\n", " \"kernel\" : \"kern.bin\",\n", " \"dtb\" : \"dtb.bin\",\n", " },\n", "\n", "}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:34:08 INFO : Target - Using base path: /home/derkling/Code/lisa\n", "04:34:08 INFO : Target - Loading custom (inline) target configuration\n", "04:34:08 DEBUG : Target - Target configuration {'username': 'root', 'platform': 'linux', 'host': '192.168.0.1', 'ftrace': {'buffsize': 10240, 'events': ['cpu_idle', 'sched_switch']}, 'board': 'juno', 'modules': ['cpufreq', 'cgroups'], 'tftp': {'kernel': 'kern.bin', 'folder': '/var/lib/tftpboot', 'dtb': 'dtb.bin'}, 'password': '', 'tools': ['cpuidle_sampling.sh'], 'results_dir': 'TestEnvExample'}\n", "04:34:08 INFO : Target - Devlib modules to load: ['bl', 'cpufreq', 'cgroups', 'hwmon']\n", "04:34:08 INFO : Target - Connecting linux target:\n", "04:34:08 INFO : Target - username : root\n", "04:34:08 INFO : Target - host : 192.168.0.1\n", "04:34:08 INFO : Target - password : \n", "04:34:08 DEBUG : Target - Setup LINUX target...\n", "04:34:08 DEBUG : Installing module vexpress-u-boot\n", "04:34:08 DEBUG : Installing module vexpress-dtr\n", "04:34:08 DEBUG : Installing module vexpress-vemsd\n", "04:34:08 DEBUG : Logging in root@192.168.0.1\n", "04:34:09 DEBUG : id\n", "04:34:09 DEBUG : if [ -e '/root/devlib-target/bin' ]; then echo 1; else echo 0; fi\n", "04:34:10 DEBUG : ls -1 /root/devlib-target/bin\n", "04:34:10 DEBUG : cat /proc/cpuinfo\n", "04:34:10 DEBUG : sudo -- sh -c 'dmidecode -s system-version'\n", "04:34:11 DEBUG : Installing module bl\n", "04:34:11 DEBUG : /root/devlib-target/bin/busybox uname -m\n", "04:34:11 DEBUG : if [ -e '/sys/devices/system/cpu/cpufreq' ]; then echo 1; else echo 0; fi\n", "04:34:12 DEBUG : Installing module cpufreq\n", "04:34:12 DEBUG : zcat /proc/config.gz\n", "04:34:12 DEBUG : Installing module cgroups\n", "04:34:12 DEBUG : mount\n", "04:34:12 DEBUG : cgroup_root already mounted at /sys/fs/cgroup\n", "04:34:13 DEBUG : /root/devlib-target/bin/busybox cat /proc/cgroups\n", "04:34:13 DEBUG : Available controllers: ['cpuset', 'cpu', 'schedtune', 'memory', 'devices', 'freezer', 'perf_event', 'hugetlb', 'pids']\n", "04:34:13 DEBUG : Init cpuset controller...\n", "04:34:13 DEBUG : /root/devlib-target/bin/busybox grep cpuset /proc/cgroups\n", "04:34:13 DEBUG : mount\n", "04:34:14 DEBUG : Controller cpuset mounted under: /sys/fs/cgroup/devlib_cpuset\n", "04:34:14 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_cpuset\n", "04:34:14 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_cpuset ] || mkdir -p /sys/fs/cgroup/devlib_cpuset'\n", "04:34:14 DEBUG : Controller cpuset enabled\n", "04:34:14 DEBUG : Init cpu controller...\n", "04:34:14 DEBUG : /root/devlib-target/bin/busybox grep cpu /proc/cgroups\n", "04:34:15 DEBUG : mount\n", "04:34:15 DEBUG : Controller cpu mounted under: /sys/fs/cgroup/devlib_cpu\n", "04:34:15 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_cpu\n", "04:34:15 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_cpu ] || mkdir -p /sys/fs/cgroup/devlib_cpu'\n", "04:34:15 DEBUG : Controller cpu enabled\n", "04:34:15 DEBUG : Init schedtune controller...\n", "04:34:15 DEBUG : /root/devlib-target/bin/busybox grep schedtune /proc/cgroups\n", "04:34:16 DEBUG : mount\n", "04:34:16 DEBUG : Controller schedtune mounted under: /sys/fs/cgroup/devlib_schedtune\n", "04:34:16 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_schedtune\n", "04:34:16 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_schedtune ] || mkdir -p /sys/fs/cgroup/devlib_schedtune'\n", "04:34:17 DEBUG : Controller schedtune enabled\n", "04:34:17 DEBUG : Init memory controller...\n", "04:34:17 DEBUG : /root/devlib-target/bin/busybox grep memory /proc/cgroups\n", "04:34:17 DEBUG : mount\n", "04:34:17 DEBUG : Controller memory mounted under: /sys/fs/cgroup/devlib_memory\n", "04:34:17 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_memory\n", "04:34:18 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_memory ] || mkdir -p /sys/fs/cgroup/devlib_memory'\n", "04:34:18 DEBUG : Controller memory enabled\n", "04:34:18 DEBUG : Init devices controller...\n", "04:34:18 DEBUG : /root/devlib-target/bin/busybox grep devices /proc/cgroups\n", "04:34:18 DEBUG : mount\n", "04:34:19 DEBUG : Controller devices mounted under: /sys/fs/cgroup/devlib_devices\n", "04:34:19 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_devices\n", "04:34:19 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_devices ] || mkdir -p /sys/fs/cgroup/devlib_devices'\n", "04:34:19 DEBUG : Controller devices enabled\n", "04:34:19 DEBUG : Init freezer controller...\n", "04:34:19 DEBUG : /root/devlib-target/bin/busybox grep freezer /proc/cgroups\n", "04:34:20 DEBUG : mount\n", "04:34:20 DEBUG : Controller freezer mounted under: /sys/fs/cgroup/devlib_freezer\n", "04:34:20 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_freezer\n", "04:34:20 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_freezer ] || mkdir -p /sys/fs/cgroup/devlib_freezer'\n", "04:34:20 DEBUG : Controller freezer enabled\n", "04:34:20 DEBUG : Init perf_event controller...\n", "04:34:20 DEBUG : /root/devlib-target/bin/busybox grep perf_event /proc/cgroups\n", "04:34:21 DEBUG : mount\n", "04:34:21 DEBUG : Controller perf_event mounted under: /sys/fs/cgroup/devlib_perf_event\n", "04:34:21 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_perf_event\n", "04:34:21 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_perf_event ] || mkdir -p /sys/fs/cgroup/devlib_perf_event'\n", "04:34:22 DEBUG : Controller perf_event enabled\n", "04:34:22 DEBUG : Init hugetlb controller...\n", "04:34:22 DEBUG : /root/devlib-target/bin/busybox grep hugetlb /proc/cgroups\n", "04:34:22 DEBUG : mount\n", "04:34:22 DEBUG : Controller hugetlb mounted under: /sys/fs/cgroup/devlib_hugetlb\n", "04:34:22 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_hugetlb\n", "04:34:22 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_hugetlb ] || mkdir -p /sys/fs/cgroup/devlib_hugetlb'\n", "04:34:23 DEBUG : Controller hugetlb enabled\n", "04:34:23 DEBUG : Init pids controller...\n", "04:34:23 DEBUG : /root/devlib-target/bin/busybox grep pids /proc/cgroups\n", "04:34:23 DEBUG : mount\n", "04:34:24 DEBUG : Controller pids mounted under: /sys/fs/cgroup/devlib_pids\n", "04:34:24 DEBUG : Creating cgroup /sys/fs/cgroup/devlib_pids\n", "04:34:24 DEBUG : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_pids ] || mkdir -p /sys/fs/cgroup/devlib_pids'\n", "04:34:24 DEBUG : Controller pids enabled\n", "04:34:24 DEBUG : if [ -e '/sys/class/hwmon' ]; then echo 1; else echo 0; fi\n", "04:34:24 DEBUG : Installing module hwmon\n", "04:34:25 DEBUG : ls -1 /sys/class/hwmon\n", "04:34:25 DEBUG : if [ -e '/sys/class/hwmon/hwmon0/name' ]; then echo 1; else echo 0; fi\n", "04:34:25 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/name'\\'''\n", "04:34:26 DEBUG : ls -1 /sys/class/hwmon/hwmon0/\n", "04:34:26 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr1_label'\\'''\n", "04:34:27 DEBUG : if [ -e '/sys/class/hwmon/hwmon1/name' ]; then echo 1; else echo 0; fi\n", "04:34:27 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon1/name'\\'''\n", "04:34:27 DEBUG : ls -1 /sys/class/hwmon/hwmon1/\n", "04:34:28 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon1/curr1_label'\\'''\n", "04:34:28 DEBUG : if [ -e '/sys/class/hwmon/hwmon10/name' ]; then echo 1; else echo 0; fi\n", "04:34:29 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon10/name'\\'''\n", "04:34:29 DEBUG : ls -1 /sys/class/hwmon/hwmon10/\n", "04:34:29 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon10/power1_label'\\'''\n", "04:34:30 DEBUG : if [ -e '/sys/class/hwmon/hwmon11/name' ]; then echo 1; else echo 0; fi\n", "04:34:30 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon11/name'\\'''\n", "04:34:31 DEBUG : ls -1 /sys/class/hwmon/hwmon11/\n", "04:34:31 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon11/power1_label'\\'''\n", "04:34:32 DEBUG : if [ -e '/sys/class/hwmon/hwmon12/name' ]; then echo 1; else echo 0; fi\n", "04:34:32 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon12/name'\\'''\n", "04:34:32 DEBUG : ls -1 /sys/class/hwmon/hwmon12/\n", "04:34:33 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon12/energy1_label'\\'''\n", "04:34:33 DEBUG : if [ -e '/sys/class/hwmon/hwmon13/name' ]; then echo 1; else echo 0; fi\n", "04:34:34 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/name'\\'''\n", "04:34:34 DEBUG : ls -1 /sys/class/hwmon/hwmon13/\n", "04:34:34 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_label'\\'''\n", "04:34:35 DEBUG : if [ -e '/sys/class/hwmon/hwmon14/name' ]; then echo 1; else echo 0; fi\n", "04:34:35 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/name'\\'''\n", "04:34:36 DEBUG : ls -1 /sys/class/hwmon/hwmon14/\n", "04:34:36 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_label'\\'''\n", "04:34:37 DEBUG : if [ -e '/sys/class/hwmon/hwmon15/name' ]; then echo 1; else echo 0; fi\n", "04:34:37 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon15/name'\\'''\n", "04:34:37 DEBUG : ls -1 /sys/class/hwmon/hwmon15/\n", "04:34:38 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon15/energy1_label'\\'''\n", "04:34:38 DEBUG : if [ -e '/sys/class/hwmon/hwmon16/name' ]; then echo 1; else echo 0; fi\n", "04:34:39 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/name'\\'''\n", "04:34:39 DEBUG : ls -1 /sys/class/hwmon/hwmon16/\n", "04:34:39 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in0_label'\\'''\n", "04:34:40 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in1_label'\\'''\n", "04:34:40 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in2_label'\\'''\n", "04:34:41 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in3_label'\\'''\n", "04:34:41 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in4_label'\\'''\n", "04:34:42 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in5_label'\\'''\n", "04:34:42 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in6_label'\\'''\n", "04:34:42 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/temp1_label'\\'''\n", "04:34:43 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/temp2_label'\\'''\n", "04:34:43 DEBUG : if [ -e '/sys/class/hwmon/hwmon2/name' ]; then echo 1; else echo 0; fi\n", "04:34:44 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon2/name'\\'''\n", "04:34:44 DEBUG : ls -1 /sys/class/hwmon/hwmon2/\n", "04:34:44 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon2/curr1_label'\\'''\n", "04:34:45 DEBUG : if [ -e '/sys/class/hwmon/hwmon3/name' ]; then echo 1; else echo 0; fi\n", "04:34:45 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon3/name'\\'''\n", "04:34:46 DEBUG : ls -1 /sys/class/hwmon/hwmon3/\n", "04:34:46 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon3/curr1_label'\\'''\n", "04:34:47 DEBUG : if [ -e '/sys/class/hwmon/hwmon4/name' ]; then echo 1; else echo 0; fi\n", "04:34:47 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon4/name'\\'''\n", "04:34:47 DEBUG : ls -1 /sys/class/hwmon/hwmon4/\n", "04:34:48 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon4/in1_label'\\'''\n", "04:34:48 DEBUG : if [ -e '/sys/class/hwmon/hwmon5/name' ]; then echo 1; else echo 0; fi\n", "04:34:49 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon5/name'\\'''\n", "04:34:49 DEBUG : ls -1 /sys/class/hwmon/hwmon5/\n", "04:34:49 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon5/in1_label'\\'''\n", "04:34:50 DEBUG : if [ -e '/sys/class/hwmon/hwmon6/name' ]; then echo 1; else echo 0; fi\n", "04:34:50 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon6/name'\\'''\n", "04:34:51 DEBUG : ls -1 /sys/class/hwmon/hwmon6/\n", "04:34:51 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon6/in1_label'\\'''\n", "04:34:52 DEBUG : if [ -e '/sys/class/hwmon/hwmon7/name' ]; then echo 1; else echo 0; fi\n", "04:34:52 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon7/name'\\'''\n", "04:34:52 DEBUG : ls -1 /sys/class/hwmon/hwmon7/\n", "04:34:53 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon7/in1_label'\\'''\n", "04:34:53 DEBUG : if [ -e '/sys/class/hwmon/hwmon8/name' ]; then echo 1; else echo 0; fi\n", "04:34:54 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon8/name'\\'''\n", "04:34:54 DEBUG : ls -1 /sys/class/hwmon/hwmon8/\n", "04:34:54 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon8/power1_label'\\'''\n", "04:34:55 DEBUG : if [ -e '/sys/class/hwmon/hwmon9/name' ]; then echo 1; else echo 0; fi\n", "04:34:55 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon9/name'\\'''\n", "04:34:56 DEBUG : ls -1 /sys/class/hwmon/hwmon9/\n", "04:34:56 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon9/power1_label'\\'''\n", "04:34:56 DEBUG : Target - Checking target connection...\n", "04:34:56 DEBUG : Target - Target info:\n", "04:34:56 DEBUG : Target - ABI: arm64\n", "04:34:56 DEBUG : Target - CPUs: CpuInfo(['A53', 'A57', 'A57', 'A53', 'A53', 'A53'])\n", "04:34:56 DEBUG : Target - Clusters: [0, 1, 1, 0, 0, 0]\n", "04:34:57 DEBUG : sudo -- sh -c 'mount -o remount,rw /'\n", "04:34:57 INFO : Target - Initializing target workdir:\n", "04:34:57 INFO : Target - /root/devlib-target\n", "04:34:57 DEBUG : mkdir -p /root/devlib-target\n", "04:34:57 DEBUG : mkdir -p /root/devlib-target/bin\n", "04:34:58 DEBUG : /usr/bin/scp -r /home/derkling/Code/lisa/libs/devlib/devlib/bin/arm64/busybox root@192.168.0.1:/root/devlib-target/bin/busybox\n", "04:34:58 DEBUG : chmod a+x /root/devlib-target/bin/busybox\n", "04:34:58 DEBUG : /usr/bin/scp -r /home/derkling/Code/lisa/libs/devlib/devlib/bin/scripts/shutils root@192.168.0.1:/root/devlib-target/bin/shutils\n", "04:34:58 DEBUG : chmod a+x /root/devlib-target/bin/shutils\n", "04:34:59 DEBUG : /usr/bin/scp -r /home/derkling/Code/lisa/tools/scripts/cpuidle_sampling.sh root@192.168.0.1:/root/devlib-target/bin/cpuidle_sampling.sh\n", "04:34:59 DEBUG : chmod a+x /root/devlib-target/bin/cpuidle_sampling.sh\n", "04:34:59 DEBUG : /usr/bin/scp -r /home/derkling/Code/lisa/tools/arm64/trace-cmd root@192.168.0.1:/root/devlib-target/bin/trace-cmd\n", "04:34:59 DEBUG : chmod a+x /root/devlib-target/bin/trace-cmd\n", "04:35:00 DEBUG : Target - Check for module [bl]...\n", "04:35:00 DEBUG : Target - Check for module [cpufreq]...\n", "04:35:00 DEBUG : Target - Check for module [cgroups]...\n", "04:35:00 DEBUG : Target - Check for module [hwmon]...\n", "04:35:00 INFO : Target - Topology:\n", "04:35:00 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", "04:35:00 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", "04:35:00 DEBUG : cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies\n", "04:35:01 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", "04:35:01 DEBUG : cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_available_frequencies\n", "04:35:01 DEBUG : Platform - Trying to load default EM from /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n", "04:35:01 INFO : Platform - Loading default EM:\n", "04:35:01 INFO : Platform - /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n", "04:35:01 DEBUG : loading JSON...\n", "04:35:01 DEBUG : Loaded JSON configuration:\n", "{u'nrg_model': {u'big': {u'cluster': {u'nrg_max': 64}, u'cpu': {u'cap_max': 1024, u'nrg_max': 616}}, u'little': {u'cluster': {u'nrg_max': 57}, u'cpu': {u'cap_max': 447, u'nrg_max': 93}}}}\n", "04:35:01 DEBUG : Platform - Platform descriptor initialized\n", "{'nrg_model': {u'big': {u'cluster': {u'nrg_max': 64}, u'cpu': {u'cap_max': 1024, u'nrg_max': 616}}, u'little': {u'cluster': {u'nrg_max': 57}, u'cpu': {u'cap_max': 447, u'nrg_max': 93}}}, 'clusters': {'big': [1, 2], 'little': [0, 3, 4, 5]}, 'cpus_count': 6, 'freqs': {'big': [450000, 625000, 800000, 950000, 1100000], 'little': [450000, 575000, 700000, 775000, 850000]}, 'topology': [[0, 3, 4, 5], [1, 2]]}\n", "04:35:01 DEBUG : /usr/bin/scp -r /home/derkling/Code/lisa/libs/devlib/devlib/bin/arm64/trace-cmd root@192.168.0.1:/root/devlib-target/bin/trace-cmd\n", "04:35:02 DEBUG : chmod a+x /root/devlib-target/bin/trace-cmd\n", "04:35:02 DEBUG : cat /sys/kernel/debug/tracing/available_events\n", "04:35:02 INFO : FTrace - Enabled tracepoints:\n", "04:35:02 INFO : FTrace - cpu_idle\n", "04:35:02 INFO : FTrace - sched_switch\n", "04:35:02 DEBUG : EnergyMeter - using default energy meter for [juno]\n", "04:35:02 INFO : EnergyMeter - Scanning for HWMON channels, may take some time...\n", "04:35:02 DEBUG : Discovering available HWMON sensors...\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_amp/curr1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_amp/curr1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_power/power1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_power/power1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_energy/energy1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_energy/energy1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_energy/energy1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_energy/energy1\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/temp1\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/temp2\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in0\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in1\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in2\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in3\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in4\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in5\n", "04:35:02 DEBUG : \tAdding sensor scpi_sensors/in6\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_amp/curr1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_amp/curr1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_volt/in1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_volt/in1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_volt/in1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_volt/in1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_power/power1\n", "04:35:02 DEBUG : \tAdding sensor v2m_juno_power/power1\n", "04:35:02 DEBUG : EnergyMeter - Enabling channels {'kinds': ['energy'], 'sites': ['a53', 'a57']}\n", "04:35:02 INFO : EnergyMeter - Channels selected for energy sampling:\n", "04:35:02 INFO : EnergyMeter - a57_energy\n", "04:35:03 INFO : EnergyMeter - a53_energy\n", "04:35:03 DEBUG : No RT-App workloads, skipping calibration\n", "04:35:03 WARNING : TestEnv - Wipe previous contents of the results folder:\n", "04:35:03 WARNING : TestEnv - /home/derkling/Code/lisa/results/TestEnvExample\n", "04:35:03 INFO : TestEnv - Set results folder to:\n", "04:35:03 INFO : TestEnv - /home/derkling/Code/lisa/results/TestEnvExample\n", "04:35:03 INFO : TestEnv - Experiment results available also in:\n", "04:35:03 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n" ] } ], "source": [ "from env import TestEnv\n", "\n", "# Initialize a test environment using the provided configuration\n", "te = TestEnv(conf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Attributes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The initialization of the test environment pre-initialize some useful<br>\n", "environment variables which are available to write test cases.\n", "\n", "These are some of the information available via the TestEnv object." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{\n", " \"username\": \"root\", \n", " \"ftrace\": {\n", " \"buffsize\": 10240, \n", " \"events\": [\n", " \"cpu_idle\", \n", " \"sched_switch\"\n", " ]\n", " }, \n", " \"host\": \"192.168.0.1\", \n", " \"password\": \"\", \n", " \"tools\": [\n", " \"cpuidle_sampling.sh\", \n", " \"trace-cmd\"\n", " ], \n", " \"modules\": [\n", " \"cpufreq\", \n", " \"cgroups\"\n", " ], \n", " \"results_dir\": \"TestEnvExample\", \n", " \"platform\": \"linux\", \n", " \"board\": \"juno\", \n", " \"__features__\": [], \n", " \"tftp\": {\n", " \"kernel\": \"kern.bin\", \n", " \"folder\": \"/var/lib/tftpboot\", \n", " \"dtb\": \"dtb.bin\"\n", " }\n", "}\n" ] } ], "source": [ "# The complete configuration of the target we have configured\n", "print json.dumps(te.conf, indent=4)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "None\n" ] } ], "source": [ "# Last configured kernel and DTB image\n", "print te.kernel\n", "print te.dtb" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "192.168.0.1\n", "None\n" ] } ], "source": [ "# The IP and MAC address of the target\n", "print te.ip\n", "print te.mac" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{\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", " \"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", " \"topology\": [\n", " [\n", " 0, \n", " 3, \n", " 4, \n", " 5\n", " ], \n", " [\n", " 1, \n", " 2\n", " ]\n", " ]\n", "}\n" ] } ], "source": [ "# A full platform descriptor\n", "print json.dumps(te.platform, indent=4)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'/home/derkling/Code/lisa/results/TestEnvExample'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A pre-created folder to host the tests results generated using this\n", "# test environment, notice that the suite could add additional information\n", "# in this folder, like for example a copy of the target configuration\n", "# and other target specific collected information\n", "te.res_dir" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'/data/local/schedtest'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The working directory on the target\n", "te.workdir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some methods are also exposed to test developers which could be used to easy\n", "the creation of tests.\n", "\n", "These are some of the methods available:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:27:32 DEBUG : No RT-App workloads, skipping calibration\n" ] } ], "source": [ "# Calibrate RT-App (if required) and get the most updated calibration value\n", "te.calibration()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:27:32 DEBUG : Platform - Dump platform descriptor in [/tmp/platform.json]\n" ] }, { "data": { "text/plain": [ "({'clusters': {'big': [1, 2], 'little': [0, 3, 4, 5]},\n", " 'cpus_count': 6,\n", " 'freqs': {'big': [450000, 625000, 800000, 950000, 1100000],\n", " 'little': [450000, 575000, 700000, 775000, 850000]},\n", " 'nrg_model': {u'big': {u'cluster': {u'nrg_max': 64},\n", " u'cpu': {u'cap_max': 1024, u'nrg_max': 616}},\n", " u'little': {u'cluster': {u'nrg_max': 57},\n", " u'cpu': {u'cap_max': 447, u'nrg_max': 93}}},\n", " 'topology': [[0, 3, 4, 5], [1, 2]]},\n", " '/tmp/platform.json')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Generate a JSON file with the complete platform description\n", "te.platform_dump(dest_dir='/tmp')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "# Force a reboot of the target (and wait specified [s] before reconnect)\n", "# te.reboot(reboot_time=60, ping_time=15)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Resolve a MAC address into an IP address\n", "# te.resolv_host(host='00:02:F7:00:5A:5B')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:27:33 INFO : TFTP - Deploy /etc/group into /var/lib/tftpboot/group\n" ] } ], "source": [ "# Copy the specified file into the TFTP server folder defined by configuration\n", "te.tftp_deploy('/etc/group')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total 12\r\n", "drwxrwxrwx 2 root nogroup 4096 Feb 22 17:34 .\r\n", "drwxr-xr-x 79 root root 4096 Feb 26 15:17 ..\r\n", "-rw-r--r-- 1 derkling derkling 1168 Mar 2 16:27 group\r\n" ] } ], "source": [ "!ls -la /var/lib/tftpboot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Access to the devlib API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A special TestEnv attribute is <b>target</b>, which represents a <b>devlib instance</b>.\n", "Using the target attribute we can access to the full set of devlib provided\n", "functionalities. Which are summarized in the following sections." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Remotes commands execution" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:27:34 DEBUG : echo -n 'Hello Test Environment'\n" ] }, { "data": { "text/plain": [ "'Hello Test Environment'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Run a command on the target\n", "te.target.execute(\"echo -n 'Hello Test Environment'\", as_root=False)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:27:34 INFO : Spawn a task which will run for a while...\n", "04:27:35 DEBUG : sudo -- sh -c 'sh -c \"sleep 10\" 1>/dev/null 2>/dev/null &'\n" ] } ], "source": [ "# Spawn a command in background on the target\n", "logging.info(\"Spawn a task which will run for a while...\")\n", "process = te.target.kick_off(\"sleep 10\", as_root=True)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:27:35 DEBUG : ps\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " PID TTY TIME CMD\n", " 6097 pts/0 00:00:00 sh\n", " 6270 pts/0 00:00:00 sleep\n", " 6271 pts/0 00:00:00 ps\n" ] } ], "source": [ "output = te.target.execute(\"ps\")\n", "print '\\n'.join(output.splitlines())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that _the Shell PID is always the same_ for all commands we execute.<br>\n", "This is due to devlib ensuring to keep a **persistent connection** with the target device." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running custom scripts" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:28:18 DEBUG : if [ -e '/root/devlib-target/bin' ]; then echo 1; else echo 0; fi\n", "04:28:18 DEBUG : ls -1 /root/devlib-target/bin\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "/root/devlib-target/bin/cpuidle_sampling.sh\n" ] } ], "source": [ "my_script = te.target.get_installed(\"cpuidle_sampling.sh\")\n", "print my_script" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:28:19 DEBUG : sudo -- sh -c '/root/devlib-target/bin/cpuidle_sampling.sh'\n" ] }, { "data": { "text/plain": [ "['# Time idle0 idle1 idle2 ',\n", " ' 1456934283 0 11 19 ',\n", " ' 1456934284 0 5 17 ',\n", " ' 1456934285 0 5 19 ']" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output = te.target.execute(my_script, as_root=True)\n", "output.splitlines()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the output is returned as a **list of lines**. This provides a useful base for post-processing the output of that command." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "code_folding": [], "collapsed": false }, "outputs": [], "source": [ "# We can also use \"notebook embedded\" scripts\n", "# my_script = \" \\\n", "# for I in $(seq 3); do \\\n", "# grep '' /sys/devices/system/cpu/cpu*/cpufreq/stats/time_in_stats | \\\n", "# sed -e 's|/sys/devices/system/cpu/cpu||' -e 's|/cpufreq/scaling_governor:| |' \\\n", "# sleep 1 \\\n", "# done \\\n", "# \"" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# print te.target.execute(my_script)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Access to target specific attributes" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ABI : arm64\n", "big Core Family : A57\n", "LITTLE Core Family : A53\n", "CPU's Clusters IDs : [0, 1, 1, 0, 0, 0]\n", "CPUs type : ['A53', 'A57', 'A57', 'A53', 'A53', 'A53']\n" ] } ], "source": [ "# Acces to many target specific information\n", "print \"ABI : \", te.target.abi\n", "print \"big Core Family : \", te.target.big_core\n", "print \"LITTLE Core Family : \", te.target.little_core\n", "print \"CPU's Clusters IDs : \", te.target.core_clusters\n", "print \"CPUs type : \", te.target.core_names" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:35:03 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", "04:35:03 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq'\\'''\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "big CPUs IDs : [1, 2]\n", "LITTLE CPUs IDs : [0, 3, 4, 5]\n", "big CPUs freqs : 1100000" ] }, { "name": "stderr", "output_type": "stream", "text": [ "04:35:04 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", "04:35:04 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor'\\'''\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "big CPUs governor : performance\n" ] } ], "source": [ "# Access to big.LITTLE specific information\n", "print \"big CPUs IDs : \", te.target.bl.bigs\n", "print \"LITTLE CPUs IDs : \", te.target.bl.littles\n", "print \"big CPUs freqs : {}\".format(te.target.bl.get_bigs_frequency())\n", "print \"big CPUs governor : {}\".format(te.target.bl.get_bigs_governor())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modules usage example: CPUFreq" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:36:33 DEBUG : sudo -- sh -c '/root/devlib-target/bin/shutils cpufreq_get_all_governors'\n" ] }, { "data": { "text/plain": [ "{'0': 'performance',\n", " '1': 'performance',\n", " '2': 'performance',\n", " '3': 'performance',\n", " '4': 'performance',\n", " '5': 'performance'}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# You can use autocompletion to have a look at the supported method for a\n", "# specific module\n", "te.target.cpufreq #.get_all_governors()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:39:00 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors'\\'''\n" ] }, { "data": { "text/plain": [ "['conservative', 'ondemand', 'userspace', 'powersave', 'performance', 'sched']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get goverors available for CPU0\n", "te.target.cpufreq.list_governors(0)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:40:04 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors'\\'''\n", "04:40:04 DEBUG : sudo -- sh -c 'echo ondemand > '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:40:05 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:40:05 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:40:06 DEBUG : ls -1 /sys/devices/system/cpu/cpu0/cpufreq/ondemand\n" ] } ], "source": [ "# Set the \"ondemand\" governor\n", "te.target.cpufreq.set_governor(0, 'ondemand')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:40:29 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:40:29 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:40:30 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_load'\\'''\n", "04:40:30 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/io_is_busy'\\'''\n", "04:40:31 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/powersave_bias'\\'''\n", "04:40:31 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_down_factor'\\'''\n", "04:40:31 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n", "04:40:32 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min'\\'''\n", "04:40:32 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold'\\'''\n" ] }, { "data": { "text/plain": [ "{'ignore_nice_load': '0',\n", " 'io_is_busy': '0',\n", " 'powersave_bias': '0',\n", " 'sampling_down_factor': '1',\n", " 'sampling_rate': '1200000',\n", " 'sampling_rate_min': '24000',\n", " 'up_threshold': '95'}" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check governor tunables\n", "te.target.cpufreq.get_governor_tunables(0)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:41:46 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:41:46 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:41:47 DEBUG : sudo -- sh -c 'echo 2000000 > '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n", "04:41:47 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n", "04:41:47 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:41:48 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n", "04:41:48 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_load'\\'''\n", "04:41:49 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/io_is_busy'\\'''\n", "04:41:49 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/powersave_bias'\\'''\n", "04:41:49 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_down_factor'\\'''\n", "04:41:50 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n", "04:41:50 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min'\\'''\n", "04:41:51 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold'\\'''\n" ] }, { "data": { "text/plain": [ "{'ignore_nice_load': '0',\n", " 'io_is_busy': '0',\n", " 'powersave_bias': '0',\n", " 'sampling_down_factor': '1',\n", " 'sampling_rate': '2000000',\n", " 'sampling_rate_min': '24000',\n", " 'up_threshold': '95'}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Update governor tunables\n", "te.target.cpufreq.set_governor_tunables(0, sampling_rate=2000000)\n", "te.target.cpufreq.get_governor_tunables(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modules usage example: CGroups" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:51:18 INFO : CGroup - Available controllers:\n", "04:51:18 DEBUG : /root/devlib-target/bin/busybox cat /proc/cgroups\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cpuset (hierarchy id: 1) has 2 cgroups\n", "cpu (hierarchy id: 2) has 1 cgroups\n", "schedtune (hierarchy id: 3) has 1 cgroups\n", "memory (hierarchy id: 4) has 1 cgroups\n", "devices (hierarchy id: 5) has 1 cgroups\n", "freezer (hierarchy id: 6) has 1 cgroups\n", "perf_event (hierarchy id: 7) has 1 cgroups\n", "hugetlb (hierarchy id: 8) has 1 cgroups\n", "pids (hierarchy id: 9) has 1 cgroups\n" ] } ], "source": [ "logging.info('%14s - Available controllers:', 'CGroup')\n", "ssys = target.cgroups.list_subsystems()\n", "for (n,h,g,e) in ssys:\n", " print '{:10} (hierarchy id: {:d}) has {} cgroups'.format(n, h, g)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Get a reference to the CPUSet controller\n", "cpuset = target.cgroups.controller('cpuset')" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:51:42 DEBUG : Listing groups for cpuset controller\n", "04:51:43 DEBUG : /root/devlib-target/bin/busybox find /sys/fs/cgroup/devlib_cpuset -type d\n", "04:51:43 DEBUG : Populate cpuset cgroup: /\n", "04:51:43 DEBUG : Populate cpuset cgroup: /LITTLE\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Existing CGropups:\n", " /\n", " /LITTLE\n" ] } ], "source": [ "# Get the list of current configured CGroups for that controller\n", "cgroups = cpuset.list_all()\n", "print 'Existing CGropups:'\n", "for cg in cgroups:\n", " print \" \", cg" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:45:15 DEBUG : Reading cpuset attributes from:\n", "04:45:15 DEBUG : /sys/fs/cgroup/devlib_cpuset/LITTLE\n", "04:45:15 DEBUG : /root/devlib-target/bin/shutils cgroups_get_attributes /sys/fs/cgroup/devlib_cpuset/LITTLE cpuset\n" ] }, { "data": { "text/plain": [ "{'cpu_exclusive': '0',\n", " 'cpus': '',\n", " 'effective_cpus': '',\n", " 'effective_mems': '',\n", " 'mem_exclusive': '0',\n", " 'mem_hardwall': '0',\n", " 'memory_migrate': '0',\n", " 'memory_pressure': '0',\n", " 'memory_spread_page': '0',\n", " 'memory_spread_slab': '0',\n", " 'mems': '',\n", " 'sched_load_balance': '1',\n", " 'sched_relax_domain_level': '-1'}" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a LITTLE partition and check which tunables we have\n", "cpuset_littles = cpuset.cgroup('/LITTLE')\n", "cpuset_littles.get()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:47:33 DEBUG : Set attribute [/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.cpus] to: 0,3-5\"\n", "04:47:33 DEBUG : sudo -- sh -c 'echo 0,3-5 > '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.cpus'\\'''\n", "04:47:33 DEBUG : sudo -- sh -c 'cat '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.cpus'\\'''\n", "04:47:34 DEBUG : Set attribute [/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.mems] to: 0\"\n", "04:47:34 DEBUG : sudo -- sh -c 'echo 0 > '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.mems'\\'''\n", "04:47:34 DEBUG : sudo -- sh -c 'cat '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.mems'\\'''\n" ] } ], "source": [ "# Setup CPUs and MEMORY nodes for the LITTLE partition\n", "cpuset_littles.set(cpus=te.target.bl.littles, mems=0)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04:52:55 DEBUG : Reading cpuset attributes from:\n", "04:52:55 DEBUG : /sys/fs/cgroup/devlib_cpuset\n", "04:52:55 DEBUG : /root/devlib-target/bin/shutils cgroups_get_attributes /sys/fs/cgroup/devlib_cpuset cpuset\n", "04:52:55 DEBUG : Reading cpuset attributes from:\n", "04:52:55 DEBUG : /sys/fs/cgroup/devlib_cpuset/LITTLE\n", "04:52:55 DEBUG : /root/devlib-target/bin/shutils cgroups_get_attributes /sys/fs/cgroup/devlib_cpuset/LITTLE cpuset\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cpuset:/ cpus: 0-5\n", "cpuset:/LITTLE cpus: 0,3-5\n" ] } ], "source": [ "# Dump the configuraiton of each controller\n", "for cgname in cgroups:\n", " cgroup = cpuset.cgroup(cgname)\n", " attrs = cgroup.get()\n", " cpus = attrs['cpus']\n", " print '{}:{:<15} cpus: {}'.format(cpuset.kind, cgroup.name, cpus)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Methods exists to move tasks in/out and in between groups\n", "# cpuset_littles.add_task()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sample energy from the target" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "03:02:39 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n", "03:02:39 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n", "03:02:39 DEBUG : SAMPLE: {'a53': {'total': 10.111351999999897, 'last': 1335.646094, 'delta': 9.059672999999975}, 'a57': {'total': 15.980763000000024, 'last': 2052.693486, 'delta': 13.449973000000227}}\n", "03:02:39 DEBUG : RESET: {'a53': {'total': 0, 'last': 1335.646094, 'delta': 0}, 'a57': {'total': 0, 'last': 2052.693486, 'delta': 0}}\n", "03:02:40 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n", "03:02:40 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n", "03:02:40 DEBUG : SAMPLE: {'a53': {'total': 0.3706250000000182, 'last': 1336.016719, 'delta': 0.3706250000000182}, 'a57': {'total': 0.49970399999983783, 'last': 2053.19319, 'delta': 0.49970399999983783}}\n", "03:02:40 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n", "03:02:41 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n", "03:02:41 DEBUG : SAMPLE: {'a53': {'total': 0.7240460000000439, 'last': 1336.37014, 'delta': 0.35342100000002574}, 'a57': {'total': 0.9984340000000884, 'last': 2053.69192, 'delta': 0.4987300000002506}}\n", "03:02:43 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n", "03:02:44 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n", "03:02:44 DEBUG : SAMPLE: {'a53': {'total': 1.2472549999999956, 'last': 1336.893349, 'delta': 0.5232089999999516}, 'a57': {'total': 1.9705329999997048, 'last': 2054.664019, 'delta': 0.9720989999996164}}\n", "03:02:44 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n", "03:02:45 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n", "03:02:45 DEBUG : SAMPLE: {'a53': {'total': 1.4408379999999852, 'last': 1337.086932, 'delta': 0.19358299999998962}, 'a57': {'total': 2.4585919999999533, 'last': 2055.152078, 'delta': 0.4880590000002485}}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "First read: {\n", " \"a53\": {\n", " \"total\": 0.7240460000000439, \n", " \"last\": 1336.37014, \n", " \"delta\": 0.35342100000002574\n", " }, \n", " \"a57\": {\n", " \"total\": 0.9984340000000884, \n", " \"last\": 2053.69192, \n", " \"delta\": 0.4987300000002506\n", " }\n", "}\n", "Second read: {\n", " \"a53\": {\n", " \"total\": 1.4408379999999852, \n", " \"last\": 1337.086932, \n", " \"delta\": 0.19358299999998962\n", " }, \n", " \"a57\": {\n", " \"total\": 2.4585919999999533, \n", " \"last\": 2055.152078, \n", " \"delta\": 0.4880590000002485\n", " }\n", "}\n" ] } ], "source": [ "# Reset and sample energy counters\n", "te.emeter.reset()\n", "\n", "# Sleep some time\n", "time.sleep(2)\n", "\n", "# Sample energy consumption since last reset\n", "nrg = te.emeter.sample()\n", "nrg = json.dumps(te.emeter.sample(), indent=4)\n", "print \"First read: \", nrg\n", "\n", "# Sleep some more time\n", "time.sleep(2)\n", "\n", "# Sample again\n", "nrg = te.emeter.sample()\n", "nrg = json.dumps(te.emeter.sample(), indent=4)\n", "print \"Second read: \", nrg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Configure FTrace for a sepcific experiment" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "02:59:43 DEBUG : /usr/bin/scp -r /home/derkling/Code/lisa/libs/devlib/devlib/bin/arm64/trace-cmd root@192.168.0.1:/root/devlib-target/bin/trace-cmd\n", "02:59:44 DEBUG : chmod a+x /root/devlib-target/bin/trace-cmd\n", "02:59:44 DEBUG : cat /sys/kernel/debug/tracing/available_events\n", "02:59:44 INFO : FTrace - Enabled tracepoints:\n", "02:59:44 INFO : FTrace - cpu_idle\n", "02:59:44 INFO : FTrace - cpu_capacity\n", "02:59:44 INFO : FTrace - cpu_frequency\n", "02:59:44 INFO : FTrace - sched_switch\n" ] } ], "source": [ "# Configure a specific set of events to trace\n", "te.ftrace_conf(\n", " { \n", " \"events\" : [ \n", " \"cpu_idle\", \n", " \"cpu_capacity\",\n", " \"cpu_frequency\",\n", " \"sched_switch\",\n", " ], \n", " \"buffsize\" : 10240 \n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "02:59:45 DEBUG : sudo -- sh -c 'echo 10240 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", "02:59:45 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", "02:59:45 DEBUG : sudo -- sh -c '/root/devlib-target/bin/trace-cmd reset'\n", "02:59:46 DEBUG : sudo -- sh -c '/root/devlib-target/bin/trace-cmd start -e cpu_idle -e cpu_capacity -e cpu_frequency -e sched_switch'\n", "02:59:48 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", "02:59:48 DEBUG : Trace CPUFreq frequencies\n", "02:59:48 DEBUG : sudo -- sh -c '/root/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", "02:59:48 DEBUG : uname -a\n", "02:59:49 DEBUG : Trace CPUFreq frequencies\n", "02:59:49 DEBUG : sudo -- sh -c '/root/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", "02:59:49 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", "02:59:49 DEBUG : sudo -- sh -c '/root/devlib-target/bin/trace-cmd stop'\n" ] } ], "source": [ "# Start/Stop a FTrace session\n", "te.ftrace.start()\n", "te.target.execute(\"uname -a\")\n", "te.ftrace.stop()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "02:59:50 DEBUG : sudo -- sh -c '/root/devlib-target/bin/trace-cmd extract -o /root/devlib-target/trace.dat'\n", "02:59:51 DEBUG : /usr/bin/scp -r root@192.168.0.1:/root/devlib-target/trace.dat /home/derkling/Code/lisa/results/TestEnvExample/trace.dat\n" ] } ], "source": [ "# Collect and visualize the trace\n", "trace_file = os.path.join(te.res_dir, 'trace.dat')\n", "te.ftrace.get_trace(trace_file)\n", "output = os.popen(\"DISPLAY=:0.0 kernelshark {}\".format(trace_file))" ] } ], "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 }