• Hagen Paul Pfeifer's avatar
    perf script: Introduce task analyzer python script · e76aff05
    Hagen Paul Pfeifer authored
    Introduce a new 'perf script' to analyze task scheduling behavior.
    
    During the task analysis, some data is always needed - which goes beyond
    the simple time of switching on and off a task (process/thread). This
    concerns for example the runtime of a process or the frequency with
    which the process was called. This script serves to simplify this
    recurring analyze process. It immediately provides the user with helpful
    task characteristic information about the tasks runtimes.
    
    Usage:
    
    Recorded can be in two ways:
    
      $ perf script record tasks-analyzer -- sleep 10
      $ perf record -e sched:sched_switch -a -- sleep 10
    
    The script can parse all perf.data files, most important: sched:sched_switch
    events are mandatory, other events will be ignored.
    
    Most simple report use case is to just call the script without arguments:
    
      $ perf script report tasks-analyzer
          Switched-In      Switched-Out CPU      PID      TID             Comm    Runtime     Time Out-In
      15576.658891407   15576.659156086   4     2412     2428            gdbus        265            1949
      15576.659111320   15576.659455410   0     2412     2412      gnome-shell        344            2267
      15576.659491326   15576.659506173   2       74       74      kworker/2:1         15           13145
      15576.659506173   15576.659825748   2     2858     2858  gnome-terminal-        320           63263
      15576.659871270   15576.659902872   6    20932    20932    kworker/u16:0         32         2314582
      15576.659909951   15576.659945501   3    27264    27264               sh         36              -1
      15576.659853285   15576.659971052   7    27265    27265             perf        118         5050741
      [...]
    
    What is not shown here are the ASCII color sequences. For example, if
    the task consists of only one thread, the TID is grayed out.
    
    Runtime is the time the task was running on the CPU, Time Out-In is the
    time between the process being scheduled *out* and scheduled back *in*.
    So the last time span between two executions. If -1 is printed, then the
    task simply ran the first time in the measurements - a Out-In delta
    could not be calculated.
    
    In addition to the chronological representation, there is a summary on
    task level. This output can be additionally switched on via the
    --summary option and provides information such as max, min & average
    runtime per process. The maximum runtime is often important for
    debugging. The call looks like this:
    
      $ perf script report tasks-analyzer --summary
      Summary
           Task Information                       Runtime Information
        PID   TID            Comm Runs Accumulated    Mean  Median  Min   Max          Max At
         14    14     ksoftirqd/0   13         334      26      15    9   127 15571.621211956
         15    15     rcu_preempt  133        1778      13      13    2    33 15572.581176024
         16    16     migration/0    3          49      16      13   12    24 15571.608915425
         20    20     migration/1    3          34      11      13    8    13 15571.639101555
         25    25     migration/2    3          32      11      12    9    12 15575.639239896
      [...]
    
    Besides these two options, there are a number of other options that change the
    output and behavior. This can be queried via --help. Options worth mentioning include:
    
    - filter-tasks         - filter out unneeded tasks, --filter-task 1337,/sbin/init
    - highlight-tasks      - more pleasant focusing, --highlight-tasks 1:red,mutt:yellow
    - extended-times       - show combinations of elapsed times between schedule in/schedule out
    - summary-extended     - summary with additional information, like maximum delta time statistics
    - rename-comms-by-tids - handy for inexpressive processnames like python, --rename 1337:my-python-app
    - ms                   - show timestamps in milliseconds, nanoseconds is also possible (--ns)
    - time-limit           - limit the analyzer to a time range, --time-limit 15576.0:15576.1
    
    Script is tested and prime time ready for python2 & python3:
    
    - make PYTHON=python3 prefix=/usr/local install
    - make PYTHON=python2 prefix=/usr/local install
    Signed-off-by: default avatarHagen Paul Pfeifer <hagen@jauu.net>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: https://lore.kernel.org/r/20221206154406.41941-2-petar.gligor@gmail.comSigned-off-by: default avatarPetar Gligoric <petar.gligoric@rohde-schwarz.com>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    e76aff05
task-analyzer.py 29.1 KB