| perf-report(1) |
| ============== |
| |
| NAME |
| ---- |
| perf-report - Read perf.data (created by perf record) and display the profile |
| |
| SYNOPSIS |
| -------- |
| [verse] |
| 'perf report' [-i <file> | --input=file] |
| |
| DESCRIPTION |
| ----------- |
| This command displays the performance counter profile information recorded |
| via perf record. |
| |
| OPTIONS |
| ------- |
| -i:: |
| --input=:: |
| Input file name. (default: perf.data unless stdin is a fifo) |
| |
| -v:: |
| --verbose:: |
| Be more verbose. (show symbol address, etc) |
| |
| -q:: |
| --quiet:: |
| Do not show any warnings or messages. (Suppress -v) |
| |
| -n:: |
| --show-nr-samples:: |
| Show the number of samples for each symbol |
| |
| --show-cpu-utilization:: |
| Show sample percentage for different cpu modes. |
| |
| -T:: |
| --threads:: |
| Show per-thread event counters. The input data file should be recorded |
| with -s option. |
| -c:: |
| --comms=:: |
| Only consider symbols in these comms. CSV that understands |
| file://filename entries. This option will affect the percentage of |
| the overhead column. See --percentage for more info. |
| --pid=:: |
| Only show events for given process ID (comma separated list). |
| |
| --tid=:: |
| Only show events for given thread ID (comma separated list). |
| -d:: |
| --dsos=:: |
| Only consider symbols in these dsos. CSV that understands |
| file://filename entries. This option will affect the percentage of |
| the overhead column. See --percentage for more info. |
| -S:: |
| --symbols=:: |
| Only consider these symbols. CSV that understands |
| file://filename entries. This option will affect the percentage of |
| the overhead column. See --percentage for more info. |
| |
| --symbol-filter=:: |
| Only show symbols that match (partially) with this filter. |
| |
| -U:: |
| --hide-unresolved:: |
| Only display entries resolved to a symbol. |
| |
| -s:: |
| --sort=:: |
| Sort histogram entries by given key(s) - multiple keys can be specified |
| in CSV format. Following sort keys are available: |
| pid, comm, dso, symbol, parent, cpu, socket, srcline, weight, |
| local_weight, cgroup_id, addr. |
| |
| Each key has following meaning: |
| |
| - comm: command (name) of the task which can be read via /proc/<pid>/comm |
| - pid: command and tid of the task |
| - dso: name of library or module executed at the time of sample |
| - dso_size: size of library or module executed at the time of sample |
| - symbol: name of function executed at the time of sample |
| - symbol_size: size of function executed at the time of sample |
| - parent: name of function matched to the parent regex filter. Unmatched |
| entries are displayed as "[other]". |
| - cpu: cpu number the task ran at the time of sample |
| - socket: processor socket number the task ran at the time of sample |
| - srcline: filename and line number executed at the time of sample. The |
| DWARF debugging info must be provided. |
| - srcfile: file name of the source file of the samples. Requires dwarf |
| information. |
| - weight: Event specific weight, e.g. memory latency or transaction |
| abort cost. This is the global weight. |
| - local_weight: Local weight version of the weight above. |
| - cgroup_id: ID derived from cgroup namespace device and inode numbers. |
| - cgroup: cgroup pathname in the cgroupfs. |
| - transaction: Transaction abort flags. |
| - overhead: Overhead percentage of sample |
| - overhead_sys: Overhead percentage of sample running in system mode |
| - overhead_us: Overhead percentage of sample running in user mode |
| - overhead_guest_sys: Overhead percentage of sample running in system mode |
| on guest machine |
| - overhead_guest_us: Overhead percentage of sample running in user mode on |
| guest machine |
| - sample: Number of sample |
| - period: Raw number of event count of sample |
| - time: Separate the samples by time stamp with the resolution specified by |
| --time-quantum (default 100ms). Specify with overhead and before it. |
| - code_page_size: the code page size of sampled code address (ip) |
| - ins_lat: Instruction latency in core cycles. This is the global instruction |
| latency |
| - local_ins_lat: Local instruction latency version |
| - p_stage_cyc: On powerpc, this presents the number of cycles spent in a |
| pipeline stage. And currently supported only on powerpc. |
| - addr: (Full) virtual address of the sampled instruction |
| - retire_lat: On X86, this reports pipeline stall of this instruction compared |
| to the previous instruction in cycles. And currently supported only on X86 |
| - simd: Flags describing a SIMD operation. "e" for empty Arm SVE predicate. "p" for partial Arm SVE predicate |
| - type: Data type of sample memory access. |
| - typeoff: Offset in the data type of sample memory access. |
| - symoff: Offset in the symbol. |
| |
| By default, comm, dso and symbol keys are used. |
| (i.e. --sort comm,dso,symbol) |
| |
| If --branch-stack option is used, following sort keys are also |
| available: |
| |
| - dso_from: name of library or module branched from |
| - dso_to: name of library or module branched to |
| - symbol_from: name of function branched from |
| - symbol_to: name of function branched to |
| - srcline_from: source file and line branched from |
| - srcline_to: source file and line branched to |
| - mispredict: "N" for predicted branch, "Y" for mispredicted branch |
| - in_tx: branch in TSX transaction |
| - abort: TSX transaction abort. |
| - cycles: Cycles in basic block |
| |
| And default sort keys are changed to comm, dso_from, symbol_from, dso_to |
| and symbol_to, see '--branch-stack'. |
| |
| When the sort key symbol is specified, columns "IPC" and "IPC Coverage" |
| are enabled automatically. Column "IPC" reports the average IPC per function |
| and column "IPC coverage" reports the percentage of instructions with |
| sampled IPC in this function. IPC means Instruction Per Cycle. If it's low, |
| it indicates there may be a performance bottleneck when the function is |
| executed, such as a memory access bottleneck. If a function has high overhead |
| and low IPC, it's worth further analyzing it to optimize its performance. |
| |
| If the --mem-mode option is used, the following sort keys are also available |
| (incompatible with --branch-stack): |
| symbol_daddr, dso_daddr, locked, tlb, mem, snoop, dcacheline, blocked. |
| |
| - symbol_daddr: name of data symbol being executed on at the time of sample |
| - dso_daddr: name of library or module containing the data being executed |
| on at the time of the sample |
| - locked: whether the bus was locked at the time of the sample |
| - tlb: type of tlb access for the data at the time of the sample |
| - mem: type of memory access for the data at the time of the sample |
| - snoop: type of snoop (if any) for the data at the time of the sample |
| - dcacheline: the cacheline the data address is on at the time of the sample |
| - phys_daddr: physical address of data being executed on at the time of sample |
| - data_page_size: the data page size of data being executed on at the time of sample |
| - blocked: reason of blocked load access for the data at the time of the sample |
| |
| And the default sort keys are changed to local_weight, mem, sym, dso, |
| symbol_daddr, dso_daddr, snoop, tlb, locked, blocked, local_ins_lat, |
| see '--mem-mode'. |
| |
| If the data file has tracepoint event(s), following (dynamic) sort keys |
| are also available: |
| trace, trace_fields, [<event>.]<field>[/raw] |
| |
| - trace: pretty printed trace output in a single column |
| - trace_fields: fields in tracepoints in separate columns |
| - <field name>: optional event and field name for a specific field |
| |
| The last form consists of event and field names. If event name is |
| omitted, it searches all events for matching field name. The matched |
| field will be shown only for the event has the field. The event name |
| supports substring match so user doesn't need to specify full subsystem |
| and event name everytime. For example, 'sched:sched_switch' event can |
| be shortened to 'switch' as long as it's not ambiguous. Also event can |
| be specified by its index (starting from 1) preceded by the '%'. |
| So '%1' is the first event, '%2' is the second, and so on. |
| |
| The field name can have '/raw' suffix which disables pretty printing |
| and shows raw field value like hex numbers. The --raw-trace option |
| has the same effect for all dynamic sort keys. |
| |
| The default sort keys are changed to 'trace' if all events in the data |
| file are tracepoint. |
| |
| -F:: |
| --fields=:: |
| Specify output field - multiple keys can be specified in CSV format. |
| Following fields are available: |
| overhead, overhead_sys, overhead_us, overhead_children, sample and period. |
| Also it can contain any sort key(s). |
| |
| By default, every sort keys not specified in -F will be appended |
| automatically. |
| |
| If the keys starts with a prefix '+', then it will append the specified |
| field(s) to the default field order. For example: perf report -F +period,sample. |
| |
| -p:: |
| --parent=<regex>:: |
| A regex filter to identify parent. The parent is a caller of this |
| function and searched through the callchain, thus it requires callchain |
| information recorded. The pattern is in the extended regex format and |
| defaults to "\^sys_|^do_page_fault", see '--sort parent'. |
| |
| -x:: |
| --exclude-other:: |
| Only display entries with parent-match. |
| |
| -w:: |
| --column-widths=<width[,width...]>:: |
| Force each column width to the provided list, for large terminal |
| readability. 0 means no limit (default behavior). |
| |
| -t:: |
| --field-separator=:: |
| Use a special separator character and don't pad with spaces, replacing |
| all occurrences of this separator in symbol names (and other output) |
| with a '.' character, that thus it's the only non valid separator. |
| |
| -D:: |
| --dump-raw-trace:: |
| Dump raw trace in ASCII. |
| |
| --disable-order:: |
| Disable raw trace ordering. |
| |
| -g:: |
| --call-graph=<print_type,threshold[,print_limit],order,sort_key[,branch],value>:: |
| Display call chains using type, min percent threshold, print limit, |
| call order, sort key, optional branch and value. Note that ordering |
| is not fixed so any parameter can be given in an arbitrary order. |
| One exception is the print_limit which should be preceded by threshold. |
| |
| print_type can be either: |
| - flat: single column, linear exposure of call chains. |
| - graph: use a graph tree, displaying absolute overhead rates. (default) |
| - fractal: like graph, but displays relative rates. Each branch of |
| the tree is considered as a new profiled object. |
| - folded: call chains are displayed in a line, separated by semicolons |
| - none: disable call chain display. |
| |
| threshold is a percentage value which specifies a minimum percent to be |
| included in the output call graph. Default is 0.5 (%). |
| |
| print_limit is only applied when stdio interface is used. It's to limit |
| number of call graph entries in a single hist entry. Note that it needs |
| to be given after threshold (but not necessarily consecutive). |
| Default is 0 (unlimited). |
| |
| order can be either: |
| - callee: callee based call graph. |
| - caller: inverted caller based call graph. |
| Default is 'caller' when --children is used, otherwise 'callee'. |
| |
| sort_key can be: |
| - function: compare on functions (default) |
| - address: compare on individual code addresses |
| - srcline: compare on source filename and line number |
| |
| branch can be: |
| - branch: include last branch information in callgraph when available. |
| Usually more convenient to use --branch-history for this. |
| |
| value can be: |
| - percent: display overhead percent (default) |
| - period: display event period |
| - count: display event count |
| |
| --children:: |
| Accumulate callchain of children to parent entry so that then can |
| show up in the output. The output will have a new "Children" column |
| and will be sorted on the data. It requires callchains are recorded. |
| See the `overhead calculation' section for more details. Enabled by |
| default, disable with --no-children. |
| |
| --max-stack:: |
| Set the stack depth limit when parsing the callchain, anything |
| beyond the specified depth will be ignored. This is a trade-off |
| between information loss and faster processing especially for |
| workloads that can have a very long callchain stack. |
| Note that when using the --itrace option the synthesized callchain size |
| will override this value if the synthesized callchain size is bigger. |
| |
| Default: 127 |
| |
| -G:: |
| --inverted:: |
| alias for inverted caller based call graph. |
| |
| --ignore-callees=<regex>:: |
| Ignore callees of the function(s) matching the given regex. |
| This has the effect of collecting the callers of each such |
| function into one place in the call-graph tree. |
| |
| --pretty=<key>:: |
| Pretty printing style. key: normal, raw |
| |
| --stdio:: Use the stdio interface. |
| |
| --stdio-color:: |
| 'always', 'never' or 'auto', allowing configuring color output |
| via the command line, in addition to via "color.ui" .perfconfig. |
| Use '--stdio-color always' to generate color even when redirecting |
| to a pipe or file. Using just '--stdio-color' is equivalent to |
| using 'always'. |
| |
| --tui:: Use the TUI interface, that is integrated with annotate and allows |
| zooming into DSOs or threads, among other features. Use of --tui |
| requires a tty, if one is not present, as when piping to other |
| commands, the stdio interface is used. |
| |
| --gtk:: Use the GTK2 interface. |
| |
| -k:: |
| --vmlinux=<file>:: |
| vmlinux pathname |
| |
| --ignore-vmlinux:: |
| Ignore vmlinux files. |
| |
| --kallsyms=<file>:: |
| kallsyms pathname |
| |
| -m:: |
| --modules:: |
| Load module symbols. WARNING: This should only be used with -k and |
| a LIVE kernel. |
| |
| -f:: |
| --force:: |
| Don't do ownership validation. |
| |
| --symfs=<directory>:: |
| Look for files with symbols relative to this directory. |
| |
| -C:: |
| --cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can |
| be provided as a comma-separated list with no space: 0,1. Ranges of |
| CPUs are specified with -: 0-2. Default is to report samples on all |
| CPUs. |
| |
| -M:: |
| --disassembler-style=:: Set disassembler style for objdump. |
| |
| --source:: |
| Interleave source code with assembly code. Enabled by default, |
| disable with --no-source. |
| |
| --asm-raw:: |
| Show raw instruction encoding of assembly instructions. |
| |
| --show-total-period:: Show a column with the sum of periods. |
| |
| -I:: |
| --show-info:: |
| Display extended information about the perf.data file. This adds |
| information which may be very large and thus may clutter the display. |
| It currently includes: cpu and numa topology of the host system. |
| |
| -b:: |
| --branch-stack:: |
| Use the addresses of sampled taken branches instead of the instruction |
| address to build the histograms. To generate meaningful output, the |
| perf.data file must have been obtained using perf record -b or |
| perf record --branch-filter xxx where xxx is a branch filter option. |
| perf report is able to auto-detect whether a perf.data file contains |
| branch stacks and it will automatically switch to the branch view mode, |
| unless --no-branch-stack is used. |
| |
| --branch-history:: |
| Add the addresses of sampled taken branches to the callstack. |
| This allows to examine the path the program took to each sample. |
| The data collection must have used -b (or -j) and -g. |
| |
| --addr2line=<path>:: |
| Path to addr2line binary. |
| |
| --objdump=<path>:: |
| Path to objdump binary. |
| |
| --prefix=PREFIX:: |
| --prefix-strip=N:: |
| Remove first N entries from source file path names in executables |
| and add PREFIX. This allows to display source code compiled on systems |
| with different file system layout. |
| |
| --group:: |
| Show event group information together. It forces group output also |
| if there are no groups defined in data file. |
| |
| --group-sort-idx:: |
| Sort the output by the event at the index n in group. If n is invalid, |
| sort by the first event. It can support multiple groups with different |
| amount of events. WARNING: This should be used on grouped events. |
| |
| --demangle:: |
| Demangle symbol names to human readable form. It's enabled by default, |
| disable with --no-demangle. |
| |
| --demangle-kernel:: |
| Demangle kernel symbol names to human readable form (for C++ kernels). |
| |
| --mem-mode:: |
| Use the data addresses of samples in addition to instruction addresses |
| to build the histograms. To generate meaningful output, the perf.data |
| file must have been obtained using perf record -d -W and using a |
| special event -e cpu/mem-loads/p or -e cpu/mem-stores/p. See |
| 'perf mem' for simpler access. |
| |
| --percent-limit:: |
| Do not show entries which have an overhead under that percent. |
| (Default: 0). Note that this option also sets the percent limit (threshold) |
| of callchains. However the default value of callchain threshold is |
| different than the default value of hist entries. Please see the |
| --call-graph option for details. |
| |
| --percentage:: |
| Determine how to display the overhead percentage of filtered entries. |
| Filters can be applied by --comms, --dsos and/or --symbols options and |
| Zoom operations on the TUI (thread, dso, etc). |
| |
| "relative" means it's relative to filtered entries only so that the |
| sum of shown entries will be always 100%. "absolute" means it retains |
| the original value before and after the filter is applied. |
| |
| --header:: |
| Show header information in the perf.data file. This includes |
| various information like hostname, OS and perf version, cpu/mem |
| info, perf command line, event list and so on. Currently only |
| --stdio output supports this feature. |
| |
| --header-only:: |
| Show only perf.data header (forces --stdio). |
| |
| --time:: |
| Only analyze samples within given time window: <start>,<stop>. Times |
| have the format seconds.nanoseconds. If start is not given (i.e. time |
| string is ',x.y') then analysis starts at the beginning of the file. If |
| stop time is not given (i.e. time string is 'x.y,') then analysis goes |
| to end of file. Multiple ranges can be separated by spaces, which |
| requires the argument to be quoted e.g. --time "1234.567,1234.789 1235," |
| |
| Also support time percent with multiple time ranges. Time string is |
| 'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'. |
| |
| For example: |
| Select the second 10% time slice: |
| |
| perf report --time 10%/2 |
| |
| Select from 0% to 10% time slice: |
| |
| perf report --time 0%-10% |
| |
| Select the first and second 10% time slices: |
| |
| perf report --time 10%/1,10%/2 |
| |
| Select from 0% to 10% and 30% to 40% slices: |
| |
| perf report --time 0%-10%,30%-40% |
| |
| --switch-on EVENT_NAME:: |
| Only consider events after this event is found. |
| |
| This may be interesting to measure a workload only after some initialization |
| phase is over, i.e. insert a perf probe at that point and then using this |
| option with that probe. |
| |
| --switch-off EVENT_NAME:: |
| Stop considering events after this event is found. |
| |
| --show-on-off-events:: |
| Show the --switch-on/off events too. This has no effect in 'perf report' now |
| but probably we'll make the default not to show the switch-on/off events |
| on the --group mode and if there is only one event besides the off/on ones, |
| go straight to the histogram browser, just like 'perf report' with no events |
| explicitly specified does. |
| |
| --itrace:: |
| Options for decoding instruction tracing data. The options are: |
| |
| include::itrace.txt[] |
| |
| To disable decoding entirely, use --no-itrace. |
| |
| --full-source-path:: |
| Show the full path for source files for srcline output. |
| |
| --show-ref-call-graph:: |
| When multiple events are sampled, it may not be needed to collect |
| callgraphs for all of them. The sample sites are usually nearby, |
| and it's enough to collect the callgraphs on a reference event. |
| So user can use "call-graph=no" event modifier to disable callgraph |
| for other events to reduce the overhead. |
| However, perf report cannot show callgraphs for the event which |
| disable the callgraph. |
| This option extends the perf report to show reference callgraphs, |
| which collected by reference event, in no callgraph event. |
| |
| --stitch-lbr:: |
| Show callgraph with stitched LBRs, which may have more complete |
| callgraph. The perf.data file must have been obtained using |
| perf record --call-graph lbr. |
| Disabled by default. In common cases with call stack overflows, |
| it can recreate better call stacks than the default lbr call stack |
| output. But this approach is not foolproof. There can be cases |
| where it creates incorrect call stacks from incorrect matches. |
| The known limitations include exception handing such as |
| setjmp/longjmp will have calls/returns not match. |
| |
| --socket-filter:: |
| Only report the samples on the processor socket that match with this filter |
| |
| --samples=N:: |
| Save N individual samples for each histogram entry to show context in perf |
| report tui browser. |
| |
| --raw-trace:: |
| When displaying traceevent output, do not use print fmt or plugins. |
| |
| -H:: |
| --hierarchy:: |
| Enable hierarchical output. In the hierarchy mode, each sort key groups |
| samples based on the criteria and then sub-divide it using the lower |
| level sort key. |
| |
| For example: |
| In normal output: |
| |
| perf report -s dso,sym |
| # Overhead Shared Object Symbol |
| 50.00% [kernel.kallsyms] [k] kfunc1 |
| 20.00% perf [.] foo |
| 15.00% [kernel.kallsyms] [k] kfunc2 |
| 10.00% perf [.] bar |
| 5.00% libc.so [.] libcall |
| |
| In hierarchy output: |
| |
| perf report -s dso,sym --hierarchy |
| # Overhead Shared Object / Symbol |
| 65.00% [kernel.kallsyms] |
| 50.00% [k] kfunc1 |
| 15.00% [k] kfunc2 |
| 30.00% perf |
| 20.00% [.] foo |
| 10.00% [.] bar |
| 5.00% libc.so |
| 5.00% [.] libcall |
| |
| --inline:: |
| If a callgraph address belongs to an inlined function, the inline stack |
| will be printed. Each entry is function name or file/line. Enabled by |
| default, disable with --no-inline. |
| |
| --mmaps:: |
| Show --tasks output plus mmap information in a format similar to |
| /proc/<PID>/maps. |
| |
| Please note that not all mmaps are stored, options affecting which ones |
| are include 'perf record --data', for instance. |
| |
| --ns:: |
| Show time stamps in nanoseconds. |
| |
| --stats:: |
| Display overall events statistics without any further processing. |
| (like the one at the end of the perf report -D command) |
| |
| --tasks:: |
| Display monitored tasks stored in perf data. Displaying pid/tid/ppid |
| plus the command string aligned to distinguish parent and child tasks. |
| |
| --percent-type:: |
| Set annotation percent type from following choices: |
| global-period, local-period, global-hits, local-hits |
| |
| The local/global keywords set if the percentage is computed |
| in the scope of the function (local) or the whole data (global). |
| The period/hits keywords set the base the percentage is computed |
| on - the samples period or the number of samples (hits). |
| |
| --time-quantum:: |
| Configure time quantum for time sort key. Default 100ms. |
| Accepts s, us, ms, ns units. |
| |
| --total-cycles:: |
| When --total-cycles is specified, it supports sorting for all blocks by |
| 'Sampled Cycles%'. This is useful to concentrate on the globally hottest |
| blocks. In output, there are some new columns: |
| |
| 'Sampled Cycles%' - block sampled cycles aggregation / total sampled cycles |
| 'Sampled Cycles' - block sampled cycles aggregation |
| 'Avg Cycles%' - block average sampled cycles / sum of total block average |
| sampled cycles |
| 'Avg Cycles' - block average sampled cycles |
| |
| --skip-empty:: |
| Do not print 0 results in the --stat output. |
| |
| include::callchain-overhead-calculation.txt[] |
| |
| SEE ALSO |
| -------- |
| linkperf:perf-stat[1], linkperf:perf-annotate[1], linkperf:perf-record[1], |
| linkperf:perf-intel-pt[1] |