blob: cbf50b3e5f0620276556f1c507c3f43e0b3c5124 [file]
perf-script-python(1)
====================
NAME
----
perf-script-python - Process trace data with a Python script using perf module
SYNOPSIS
--------
[verse]
'perf script' <script>.py
DESCRIPTION
-----------
This document describes how to use the `perf` Python module to process
trace data recorded by `perf record`.
With the removal of embedded Python interpreter from `perf`, scripts
are now run as standalone Python programs that import the `perf`
module to access trace data. Symbol configuration options (`--vmlinux`,
`--kallsyms`, and `--symfs`) and `--itrace` options passed to `perf script`
are forwarded via `PERF_SYMBOL_*` and `PERF_ITRACE` environment variables
to `perf.session`, and can also be passed directly to `perf.session`.
Trace filtering command-line
options (`-C`, `-c`, `--pid`, `--tid`, `--time`, `--dlfilter`, `--dlarg`) passed
to `perf script` are not applied to standalone scripts.
A QUICK EXAMPLE
---------------
This section shows how to create a simple Python script that reads a
`perf.data` file and prints event information.
Create a file named `print_events.py` with the following content:
#!/usr/bin/env python3
import perf
def process_event(sample):
print(f"Event: {sample.evsel} on CPU {sample.sample_cpu} at {sample.sample_time}")
# Open the session with perf.data file
session = perf.session(perf.data("perf.data"), sample=process_event)
# Process all events
session.process_events()
Make the script executable:
$ chmod +x print_events.py
Record some data:
$ perf record -a sleep 1
Run the script:
$ perf script print_events.py
Or run it directly with Python, ensuring `perf.so` is in your `PYTHONPATH`:
$ PYTHONPATH=/path/to/perf/python python3 print_events.py
THE PERF MODULE
---------------
The `perf` module provides several classes and functions to interact
with trace data.
Module Functions
~~~~~~~~~~~~~~~~
- `config_get(name)`: Get a perf config value.
- `metrics()`: Returns a list of metrics represented as string values in dictionaries.
- `tracepoint(sys, name)`: Get the tracepoint ID for a given subsystem and event name.
- `parse_events(evlist_str, cpus=None, threads=None)`: Parse a string of events and return an `evlist`.
- `parse_metrics(metrics_str, pmu=None, cpus=None, threads=None)`: Parse a string of metrics or metric groups and return an `evlist`.
- `pmus()`: Returns a sequence of PMUs.
- `syscall_name(id, elf_machine=0)`: Convert a syscall number to its name.
- `syscall_id(name, elf_machine=0)`: Convert a syscall name to its number.
perf.pmu
~~~~~~~~
Represents a Performance Monitoring Unit.
- `events()`: Returns a sequence of events encoded as dictionaries.
- `name()`: Name of the PMU including suffixes.
perf.evlist
~~~~~~~~~~~
Represents a list of event selectors.
- `all_cpus()`: CPU map union of all evsel CPU maps.
- `metrics()`: List of metric names within the evlist.
- `compute_metric(name, cpu, thread)`: Compute metric for given name, cpu and thread.
- `mmap(pages=128, overwrite=False)`: mmap the file descriptor table.
- `open()`: open the file descriptors.
- `close()`: close the file descriptors.
- `poll(timeout=-1)`: poll the file descriptor table.
- `get_pollfd()`: get the poll file descriptor table.
- `add(evsel)`: adds an event selector to the list.
- `read_on_cpu(cpu, sample_id_all=True)`: reads an event from the specified CPU ring buffer.
- `config()`: Apply default record options to the evlist.
- `disable()`: Disable the evsels in the evlist.
- `enable()`: Enable the evsels in the evlist.
perf.evsel
~~~~~~~~~~
Represents an event selector.
- `open()`: open the event selector file descriptor table.
- `cpus()`: CPUs the event is to be used with.
- `threads()`: threads the event is to be used with.
- `read(cpu, thread)`: read counters. Returns a count object with `val`, `ena`, and `run` attributes.
perf.session
~~~~~~~~~~~~
Manages a trace session.
- `__init__(data, sample=None, stat=None, context_switch=None, call_return=None, itrace=None, vmlinux=None, kallsyms=None, symfs=None)`: Creates a new session. `data` is a `perf.data` object. `sample` is a callback function called for each sample event. `vmlinux`, `kallsyms`, and `symfs` configure symbol resolution paths.
- `process_events()`: Reads the trace data and calls the sample callback for each event.
- `find_thread(pid, tid=-1)`: Returns the thread associated with a PID/TID.
- `e_machine`: ELF machine architecture ID (`EM_*`) of the session.
- `is_64_bit`: Boolean indicating whether the traced session is 64-bit.
perf.data
~~~~~~~~~
Represents a trace file.
- `__init__(path=None, fd=-1)`: Opens a trace file.
Sample Object
~~~~~~~~~~~~~
Passed to the `sample` callback function in `perf.session` (or returned by `evlist.read_on_cpu()`).
- `evsel`: The event selector (`perf.evsel` object; `str(sample.evsel)` gives the event name).
- `sample_cpu`: The CPU on which the event occurred.
- `sample_time`: The timestamp of the event in nanoseconds.
- `sample_pid`: The PID of the process.
- `sample_tid`: The TID of the thread.
- `sample_ip`: The sampled instruction pointer.
- `sample_addr`: The sampled target/data address.
- `sample_period`: The sample period.
- `machine_pid`: The guest VM machine PID (`0` for host).
- `vcpu`: The virtual CPU number for guest events.
- `raw_buf`: Raw buffer (`bytes`) containing event-specific data.
- `dso`: Short name of the resolved DSO for `sample_ip`.
- `dso_long_name`: Full path/long name of the resolved DSO for `sample_ip`.
- `dso_bid`: Build ID of the resolved DSO.
- `symbol`: Resolved symbol name for `sample_ip`.
- `sym_start`: Start address of the resolved symbol.
- `sym_end`: End address of the resolved symbol.
- `sym_offset`: Offset of `sample_ip` within the resolved symbol (or `None` if unresolved).
- `addr_dso`: Resolved DSO name for `sample_addr` (or `None`).
- `addr_symbol`: Resolved symbol name for `sample_addr` (or `None`).
- `addr_sym_offset`: Offset of `sample_addr` within `addr_symbol` (or `None`).
- `branch_type`: Branch type flags (`PERF_IP_FLAG_*` masked with `PERF_BRANCH_MASK`).
- `in_tx`: `1` if the sample occurred inside a hardware transaction, else `0`.
- `flags`: Raw sample flags (`PERF_IP_FLAG_*`).
- `transaction`: Transaction abort/status code.
- `brstack`: Sequence of branch stack entries (`from_ip`, `to_ip`, `mispred`, `predicted`, `in_tx`, `abort`, `cycles`, `type`), or `None`.
- `callchain`: Sequence of callchain nodes (`ip`, `symbol`, `dso`), or `None`.
- `srccode(addr=sample_ip)`: Returns a `(filename, line_number, srcline)` tuple for `addr` (defaults to `sample_ip`), or `None`.
- `insn()`: Returns the raw instruction `bytes` for the sample, or `None`.
- Dynamic tracepoint fields: For tracepoint events (`PERF_TYPE_TRACEPOINT`), tracepoint format fields can be accessed directly as attributes on the sample object (e.g. `sample.prev_pid`, `sample.id`, `sample.common_flags`).
COUNTER AND METRIC APIS
-----------------------
The following APIs are used in `tools/perf/python/ilist.py` for
interactive listing and reading of counters and metrics:
- `perf.pmus()`: Used to get all available PMUs.
- `pmu.events()`: Used to get all events for a specific PMU.
- `perf.metrics()`: Used to get all available metrics.
- `perf.parse_metrics(metric_name, pmu)`: Used to parse a metric and get an `evlist`.
- `evlist.compute_metric(metric_name, cpu, thread)`: Used to compute a metric value for a specific CPU and thread.
- `evsel.read(cpu, thread)`: Used to read raw counter values.
SEE ALSO
--------
linkperf:perf-script[1]