![Stanislav Fomichev](/assets/img/avatar_default.png)
Currently, we may either trace syscalls or syscalls+pagefaults. We'd like to be able to trace *only* pagefaults and this commit implements this feature. Example: [root@zoo /]# echo 1 > /proc/sys/vm/drop_caches ; trace --no-syscalls -F -p `pidof xchat` 0.000 ( 0.000 ms): xchat/4574 majfault [g_unichar_get_script+0x11] => /usr/lib64/libglib-2.0.so.0.3800.2@0xc403b (x.) 0.202 ( 0.000 ms): xchat/4574 majfault [_cairo_hash_table_lookup+0x53] => 0x2280ff0 (?.) 20.854 ( 0.000 ms): xchat/4574 majfault [gdk_cairo_set_source_pixbuf+0x110] => /usr/bin/xchat@0x6da1f (x.) 1022.000 ( 0.000 ms): xchat/4574 majfault [__memcpy_sse2_unaligned+0x29] => 0x7ff5a8ca0400 (?.) ^C[root@zoo /]# Below we can see malloc calls, 'trace' reading symbol tables in libraries to resolve symbols, etc. [root@zoo /]# echo 1 > /proc/sys/vm/drop_caches ; trace --no-syscalls -F all --cpu 1 sleep 10 0.000 ( 0.000 ms): chrome/26589 minfault [0x1b53129] => /tmp/perf-26589.map@0x33cbcbf7f000 (x.) 96.477 ( 0.000 ms): libvirtd/947 minfault [copy_user_enhanced_fast_string+0x5] => 0x7f7685bba000 (?k) 113.164 ( 0.000 ms): Xorg/1063 minfault [0x786da] => 0x7fce52882a3c (?.) 7162.801 ( 0.000 ms): chrome/3747 minfault [0x8e1a89] => 0xfcaefed0008 (?.) <SNIP> 7773.138 ( 0.000 ms): chrome/3886 minfault [0x8e1a89] => 0xfcb0ce28008 (?.) 7992.022 ( 0.000 ms): chrome/26574 minfault [0x1b5a708] => 0x3de7b5fc5000 (?.) 8108.949 ( 0.000 ms): qemu-system-x8/4537 majfault [_int_malloc+0xee] => 0x7faffc466d60 (?.) 8108.975 ( 0.000 ms): qemu-system-x8/4537 minfault [_int_malloc+0x102] => 0x7faffc466d60 (?.) <SNIP> 8148.174 ( 0.000 ms): qemu-system-x8/4537 minfault [_int_malloc+0x102] => 0x7faffc4eb500 (?.) 8270.855 ( 0.000 ms): chrome/26245 minfault [do_bo_emit_reloc+0xdb] => 0x45d092bc004 (?.) 8270.869 ( 0.000 ms): chrome/26245 minfault [do_bo_emit_reloc+0x108] => 0x45d09150000 (?.) no symbols found in /usr/lib64/libspice-server.so.1.9.0, maybe install a debug package? 8273.831 ( 0.000 ms): trace/20198 majfault [__memcmp_sse4_1+0xbc6] => /usr/lib64/libspice-server.so.1.9.0@0xdf000 (d.) <SNIP> 8275.121 ( 0.000 ms): trace/20198 minfault [dso__load+0x38] => 0x14fe756 (?.) no symbols found in /usr/lib64/libelf-0.158.so, maybe install a debug package? 8275.142 ( 0.000 ms): trace/20198 minfault [__memcmp_sse4_1+0xbc6] => /usr/lib64/libelf-0.158.so@0x0 (d.) <SNIP> [root@zoo /]# Signed-off-by: Stanislav Fomichev <stfomichev@yandex-team.ru> Cc: David Ahern <dsahern@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1403799268-1367-6-git-send-email-stfomichev@yandex-team.ru Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
159 lines
4.3 KiB
Plaintext
159 lines
4.3 KiB
Plaintext
perf-trace(1)
|
|
=============
|
|
|
|
NAME
|
|
----
|
|
perf-trace - strace inspired tool
|
|
|
|
SYNOPSIS
|
|
--------
|
|
[verse]
|
|
'perf trace'
|
|
'perf trace record'
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
This command will show the events associated with the target, initially
|
|
syscalls, but other system events like pagefaults, task lifetime events,
|
|
scheduling events, etc.
|
|
|
|
This is a live mode tool in addition to working with perf.data files like
|
|
the other perf tools. Files can be generated using the 'perf record' command
|
|
but the session needs to include the raw_syscalls events (-e 'raw_syscalls:*').
|
|
Alernatively, the 'perf trace record' can be used as a shortcut to
|
|
automatically include the raw_syscalls events when writing events to a file.
|
|
|
|
The following options apply to perf trace; options to perf trace record are
|
|
found in the perf record man page.
|
|
|
|
OPTIONS
|
|
-------
|
|
|
|
-a::
|
|
--all-cpus::
|
|
System-wide collection from all CPUs.
|
|
|
|
-e::
|
|
--expr::
|
|
List of events to show, currently only syscall names.
|
|
Prefixing with ! shows all syscalls but the ones specified. You may
|
|
need to escape it.
|
|
|
|
-o::
|
|
--output=::
|
|
Output file name.
|
|
|
|
-p::
|
|
--pid=::
|
|
Record events on existing process ID (comma separated list).
|
|
|
|
-t::
|
|
--tid=::
|
|
Record events on existing thread ID (comma separated list).
|
|
|
|
-u::
|
|
--uid=::
|
|
Record events in threads owned by uid. Name or number.
|
|
|
|
-v::
|
|
--verbose=::
|
|
Verbosity level.
|
|
|
|
-i::
|
|
--no-inherit::
|
|
Child tasks do not inherit counters.
|
|
|
|
-m::
|
|
--mmap-pages=::
|
|
Number of mmap data pages (must be a power of two) or size
|
|
specification with appended unit character - B/K/M/G. The
|
|
size is rounded up to have nearest pages power of two value.
|
|
|
|
-C::
|
|
--cpu::
|
|
Collect samples only on 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.
|
|
In per-thread mode with inheritance mode on (default), Events are captured only when
|
|
the thread executes on the designated CPUs. Default is to monitor all CPUs.
|
|
|
|
--duration:
|
|
Show only events that had a duration greater than N.M ms.
|
|
|
|
--sched:
|
|
Accrue thread runtime and provide a summary at the end of the session.
|
|
|
|
-i
|
|
--input
|
|
Process events from a given perf data file.
|
|
|
|
-T
|
|
--time
|
|
Print full timestamp rather time relative to first sample.
|
|
|
|
--comm::
|
|
Show process COMM right beside its ID, on by default, disable with --no-comm.
|
|
|
|
-s::
|
|
--summary::
|
|
Show only a summary of syscalls by thread with min, max, and average times
|
|
(in msec) and relative stddev.
|
|
|
|
-S::
|
|
--with-summary::
|
|
Show all syscalls followed by a summary by thread with min, max, and
|
|
average times (in msec) and relative stddev.
|
|
|
|
--tool_stats::
|
|
Show tool stats such as number of times fd->pathname was discovered thru
|
|
hooking the open syscall return + vfs_getname or via reading /proc/pid/fd, etc.
|
|
|
|
-F=[all|min|maj]::
|
|
--pf=[all|min|maj]::
|
|
Trace pagefaults. Optionally, you can specify whether you want minor,
|
|
major or all pagefaults. Default value is maj.
|
|
|
|
--syscalls::
|
|
Trace system calls. This options is enabled by default.
|
|
|
|
PAGEFAULTS
|
|
----------
|
|
|
|
When tracing pagefaults, the format of the trace is as follows:
|
|
|
|
<min|maj>fault [<ip.symbol>+<ip.offset>] => <addr.dso@addr.offset> (<map type><addr level>).
|
|
|
|
- min/maj indicates whether fault event is minor or major;
|
|
- ip.symbol shows symbol for instruction pointer (the code that generated the
|
|
fault); if no debug symbols available, perf trace will print raw IP;
|
|
- addr.dso shows DSO for the faulted address;
|
|
- map type is either 'd' for non-executable maps or 'x' for executable maps;
|
|
- addr level is either 'k' for kernel dso or '.' for user dso.
|
|
|
|
For symbols resolution you may need to install debugging symbols.
|
|
|
|
Please be aware that duration is currently always 0 and doesn't reflect actual
|
|
time it took for fault to be handled!
|
|
|
|
When --verbose specified, perf trace tries to print all available information
|
|
for both IP and fault address in the form of dso@symbol+offset.
|
|
|
|
EXAMPLES
|
|
--------
|
|
|
|
Trace only major pagefaults:
|
|
|
|
$ perf trace --no-syscalls -F
|
|
|
|
Trace syscalls, major and minor pagefaults:
|
|
|
|
$ perf trace -F all
|
|
|
|
1416.547 ( 0.000 ms): python/20235 majfault [CRYPTO_push_info_+0x0] => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0@0x61be0 (x.)
|
|
|
|
As you can see, there was major pagefault in python process, from
|
|
CRYPTO_push_info_ routine which faulted somewhere in libcrypto.so.
|
|
|
|
SEE ALSO
|
|
--------
|
|
linkperf:perf-record[1], linkperf:perf-script[1]
|