PERF-SCRIPT-PYTHON(1) perf Manual PERF-SCRIPT-PYTHON(1) (NAME) perf-script-python - Python (SYNOPSIS) perf script [-s [Python]:script[.py] ] (DESCRIPTION) perf script perf script Python perf . (trace) Python . (A QUICK EXAMPLE) Python perf script . . syscall-counts perf script perf script -l . perf script . syscall-counts . ( syscall ): .ft C syscall events: event count ---------------------------------------- ----------- sys_write 455067 sys_getdents 4072 sys_close 3037 sys_swapoff 1769 sys_read 923 sys_sched_setparam 826 sys_open 331 sys_newfstat 326 sys_mmap 217 sys_munmap 216 sys_futex 141 sys_select 102 sys_poll 84 sys_setitimer 12 sys_writev 8 15 8 sys_lseek 7 sys_rt_sigprocmask 6 sys_wait4 3 sys_ioctl 3 sys_set_robust_list 1 sys_exit 1 56 1 sys_access 1 .ft syscall . . : o tracing/events/syscalls (syscall) perf . syscall syscall . o syscall sys_enter / sys_exit tracing/events/raw_syscalls . id syscall . syscall (enter) perf record sys_enter : .ft C # perf record -a -e raw_syscalls:sys_enter ^C[ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 56.545 MB perf.data (~2470503 samples) ] .ft syscall (system-wide) (per-cpu) (multiplex) . perf.data . perf.data -g perf script Python (callback handler) perf.data ( STARTER SCRIPTS ). .ft C # perf script -g python generated Python script: perf-script.py The output file created also in the current directory is named perf-script.py. Here's the file in its entirety: # perf script event handlers, generated by perf script -g python # Licensed under the terms of the GNU GPL License version 2 # The common_* event handler fields are the most useful fields common to # all events. They don't necessarily correspond to the 'common_*' fields # in the format files. Those fields not available as handler params can # be retrieved using Python functions of the form common_*(context). # See the perf-script-python Documentation for the list of available functions. import os import sys sys.path.append(os.environ['PERF_EXEC_PATH'] + \ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') from perf_trace_context import * from Core import * def trace_begin(): print "in trace_begin" def trace_end(): print "in trace_end" def raw_syscalls__sys_enter(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, id, args): print_header(event_name, common_cpu, common_secs, common_nsecs, common_pid, common_comm) print "id=%d, args=%s\n" % \ (id, args), def trace_unhandled(event_name, context, event_fields_dict): print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) def print_header(event_name, cpu, secs, nsecs, pid, comm): print "%-20s %5u %05u.%09u %8u %-20s " % \ (event_name, cpu, secs, nsecs, pid, comm), .ft () import (path append) perf script . trace_begin() trace_end() ( SCRIPT_LAYOUT ). event handler perf record . (handler) subsystem__event_name raw_syscalls__sys_enter(). ( EVENT HANDLERS ). . trace_unhandled() perf.data . (trace) . -g stdout . print_header() . : .ft C # 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.847595764 7506 perf id=1, args= raw_syscalls__sys_enter 1 00840.847620860 7506 perf id=1, args= raw_syscalls__sys_enter 1 00840.847710478 6533 npviewer.bin id=78, args= raw_syscalls__sys_enter 1 00840.847719204 6533 npviewer.bin id=142, args= raw_syscalls__sys_enter 1 00840.847755445 6533 npviewer.bin id=3, args= raw_syscalls__sys_enter 1 00840.847775601 6533 npviewer.bin id=3, args= raw_syscalls__sys_enter 1 00840.847781820 6533 npviewer.bin id=3, args= . . . .ft . trace_begin() trace_unhandled() . : .ft C import os import sys sys.path.append(os.environ['PERF_EXEC_PATH'] + \ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') from perf_trace_context import * from Core import * def trace_end(): print "in trace_end" def raw_syscalls__sys_enter(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, id, args): .ft trace_end() . sys_enter() . (hash table) syscall id sys_enter() syscall id : .ft C syscalls = autodict() try: syscalls[id] += 1 except TypeError: syscalls[id] = 1 .ft autodict syscalls ( Core.py) autovivifying Perl (autovivifying) syscalls[comm][pid][id] = 1 1 id ( TypeError . ). raw_syscalls__sys_enter() syscall id . print_syscall_totals() (syscall) ( syscall id Util syscall_name() ). print_syscall_totals() trace_end() . ( syscall_name() id ): .ft C import os import sys sys.path.append(os.environ['PERF_EXEC_PATH'] + \ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') from perf_trace_context import * from Core import * from Util import * syscalls = autodict() def trace_end(): print_syscall_totals() def raw_syscalls__sys_enter(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, id, args): try: syscalls[id] += 1 except TypeError: syscalls[id] = 1 def print_syscall_totals(): if for_comm is not None: print "\nsyscall events for %s:\n\n" % (for_comm), else: print "\nsyscall events:\n\n", print "%-40s %10s\n" % ("event", "count"), print "%-40s %10s\n" % ("----------------------------------------", \ "-----------"), for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ reverse = True): print "%-40s %10d\n" % (syscall_name(id), val), .ft : # perf script -s syscall-counts.py . (tracepoint) - perf list /sys/kernel/tracing/events/ () perf record perf script -g python . . perf script -l : .ft C # perf script -l List of available trace scripts: wakeup-latency system-wide min/max/avg wakeup latency rw-by-file r/w activity for a program, by file rw-by-pid system-wide r/w activity .ft perf record ..sp built-in reporting. record -record . perf/scripts/python/bin . perf record : .ft C # cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-record #!/bin/bash perf record -a -e raw_syscalls:sys_enter .ft report -report . perf/scripts/python/bin . perf script -s : .ft C # cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-report #!/bin/bash # description: system-wide syscall counts perf script -s ~/libexec/perf-core/scripts/python/syscall-counts.py .ft Python libexec/perf-core/scripts/python - perf make install . perf/scripts/python : .ft C # ls -al kernel-source/tools/perf/scripts/python 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:29 .. 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-script.py drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 Perf-Trace-Util -rw-r--r-- 1 trz trz 1462 2010-01-26 22:30 syscall-counts.py .ft ( make install ) perf script -l : .ft C # perf script -l List of available trace scripts: wakeup-latency system-wide min/max/avg wakeup latency rw-by-file r/w activity for a program, by file rw-by-pid system-wide r/w activity syscall-counts system-wide syscall counts .ft perf script record : # perf script record syscall-counts perf script report : # perf script report syscall-counts perf script -g python perf.data (trace) . (handler) . ~/libexec/perf-core/scripts/python . check-perf-script.py . (EVENT HANDLERS) perf script handler function ( ) . ( trace_unhandled ) . - perf ( ). perf record sched_wakeup : # perf record -a -e sched:sched_wakeup : -a . (format) sched_wakeup ( /sys/kernel/tracing/events/sched/sched_wakeup/format ): .ft C format: field:unsigned short common_type; field:unsigned char common_flags; field:unsigned char common_preempt_count; field:int common_pid; field:char comm[TASK_COMM_LEN]; field:pid_t pid; field:int prio; field:int success; field:int target_cpu; .ft : .ft C def sched__sched_wakeup(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, comm, pid, prio, success, target_cpu): pass .ft subsystem__event_name . common_* common_* (synthesized) common_* . : event_name context 'cookie' perf common_cpu (cpu) common_secs common_nsecs common_pid pid common_comm . . ..SH " (SCRIPT LAYOUT)" perf script 'import' ( ): .ft C import os import sys sys.path.append(os.environ['PERF_EXEC_PATH'] + \ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') from perf_trace_context import * from Core import * .ft (handler) . : trace_begin : .ft C def trace_begin(): pass .ft trace_end : .ft C def trace_end(): pass .ft trace_unhandled . : .ft C def trace_unhandled(event_name, context, event_fields_dict): pass .ft process_event tracepoint .ft C def process_event(param_dict): pass .ft context_switch (context switch) .ft C def context_switch(ts, cpu, pid, tid, np_pid, np_tid, machine_pid, out, out_preempt, *x): pass .ft auxtrace_error AUX .ft C def auxtrace_error(typ, code, cpu, pid, tid, ip, ts, msg, cpumode, *x): pass .ft perf script ..SH " (AVAILABLE MODULES AND FUNCTIONS)" perf script . from XXXX import perf script . Core.py . flag_str symbol_str . print fmt : flag_str(event_name, field_name, field_value) - field_value field_name event_name symbol_str(event_name, field_name, field_value) - field_value field_name event_name autodict autovivifying () . autodict() - (autovivifying) perf_trace_context common . perf_trace_context (context) . context context tracepoint . tracepoint context perf_trace_context.perf_script_context . common_pc(context) - common_preempt count common_flags(context) - common_flags common_lock_depth(context) - common_lock_depth perf_sample_insn(context) - perf_set_itrace_options(context, itrace_options) - --itrace perf_sample_srcline(context) - source_file_name, line_number perf_sample_srccode(context) - source_file_name, line_number, source_line perf_config_get(config_name) - None Util.py perf script: nsecs(secs, nsecs) - secs/nsecs nsecs_secs(nsecs) - nsecs nsecs_nsecs(nsecs) - nsecs nsecs_str(nsecs) - secs.nsecs avg(total, n) - (SUPPORTED FIELDS) : ev_name, comm, id, stream_id, pid, tid, cpu, ip, time, period, phys_addr, addr, symbol, symoff, dso, time_enabled, time_running, values, callchain, brstack, brstacksym, datasrc, datasrc_decode, iregs, uregs, weight, transaction, raw_buf, attr, cpumode. : flags - flags_disp - insn_cnt - (IPC) cyc_cnt - IPC addr_correlates_sym - addr addr_dso - dso addr addr_symbol - addr addr_symoff - addr : brstack: from, to, from_dsoname, to_dsoname, mispred, predicted, in_tx, abort, cycles. brstacksym: : from, to, pred, in_tx, abort ( ) "from" "to" "cycles" brstack . if brstack in dict: for entry in dict[brstack]: print "from %s, to %s, cycles %s" % (entry["from"], entry["to"], entry["cycles"]).SH " (SEE ALSO)" perf-script(1) perf 09/04/2026 PERF-SCRIPT-PYTHON(1)