Home | History | Annotate | Download | only in sched
      1 {
      2  "metadata": {
      3   "kernelspec": {
      4    "display_name": "Python 2",
      5    "language": "python",
      6    "name": "python2"
      7   },
      8   "language_info": {
      9    "codemirror_mode": {
     10     "name": "ipython",
     11     "version": 2
     12    },
     13    "file_extension": ".py",
     14    "mimetype": "text/x-python",
     15    "name": "python",
     16    "nbconvert_exporter": "python",
     17    "pygments_lexer": "ipython2",
     18    "version": "2.7.9"
     19   },
     20   "name": ""
     21  },
     22  "nbformat": 3,
     23  "nbformat_minor": 0,
     24  "worksheets": [
     25   {
     26    "cells": [
     27     {
     28      "cell_type": "heading",
     29      "level": 1,
     30      "metadata": {},
     31      "source": [
     32       "Setup"
     33      ]
     34     },
     35     {
     36      "cell_type": "code",
     37      "collapsed": false,
     38      "input": [
     39       "from trappy.stats.Topology import Topology\n",
     40       "from bart.sched.SchedMultiAssert import SchedMultiAssert\n",
     41       "from bart.sched.SchedAssert import SchedAssert\n",
     42       "import trappy\n",
     43       "import os\n",
     44       "import operator\n",
     45       "import json\n",
     46       "\n",
     47       "#Define a CPU Topology (for multi-cluster systems)\n",
     48       "BIG = [1, 2]\n",
     49       "LITTLE = [0, 3, 4, 5]\n",
     50       "CLUSTERS = [BIG, LITTLE]\n",
     51       "topology = Topology(clusters=CLUSTERS)\n",
     52       "\n",
     53       "BASE_PATH = \"/Users/kapileshwarsingh/AnalysisRawData/LPC/sched_deadline/\"\n",
     54       "\n",
     55       "THRESHOLD = 10.0\n",
     56       "def between_threshold(a, b):\n",
     57       "    return abs(((a - b) * 100.0) / b) < THRESHOLD"
     58      ],
     59      "language": "python",
     60      "metadata": {},
     61      "outputs": [],
     62      "prompt_number": 3
     63     },
     64     {
     65      "cell_type": "heading",
     66      "level": 1,
     67      "metadata": {},
     68      "source": [
     69       "Periodic Yield"
     70      ]
     71     },
     72     {
     73      "cell_type": "markdown",
     74      "metadata": {},
     75      "source": [
     76       "The thread periodic_yeild is woken up at 30ms intervals where it calls sched_yield and relinquishes its time-slice.\n",
     77       "The expectation is that the task will have a duty cycle < 1% and a period of 30ms.\n",
     78       "\n",
     79       "There are two threads, and the rank=1 conveys that the condition is true for one of the threads with the name \"periodic_yeild\"\n"
     80      ]
     81     },
     82     {
     83      "cell_type": "code",
     84      "collapsed": false,
     85      "input": [
     86       "TRACE_FILE = os.path.join(BASE_PATH, \"yield\")\n",
     87       "ftrace = trappy.FTrace(TRACE_FILE, \"cpuhog\")\n",
     88       "\n",
     89       "# Assert Period\n",
     90       "s = SchedMultiAssert(ftrace, topology, execnames=\"periodic_yield\")\n",
     91       "if s.assertPeriod(30, between_threshold, rank=1):\n",
     92       "    print \"PASS: Period\"\n",
     93       "    print json.dumps(s.getPeriod(), indent=3)\n",
     94       "\n",
     95       "print \"\"\n",
     96       "    \n",
     97       "# Assert DutyCycle    \n",
     98       "if s.assertDutyCycle(1, operator.lt, window=(0,4), rank=2):\n",
     99       "    print \"PASS: DutyCycle\"\n",
    100       "    print json.dumps(s.getDutyCycle(window=(0,4)), indent=3)"
    101      ],
    102      "language": "python",
    103      "metadata": {},
    104      "outputs": [
    105       {
    106        "output_type": "stream",
    107        "stream": "stdout",
    108        "text": [
    109         "PASS: Period\n",
    110         "{\n",
    111         "   \"1844\": {\n",
    112         "      \"period\": 1.0085000000401578, \n",
    113         "      \"task_name\": \"periodic_yield\"\n",
    114         "   }, \n",
    115         "   \"1845\": {\n",
    116         "      \"period\": 29.822017857142669, \n",
    117         "      \"task_name\": \"periodic_yield\"\n",
    118         "   }\n",
    119         "}\n",
    120         "\n",
    121         "PASS: DutyCycle\n",
    122         "{\n",
    123         "   \"1844\": {\n",
    124         "      \"task_name\": \"periodic_yield\", \n",
    125         "      \"dutycycle\": 0.074749999998857675\n",
    126         "   }, \n",
    127         "   \"1845\": {\n",
    128         "      \"task_name\": \"periodic_yield\", \n",
    129         "      \"dutycycle\": 0.03862499999343072\n",
    130         "   }\n",
    131         "}\n"
    132        ]
    133       }
    134      ],
    135      "prompt_number": 10
    136     },
    137     {
    138      "cell_type": "heading",
    139      "level": 1,
    140      "metadata": {},
    141      "source": [
    142       "CPU Hog"
    143      ]
    144     },
    145     {
    146      "cell_type": "markdown",
    147      "metadata": {},
    148      "source": [
    149       "The reservation of a CPU hogging task is set to 10ms for every 100ms. The assertion ensures a duty cycle of 10%"
    150      ]
    151     },
    152     {
    153      "cell_type": "code",
    154      "collapsed": false,
    155      "input": [
    156       "TRACE_FILE = os.path.join(BASE_PATH, \"cpuhog\")\n",
    157       "ftrace = trappy.FTrace(TRACE_FILE, \"cpuhog\")\n",
    158       "s = SchedMultiAssert(ftrace, topology, execnames=\"cpuhog\")\n",
    159       "s.plot().view()\n",
    160       "\n",
    161       "# Assert DutyCycle\n",
    162       "if s.assertDutyCycle(10, between_threshold, window=(0, 5), rank=1):\n",
    163       "    print \"PASS: DutyCycle\"\n",
    164       "    print json.dumps(s.getDutyCycle(window=(0, 5)), indent=3)"
    165      ],
    166      "language": "python",
    167      "metadata": {},
    168      "outputs": [
    169       {
    170        "html": [
    171         "<style>\n",
    172         "/*\n",
    173         "\n",
    174         " *    Copyright 2015-2015 ARM Limited\n",
    175         "\n",
    176         " *\n",
    177         "\n",
    178         " * Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    179         "\n",
    180         " * you may not use this file except in compliance with the License.\n",
    181         "\n",
    182         " * You may obtain a copy of the License at\n",
    183         "\n",
    184         " *\n",
    185         "\n",
    186         " *     http://www.apache.org/licenses/LICENSE-2.0\n",
    187         "\n",
    188         " *\n",
    189         "\n",
    190         " * Unless required by applicable law or agreed to in writing, software\n",
    191         "\n",
    192         " * distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    193         "\n",
    194         " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    195         "\n",
    196         " * See the License for the specific language governing permissions and\n",
    197         "\n",
    198         " * limitations under the License.\n",
    199         "\n",
    200         " */\n",
    201         "\n",
    202         "\n",
    203         "\n",
    204         ".d3-tip {\n",
    205         "\n",
    206         "  line-height: 1;\n",
    207         "\n",
    208         "  padding: 12px;\n",
    209         "\n",
    210         "  background: rgba(0, 0, 0, 0.6);\n",
    211         "\n",
    212         "  color: #fff;\n",
    213         "\n",
    214         "  border-radius: 2px;\n",
    215         "\n",
    216         "  position: absolute !important;\n",
    217         "\n",
    218         "  z-index: 99999;\n",
    219         "\n",
    220         "}\n",
    221         "\n",
    222         "\n",
    223         "\n",
    224         ".d3-tip:after {\n",
    225         "\n",
    226         "  box-sizing: border-box;\n",
    227         "\n",
    228         "  pointer-events: none;\n",
    229         "\n",
    230         "  display: inline;\n",
    231         "\n",
    232         "  font-size: 10px;\n",
    233         "\n",
    234         "  width: 100%;\n",
    235         "\n",
    236         "  line-height: 1;\n",
    237         "\n",
    238         "  color: rgba(0, 0, 0, 0.6);\n",
    239         "\n",
    240         "  content: \"\\25BC\";\n",
    241         "\n",
    242         "  position: absolute !important;\n",
    243         "\n",
    244         "  z-index: 99999;\n",
    245         "\n",
    246         "  text-align: center;\n",
    247         "\n",
    248         "}\n",
    249         "\n",
    250         "\n",
    251         "\n",
    252         ".d3-tip.n:after {\n",
    253         "\n",
    254         "  margin: -1px 0 0 0;\n",
    255         "\n",
    256         "  top: 100%;\n",
    257         "\n",
    258         "  left: 0;\n",
    259         "\n",
    260         "}\n",
    261         "\n",
    262         "\n",
    263         "\n",
    264         ".chart {\n",
    265         "\n",
    266         "  shape-rendering: crispEdges;\n",
    267         "\n",
    268         "}\n",
    269         "\n",
    270         "\n",
    271         "\n",
    272         ".mini text {\n",
    273         "\n",
    274         "  font: 9px sans-serif;\n",
    275         "\n",
    276         "}\n",
    277         "\n",
    278         "\n",
    279         "\n",
    280         ".main text {\n",
    281         "\n",
    282         "  font: 12px sans-serif;\n",
    283         "\n",
    284         "}\n",
    285         "\n",
    286         "\n",
    287         "\n",
    288         ".axis line, .axis path {\n",
    289         "\n",
    290         "  stroke: black;\n",
    291         "\n",
    292         "}\n",
    293         "\n",
    294         "\n",
    295         "\n",
    296         ".miniItem {\n",
    297         "\n",
    298         "  stroke-width: 8;\n",
    299         "\n",
    300         "}\n",
    301         "\n",
    302         "\n",
    303         "\n",
    304         ".brush .extent {\n",
    305         "\n",
    306         "\n",
    307         "\n",
    308         "  stroke: #000;\n",
    309         "\n",
    310         "  fill-opacity: .125;\n",
    311         "\n",
    312         "  shape-rendering: crispEdges;\n",
    313         "\n",
    314         "}\n",
    315         "\n",
    316         "</style>\n",
    317         "<div id=\"fig_41c7653cedde4765ae1f166e75c4fb08\" class=\"eventplot\">\n",
    318         "        <script>\n",
    319         "            var req = require.config( {\n",
    320         "\n",
    321         "                paths: {\n",
    322         "\n",
    323         "                    \"EventPlot\": \"https://rawgit.com/sinkap/7f89de3e558856b81f10/raw/46144f8f8c5da670c54f826f0c634762107afc66/EventPlot\",\n",
    324         "                    \"d3-tip\": \"http://labratrevenge.com/d3-tip/javascripts/d3.tip.v0.6.3\",\n",
    325         "                    \"d3\": \"http://d3js.org/d3.v3.min\"\n",
    326         "                },\n",
    327         "                shim: {\n",
    328         "                    \"d3-tip\": [\"d3\"],\n",
    329         "                    \"EventPlot\": {\n",
    330         "\n",
    331         "                        \"deps\": [\"d3-tip\", \"d3\" ],\n",
    332         "                        \"exports\":  \"EventPlot\"\n",
    333         "                    }\n",
    334         "                }\n",
    335         "            });\n",
    336         "            req([\"require\", \"EventPlot\"], function() {\n",
    337         "               EventPlot.generate('fig_41c7653cedde4765ae1f166e75c4fb08', 'https://rawgit.com/sinkap/e9bc2394cf322f4dad0d/raw/014fae226c847a467fba541fbc390e18acea127b/fig_41c7653cedde4765ae1f166e75c4fb08.json');\n",
    338         "            });\n",
    339         "        </script>\n",
    340         "        </div>"
    341        ],
    342        "metadata": {},
    343        "output_type": "display_data",
    344        "text": [
    345         "<IPython.core.display.HTML object>"
    346        ]
    347       },
    348       {
    349        "output_type": "stream",
    350        "stream": "stdout",
    351        "text": [
    352         "PASS: DutyCycle\n",
    353         "{\n",
    354         "   \"1852\": {\n",
    355         "      \"task_name\": \"cpuhog\", \n",
    356         "      \"dutycycle\": 10.050119999991693\n",
    357         "   }\n",
    358         "}\n"
    359        ]
    360       }
    361      ],
    362      "prompt_number": 11
    363     },
    364     {
    365      "cell_type": "heading",
    366      "level": 1,
    367      "metadata": {},
    368      "source": [
    369       "Changing Reservations"
    370      ]
    371     },
    372     {
    373      "cell_type": "markdown",
    374      "metadata": {},
    375      "source": [
    376       "A CPU hogging task has reservations set in the increasing order starting from 10%  followed by a 2s period of normal execution"
    377      ]
    378     },
    379     {
    380      "cell_type": "code",
    381      "collapsed": false,
    382      "input": [
    383       "TRACE_FILE = os.path.join(BASE_PATH, \"cancel_dl_timer\")\n",
    384       "ftrace = trappy.FTrace(TRACE_FILE, \"cpuhog\")\n",
    385       "s = SchedAssert(ftrace, topology, execname=\"cpuhog\")\n",
    386       "s.plot().view()\n",
    387       "\n",
    388       "NUM_PHASES = 10\n",
    389       "PHASE_DURATION = 2\n",
    390       "start = s.getStartTime()\n",
    391       "DUTY_CYCLE_FACTOR = 10\n",
    392       "\n",
    393       "\n",
    394       "for phase in range(NUM_PHASES + 1):\n",
    395       "    window = (start + (phase * PHASE_DURATION),\n",
    396       "              start + ((phase + 1) * PHASE_DURATION))\n",
    397       "    \n",
    398       "    if phase % 2 == 0:\n",
    399       "        DUTY_CYCLE = (phase + 2) * DUTY_CYCLE_FACTOR / 2\n",
    400       "    else:\n",
    401       "        DUTY_CYCLE = 100\n",
    402       "\n",
    403       "\n",
    404       "    print \"WINDOW -> [{:.2f}, {:.2f}]\".format(window[0],\n",
    405       "                                            window[1])\n",
    406       "    \n",
    407       "    \n",
    408       "    \n",
    409       "    if s.assertDutyCycle(DUTY_CYCLE, between_threshold, window=window):\n",
    410       "        print \"PASS: Expected={} Actual={:.2f} THRESHOLD={}\".format(DUTY_CYCLE,\n",
    411       "                                                                s.getDutyCycle(window=window),\n",
    412       "                                                                THRESHOLD)\n",
    413       "    else:\n",
    414       "        print \"FAIL: Expected={} Actual={:.2f} THRESHOLD={}\".format(DUTY_CYCLE,\n",
    415       "                                                                s.getDutyCycle(window=window),\n",
    416       "                                                                THRESHOLD)\n",
    417       "    \n",
    418       "    print \"\""
    419      ],
    420      "language": "python",
    421      "metadata": {},
    422      "outputs": [
    423       {
    424        "html": [
    425         "<style>\n",
    426         "/*\n",
    427         "\n",
    428         " *    Copyright 2015-2015 ARM Limited\n",
    429         "\n",
    430         " *\n",
    431         "\n",
    432         " * Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    433         "\n",
    434         " * you may not use this file except in compliance with the License.\n",
    435         "\n",
    436         " * You may obtain a copy of the License at\n",
    437         "\n",
    438         " *\n",
    439         "\n",
    440         " *     http://www.apache.org/licenses/LICENSE-2.0\n",
    441         "\n",
    442         " *\n",
    443         "\n",
    444         " * Unless required by applicable law or agreed to in writing, software\n",
    445         "\n",
    446         " * distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    447         "\n",
    448         " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    449         "\n",
    450         " * See the License for the specific language governing permissions and\n",
    451         "\n",
    452         " * limitations under the License.\n",
    453         "\n",
    454         " */\n",
    455         "\n",
    456         "\n",
    457         "\n",
    458         ".d3-tip {\n",
    459         "\n",
    460         "  line-height: 1;\n",
    461         "\n",
    462         "  padding: 12px;\n",
    463         "\n",
    464         "  background: rgba(0, 0, 0, 0.6);\n",
    465         "\n",
    466         "  color: #fff;\n",
    467         "\n",
    468         "  border-radius: 2px;\n",
    469         "\n",
    470         "  position: absolute !important;\n",
    471         "\n",
    472         "  z-index: 99999;\n",
    473         "\n",
    474         "}\n",
    475         "\n",
    476         "\n",
    477         "\n",
    478         ".d3-tip:after {\n",
    479         "\n",
    480         "  box-sizing: border-box;\n",
    481         "\n",
    482         "  pointer-events: none;\n",
    483         "\n",
    484         "  display: inline;\n",
    485         "\n",
    486         "  font-size: 10px;\n",
    487         "\n",
    488         "  width: 100%;\n",
    489         "\n",
    490         "  line-height: 1;\n",
    491         "\n",
    492         "  color: rgba(0, 0, 0, 0.6);\n",
    493         "\n",
    494         "  content: \"\\25BC\";\n",
    495         "\n",
    496         "  position: absolute !important;\n",
    497         "\n",
    498         "  z-index: 99999;\n",
    499         "\n",
    500         "  text-align: center;\n",
    501         "\n",
    502         "}\n",
    503         "\n",
    504         "\n",
    505         "\n",
    506         ".d3-tip.n:after {\n",
    507         "\n",
    508         "  margin: -1px 0 0 0;\n",
    509         "\n",
    510         "  top: 100%;\n",
    511         "\n",
    512         "  left: 0;\n",
    513         "\n",
    514         "}\n",
    515         "\n",
    516         "\n",
    517         "\n",
    518         ".chart {\n",
    519         "\n",
    520         "  shape-rendering: crispEdges;\n",
    521         "\n",
    522         "}\n",
    523         "\n",
    524         "\n",
    525         "\n",
    526         ".mini text {\n",
    527         "\n",
    528         "  font: 9px sans-serif;\n",
    529         "\n",
    530         "}\n",
    531         "\n",
    532         "\n",
    533         "\n",
    534         ".main text {\n",
    535         "\n",
    536         "  font: 12px sans-serif;\n",
    537         "\n",
    538         "}\n",
    539         "\n",
    540         "\n",
    541         "\n",
    542         ".axis line, .axis path {\n",
    543         "\n",
    544         "  stroke: black;\n",
    545         "\n",
    546         "}\n",
    547         "\n",
    548         "\n",
    549         "\n",
    550         ".miniItem {\n",
    551         "\n",
    552         "  stroke-width: 8;\n",
    553         "\n",
    554         "}\n",
    555         "\n",
    556         "\n",
    557         "\n",
    558         ".brush .extent {\n",
    559         "\n",
    560         "\n",
    561         "\n",
    562         "  stroke: #000;\n",
    563         "\n",
    564         "  fill-opacity: .125;\n",
    565         "\n",
    566         "  shape-rendering: crispEdges;\n",
    567         "\n",
    568         "}\n",
    569         "\n",
    570         "</style>\n",
    571         "<div id=\"fig_421afa8cc8234df49030c900b680220b\" class=\"eventplot\">\n",
    572         "        <script>\n",
    573         "            var req = require.config( {\n",
    574         "\n",
    575         "                paths: {\n",
    576         "\n",
    577         "                    \"EventPlot\": \"https://rawgit.com/sinkap/7f89de3e558856b81f10/raw/46144f8f8c5da670c54f826f0c634762107afc66/EventPlot\",\n",
    578         "                    \"d3-tip\": \"http://labratrevenge.com/d3-tip/javascripts/d3.tip.v0.6.3\",\n",
    579         "                    \"d3\": \"http://d3js.org/d3.v3.min\"\n",
    580         "                },\n",
    581         "                shim: {\n",
    582         "                    \"d3-tip\": [\"d3\"],\n",
    583         "                    \"EventPlot\": {\n",
    584         "\n",
    585         "                        \"deps\": [\"d3-tip\", \"d3\" ],\n",
    586         "                        \"exports\":  \"EventPlot\"\n",
    587         "                    }\n",
    588         "                }\n",
    589         "            });\n",
    590         "            req([\"require\", \"EventPlot\"], function() {\n",
    591         "               EventPlot.generate('fig_421afa8cc8234df49030c900b680220b', 'https://rawgit.com/sinkap/a207675f6483aa0b9342/raw/825717935112f36fe996b77093c0c71d3871fee4/fig_421afa8cc8234df49030c900b680220b.json');\n",
    592         "            });\n",
    593         "        </script>\n",
    594         "        </div>"
    595        ],
    596        "metadata": {},
    597        "output_type": "display_data",
    598        "text": [
    599         "<IPython.core.display.HTML object>"
    600        ]
    601       },
    602       {
    603        "output_type": "stream",
    604        "stream": "stdout",
    605        "text": [
    606         "WINDOW -> [0.00, 2.00]\n",
    607         "PASS: Expected=10 Actual=10.38 THRESHOLD=10.0\n",
    608         "\n",
    609         "WINDOW -> [2.00, 4.00]\n",
    610         "PASS: Expected=100 Actual=99.60 THRESHOLD=10.0\n",
    611         "\n",
    612         "WINDOW -> [4.00, 6.00]\n",
    613         "PASS: Expected=20 Actual=21.06 THRESHOLD=10.0\n",
    614         "\n",
    615         "WINDOW -> [6.00, 8.00]\n",
    616         "PASS: Expected=100 Actual=95.69 THRESHOLD=10.0\n",
    617         "\n",
    618         "WINDOW -> [8.00, 10.00]\n",
    619         "PASS: Expected=30 Actual=31.78 THRESHOLD=10.0\n",
    620         "\n",
    621         "WINDOW -> [10.00, 12.00]\n",
    622         "PASS: Expected=100 Actual=98.23 THRESHOLD=10.0\n",
    623         "\n",
    624         "WINDOW -> [12.00, 14.00]\n",
    625         "PASS: Expected=40 Actual=40.74 THRESHOLD=10.0\n",
    626         "\n",
    627         "WINDOW -> [14.00, 16.00]\n",
    628         "PASS: Expected=100 Actual=97.58 THRESHOLD=10.0\n",
    629         "\n",
    630         "WINDOW -> [16.00, 18.00]\n",
    631         "PASS: Expected=50 Actual=52.51 THRESHOLD=10.0\n",
    632         "\n",
    633         "WINDOW -> [18.00, 20.00]\n",
    634         "PASS: Expected=100 Actual=96.38 THRESHOLD=10.0\n",
    635         "\n",
    636         "WINDOW -> [20.00, 22.00]\n",
    637         "PASS: Expected=60 Actual=60.71 THRESHOLD=10.0\n",
    638         "\n"
    639        ]
    640       }
    641      ],
    642      "prompt_number": 4
    643     }
    644    ],
    645    "metadata": {}
    646   }
    647  ]
    648 }