|
@@ -1,19 +1,19 @@
|
|
-perf-trace-python(1)
|
|
|
|
|
|
+perf-script-python(1)
|
|
====================
|
|
====================
|
|
|
|
|
|
NAME
|
|
NAME
|
|
----
|
|
----
|
|
-perf-trace-python - Process trace data with a Python script
|
|
|
|
|
|
+perf-script-python - Process trace data with a Python script
|
|
|
|
|
|
SYNOPSIS
|
|
SYNOPSIS
|
|
--------
|
|
--------
|
|
[verse]
|
|
[verse]
|
|
-'perf trace' [-s [Python]:script[.py] ]
|
|
|
|
|
|
+'perf script' [-s [Python]:script[.py] ]
|
|
|
|
|
|
DESCRIPTION
|
|
DESCRIPTION
|
|
-----------
|
|
-----------
|
|
|
|
|
|
-This perf trace option is used to process perf trace data using perf's
|
|
|
|
|
|
+This perf script option is used to process perf script data using perf's
|
|
built-in Python interpreter. It reads and processes the input file and
|
|
built-in Python interpreter. It reads and processes the input file and
|
|
displays the results of the trace analysis implemented in the given
|
|
displays the results of the trace analysis implemented in the given
|
|
Python script, if any.
|
|
Python script, if any.
|
|
@@ -23,15 +23,15 @@ A QUICK EXAMPLE
|
|
|
|
|
|
This section shows the process, start to finish, of creating a working
|
|
This section shows the process, start to finish, of creating a working
|
|
Python script that aggregates and extracts useful information from a
|
|
Python script that aggregates and extracts useful information from a
|
|
-raw perf trace stream. You can avoid reading the rest of this
|
|
|
|
|
|
+raw perf script stream. You can avoid reading the rest of this
|
|
document if an example is enough for you; the rest of the document
|
|
document if an example is enough for you; the rest of the document
|
|
provides more details on each step and lists the library functions
|
|
provides more details on each step and lists the library functions
|
|
available to script writers.
|
|
available to script writers.
|
|
|
|
|
|
This example actually details the steps that were used to create the
|
|
This example actually details the steps that were used to create the
|
|
-'syscall-counts' script you see when you list the available perf trace
|
|
|
|
-scripts via 'perf trace -l'. As such, this script also shows how to
|
|
|
|
-integrate your script into the list of general-purpose 'perf trace'
|
|
|
|
|
|
+'syscall-counts' script you see when you list the available perf script
|
|
|
|
+scripts via 'perf script -l'. As such, this script also shows how to
|
|
|
|
+integrate your script into the list of general-purpose 'perf script'
|
|
scripts listed by that command.
|
|
scripts listed by that command.
|
|
|
|
|
|
The syscall-counts script is a simple script, but demonstrates all the
|
|
The syscall-counts script is a simple script, but demonstrates all the
|
|
@@ -105,31 +105,31 @@ That single stream will be recorded in a file in the current directory
|
|
called perf.data.
|
|
called perf.data.
|
|
|
|
|
|
Once we have a perf.data file containing our data, we can use the -g
|
|
Once we have a perf.data file containing our data, we can use the -g
|
|
-'perf trace' option to generate a Python script that will contain a
|
|
|
|
|
|
+'perf script' option to generate a Python script that will contain a
|
|
callback handler for each event type found in the perf.data trace
|
|
callback handler for each event type found in the perf.data trace
|
|
stream (for more details, see the STARTER SCRIPTS section).
|
|
stream (for more details, see the STARTER SCRIPTS section).
|
|
|
|
|
|
----
|
|
----
|
|
-# perf trace -g python
|
|
|
|
-generated Python script: perf-trace.py
|
|
|
|
|
|
+# perf script -g python
|
|
|
|
+generated Python script: perf-script.py
|
|
|
|
|
|
The output file created also in the current directory is named
|
|
The output file created also in the current directory is named
|
|
-perf-trace.py. Here's the file in its entirety:
|
|
|
|
|
|
+perf-script.py. Here's the file in its entirety:
|
|
|
|
|
|
-# perf trace event handlers, generated by perf trace -g python
|
|
|
|
|
|
+# perf script event handlers, generated by perf script -g python
|
|
# Licensed under the terms of the GNU GPL License version 2
|
|
# Licensed under the terms of the GNU GPL License version 2
|
|
|
|
|
|
# The common_* event handler fields are the most useful fields common to
|
|
# The common_* event handler fields are the most useful fields common to
|
|
# all events. They don't necessarily correspond to the 'common_*' fields
|
|
# all events. They don't necessarily correspond to the 'common_*' fields
|
|
# in the format files. Those fields not available as handler params can
|
|
# in the format files. Those fields not available as handler params can
|
|
# be retrieved using Python functions of the form common_*(context).
|
|
# be retrieved using Python functions of the form common_*(context).
|
|
-# See the perf-trace-python Documentation for the list of available functions.
|
|
|
|
|
|
+# See the perf-script-python Documentation for the list of available functions.
|
|
|
|
|
|
import os
|
|
import os
|
|
import sys
|
|
import sys
|
|
|
|
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
|
|
|
|
|
+ '/scripts/python/perf-script-Util/lib/Perf/Trace')
|
|
|
|
|
|
from perf_trace_context import *
|
|
from perf_trace_context import *
|
|
from Core import *
|
|
from Core import *
|
|
@@ -160,7 +160,7 @@ def print_header(event_name, cpu, secs, nsecs, pid, comm):
|
|
----
|
|
----
|
|
|
|
|
|
At the top is a comment block followed by some import statements and a
|
|
At the top is a comment block followed by some import statements and a
|
|
-path append which every perf trace script should include.
|
|
|
|
|
|
+path append which every perf script script should include.
|
|
|
|
|
|
Following that are a couple generated functions, trace_begin() and
|
|
Following that are a couple generated functions, trace_begin() and
|
|
trace_end(), which are called at the beginning and the end of the
|
|
trace_end(), which are called at the beginning and the end of the
|
|
@@ -189,8 +189,8 @@ simply a utility function used for that purpose. Let's rename the
|
|
script and run it to see the default output:
|
|
script and run it to see the default output:
|
|
|
|
|
|
----
|
|
----
|
|
-# mv perf-trace.py syscall-counts.py
|
|
|
|
-# perf trace -s syscall-counts.py
|
|
|
|
|
|
+# mv perf-script.py syscall-counts.py
|
|
|
|
+# perf script -s syscall-counts.py
|
|
|
|
|
|
raw_syscalls__sys_enter 1 00840.847582083 7506 perf id=1, args=
|
|
raw_syscalls__sys_enter 1 00840.847582083 7506 perf id=1, args=
|
|
raw_syscalls__sys_enter 1 00840.847595764 7506 perf id=1, args=
|
|
raw_syscalls__sys_enter 1 00840.847595764 7506 perf id=1, args=
|
|
@@ -216,7 +216,7 @@ import os
|
|
import sys
|
|
import sys
|
|
|
|
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
|
|
|
|
|
+ '/scripts/python/perf-script-Util/lib/Perf/Trace')
|
|
|
|
|
|
from perf_trace_context import *
|
|
from perf_trace_context import *
|
|
from Core import *
|
|
from Core import *
|
|
@@ -279,7 +279,7 @@ import os
|
|
import sys
|
|
import sys
|
|
|
|
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
|
|
|
|
|
+ '/scripts/python/perf-script-Util/lib/Perf/Trace')
|
|
|
|
|
|
from perf_trace_context import *
|
|
from perf_trace_context import *
|
|
from Core import *
|
|
from Core import *
|
|
@@ -315,7 +315,7 @@ def print_syscall_totals():
|
|
|
|
|
|
The script can be run just as before:
|
|
The script can be run just as before:
|
|
|
|
|
|
- # perf trace -s syscall-counts.py
|
|
|
|
|
|
+ # perf script -s syscall-counts.py
|
|
|
|
|
|
So those are the essential steps in writing and running a script. The
|
|
So those are the essential steps in writing and running a script. The
|
|
process can be generalized to any tracepoint or set of tracepoints
|
|
process can be generalized to any tracepoint or set of tracepoints
|
|
@@ -324,17 +324,17 @@ interested in by looking at the list of available events shown by
|
|
'perf list' and/or look in /sys/kernel/debug/tracing events for
|
|
'perf list' and/or look in /sys/kernel/debug/tracing events for
|
|
detailed event and field info, record the corresponding trace data
|
|
detailed event and field info, record the corresponding trace data
|
|
using 'perf record', passing it the list of interesting events,
|
|
using 'perf record', passing it the list of interesting events,
|
|
-generate a skeleton script using 'perf trace -g python' and modify the
|
|
|
|
|
|
+generate a skeleton script using 'perf script -g python' and modify the
|
|
code to aggregate and display it for your particular needs.
|
|
code to aggregate and display it for your particular needs.
|
|
|
|
|
|
After you've done that you may end up with a general-purpose script
|
|
After you've done that you may end up with a general-purpose script
|
|
that you want to keep around and have available for future use. By
|
|
that you want to keep around and have available for future use. By
|
|
writing a couple of very simple shell scripts and putting them in the
|
|
writing a couple of very simple shell scripts and putting them in the
|
|
right place, you can have your script listed alongside the other
|
|
right place, you can have your script listed alongside the other
|
|
-scripts listed by the 'perf trace -l' command e.g.:
|
|
|
|
|
|
+scripts listed by the 'perf script -l' command e.g.:
|
|
|
|
|
|
----
|
|
----
|
|
-root@tropicana:~# perf trace -l
|
|
|
|
|
|
+root@tropicana:~# perf script -l
|
|
List of available trace scripts:
|
|
List of available trace scripts:
|
|
workqueue-stats workqueue stats (ins/exe/create/destroy)
|
|
workqueue-stats workqueue stats (ins/exe/create/destroy)
|
|
wakeup-latency system-wide min/max/avg wakeup latency
|
|
wakeup-latency system-wide min/max/avg wakeup latency
|
|
@@ -365,14 +365,14 @@ perf record -a -e raw_syscalls:sys_enter
|
|
The 'report' script is also a shell script with the same base name as
|
|
The 'report' script is also a shell script with the same base name as
|
|
your script, but with -report appended. It should also be located in
|
|
your script, but with -report appended. It should also be located in
|
|
the perf/scripts/python/bin directory. In that script, you write the
|
|
the perf/scripts/python/bin directory. In that script, you write the
|
|
-'perf trace -s' command-line needed for running your script:
|
|
|
|
|
|
+'perf script -s' command-line needed for running your script:
|
|
|
|
|
|
----
|
|
----
|
|
# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-report
|
|
# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-report
|
|
|
|
|
|
#!/bin/bash
|
|
#!/bin/bash
|
|
# description: system-wide syscall counts
|
|
# description: system-wide syscall counts
|
|
-perf trace -s ~/libexec/perf-core/scripts/python/syscall-counts.py
|
|
|
|
|
|
+perf script -s ~/libexec/perf-core/scripts/python/syscall-counts.py
|
|
----
|
|
----
|
|
|
|
|
|
Note that the location of the Python script given in the shell script
|
|
Note that the location of the Python script given in the shell script
|
|
@@ -390,17 +390,17 @@ total 32
|
|
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:30 .
|
|
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:30 .
|
|
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:29 ..
|
|
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:29 ..
|
|
drwxr-xr-x 2 trz trz 4096 2010-01-26 22:29 bin
|
|
drwxr-xr-x 2 trz trz 4096 2010-01-26 22:29 bin
|
|
--rw-r--r-- 1 trz trz 2548 2010-01-26 22:29 check-perf-trace.py
|
|
|
|
-drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 Perf-Trace-Util
|
|
|
|
|
|
+-rw-r--r-- 1 trz trz 2548 2010-01-26 22:29 check-perf-script.py
|
|
|
|
+drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 perf-script-Util
|
|
-rw-r--r-- 1 trz trz 1462 2010-01-26 22:30 syscall-counts.py
|
|
-rw-r--r-- 1 trz trz 1462 2010-01-26 22:30 syscall-counts.py
|
|
----
|
|
----
|
|
|
|
|
|
Once you've done that (don't forget to do a new 'make install',
|
|
Once you've done that (don't forget to do a new 'make install',
|
|
-otherwise your script won't show up at run-time), 'perf trace -l'
|
|
|
|
|
|
+otherwise your script won't show up at run-time), 'perf script -l'
|
|
should show a new entry for your script:
|
|
should show a new entry for your script:
|
|
|
|
|
|
----
|
|
----
|
|
-root@tropicana:~# perf trace -l
|
|
|
|
|
|
+root@tropicana:~# perf script -l
|
|
List of available trace scripts:
|
|
List of available trace scripts:
|
|
workqueue-stats workqueue stats (ins/exe/create/destroy)
|
|
workqueue-stats workqueue stats (ins/exe/create/destroy)
|
|
wakeup-latency system-wide min/max/avg wakeup latency
|
|
wakeup-latency system-wide min/max/avg wakeup latency
|
|
@@ -409,19 +409,19 @@ List of available trace scripts:
|
|
syscall-counts system-wide syscall counts
|
|
syscall-counts system-wide syscall counts
|
|
----
|
|
----
|
|
|
|
|
|
-You can now perform the record step via 'perf trace record':
|
|
|
|
|
|
+You can now perform the record step via 'perf script record':
|
|
|
|
|
|
- # perf trace record syscall-counts
|
|
|
|
|
|
+ # perf script record syscall-counts
|
|
|
|
|
|
-and display the output using 'perf trace report':
|
|
|
|
|
|
+and display the output using 'perf script report':
|
|
|
|
|
|
- # perf trace report syscall-counts
|
|
|
|
|
|
+ # perf script report syscall-counts
|
|
|
|
|
|
STARTER SCRIPTS
|
|
STARTER SCRIPTS
|
|
---------------
|
|
---------------
|
|
|
|
|
|
You can quickly get started writing a script for a particular set of
|
|
You can quickly get started writing a script for a particular set of
|
|
-trace data by generating a skeleton script using 'perf trace -g
|
|
|
|
|
|
+trace data by generating a skeleton script using 'perf script -g
|
|
python' in the same directory as an existing perf.data trace file.
|
|
python' in the same directory as an existing perf.data trace file.
|
|
That will generate a starter script containing a handler for each of
|
|
That will generate a starter script containing a handler for each of
|
|
the event types in the trace file; it simply prints every available
|
|
the event types in the trace file; it simply prints every available
|
|
@@ -430,13 +430,13 @@ field for each event in the trace file.
|
|
You can also look at the existing scripts in
|
|
You can also look at the existing scripts in
|
|
~/libexec/perf-core/scripts/python for typical examples showing how to
|
|
~/libexec/perf-core/scripts/python for typical examples showing how to
|
|
do basic things like aggregate event data, print results, etc. Also,
|
|
do basic things like aggregate event data, print results, etc. Also,
|
|
-the check-perf-trace.py script, while not interesting for its results,
|
|
|
|
|
|
+the check-perf-script.py script, while not interesting for its results,
|
|
attempts to exercise all of the main scripting features.
|
|
attempts to exercise all of the main scripting features.
|
|
|
|
|
|
EVENT HANDLERS
|
|
EVENT HANDLERS
|
|
--------------
|
|
--------------
|
|
|
|
|
|
-When perf trace is invoked using a trace script, a user-defined
|
|
|
|
|
|
+When perf script is invoked using a trace script, a user-defined
|
|
'handler function' is called for each event in the trace. If there's
|
|
'handler function' is called for each event in the trace. If there's
|
|
no handler function defined for a given event type, the event is
|
|
no handler function defined for a given event type, the event is
|
|
ignored (or passed to a 'trace_handled' function, see below) and the
|
|
ignored (or passed to a 'trace_handled' function, see below) and the
|
|
@@ -510,7 +510,7 @@ write a useful trace script. The sections below cover the rest.
|
|
SCRIPT LAYOUT
|
|
SCRIPT LAYOUT
|
|
-------------
|
|
-------------
|
|
|
|
|
|
-Every perf trace Python script should start by setting up a Python
|
|
|
|
|
|
+Every perf script Python script should start by setting up a Python
|
|
module search path and 'import'ing a few support modules (see module
|
|
module search path and 'import'ing a few support modules (see module
|
|
descriptions below):
|
|
descriptions below):
|
|
|
|
|
|
@@ -519,7 +519,7 @@ descriptions below):
|
|
import sys
|
|
import sys
|
|
|
|
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
|
- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
|
|
|
|
|
+ '/scripts/python/perf-script-Util/lib/Perf/Trace')
|
|
|
|
|
|
from perf_trace_context import *
|
|
from perf_trace_context import *
|
|
from Core import *
|
|
from Core import *
|
|
@@ -559,15 +559,15 @@ def trace_unhandled(event_name, context, common_cpu, common_secs,
|
|
----
|
|
----
|
|
|
|
|
|
The remaining sections provide descriptions of each of the available
|
|
The remaining sections provide descriptions of each of the available
|
|
-built-in perf trace Python modules and their associated functions.
|
|
|
|
|
|
+built-in perf script Python modules and their associated functions.
|
|
|
|
|
|
AVAILABLE MODULES AND FUNCTIONS
|
|
AVAILABLE MODULES AND FUNCTIONS
|
|
-------------------------------
|
|
-------------------------------
|
|
|
|
|
|
The following sections describe the functions and variables available
|
|
The following sections describe the functions and variables available
|
|
-via the various perf trace Python modules. To use the functions and
|
|
|
|
|
|
+via the various perf script Python modules. To use the functions and
|
|
variables from the given module, add the corresponding 'from XXXX
|
|
variables from the given module, add the corresponding 'from XXXX
|
|
-import' line to your perf trace script.
|
|
|
|
|
|
+import' line to your perf script script.
|
|
|
|
|
|
Core.py Module
|
|
Core.py Module
|
|
~~~~~~~~~~~~~~
|
|
~~~~~~~~~~~~~~
|
|
@@ -610,7 +610,7 @@ argument.
|
|
Util.py Module
|
|
Util.py Module
|
|
~~~~~~~~~~~~~~
|
|
~~~~~~~~~~~~~~
|
|
|
|
|
|
-Various utility functions for use with perf trace:
|
|
|
|
|
|
+Various utility functions for use with perf script:
|
|
|
|
|
|
nsecs(secs, nsecs) - returns total nsecs given secs/nsecs pair
|
|
nsecs(secs, nsecs) - returns total nsecs given secs/nsecs pair
|
|
nsecs_secs(nsecs) - returns whole secs portion given nsecs
|
|
nsecs_secs(nsecs) - returns whole secs portion given nsecs
|
|
@@ -620,4 +620,4 @@ Various utility functions for use with perf trace:
|
|
|
|
|
|
SEE ALSO
|
|
SEE ALSO
|
|
--------
|
|
--------
|
|
-linkperf:perf-trace[1]
|
|
|
|
|
|
+linkperf:perf-script[1]
|