* Building perf with BUILD_BPF_SKEL=1
@ 2022-11-17 13:11 Arnaldo Carvalho de Melo
2022-11-17 17:00 ` Andrii Nakryiko
0 siblings, 1 reply; 2+ messages in thread
From: Arnaldo Carvalho de Melo @ 2022-11-17 13:11 UTC (permalink / raw)
To: Namhyung Kim, Song Liu
Cc: Adrian Hunter, Andrii Nakryiko, Ian Rogers, Jiri Olsa,
Linux Kernel Mailing List
Hi guys,
At some point we should switch to building with BPF skels by
default as there are many features that are implemented that way in
perf:
⬢[acme@toolbox perf]$ ls -la tools/perf/util/bpf_skel/
total 464
drwxr-xr-x. 1 acme acme 334 Oct 14 10:28 .
drwxr-xr-x. 1 acme acme 7380 Nov 17 09:22 ..
-rw-r--r--. 1 acme acme 5581 Oct 14 10:28 bperf_cgroup.bpf.c
-rw-r--r--. 1 acme acme 1764 Mar 14 2022 bperf_follower.bpf.c
-rw-r--r--. 1 acme acme 1438 Mar 14 2022 bperf_leader.bpf.c
-rw-r--r--. 1 acme acme 285 Mar 14 2022 bperf_u.h
-rw-r--r--. 1 acme acme 2290 Mar 14 2022 bpf_prog_profiler.bpf.c
-rw-r--r--. 1 acme acme 2164 Mar 27 2022 func_latency.bpf.c
-rw-r--r--. 1 acme acme 53 Nov 6 2021 .gitignore
-rw-r--r--. 1 acme acme 9017 Sep 27 09:29 kwork_trace.bpf.c
-rw-r--r--. 1 acme acme 3691 Oct 6 08:03 lock_contention.bpf.c
-rw-r--r--. 1 acme acme 6102 Oct 4 08:55 off_cpu.bpf.c
⬢[acme@toolbox perf]$
Since I'm finally using the Firefly ARM board the fine folks at
Librecomputer gave us at Kernel Recipes, I'm noticing issues as I go on
adding the components, for instance:
/bin/sh: 2: llvm-strip: not found
make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bperf_follower.bpf.o] Error 127
make[2]: *** Waiting for unfinished jobs....
/bin/sh: 2: llvm-strip: not found
make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bpf_prog_profiler.bpf.o] Error 127
/bin/sh: 2: llvm-strip: not found
make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bperf_leader.bpf.o] Error 127
/bin/sh: 2: llvm-strip: not found
make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/func_latency.bpf.o] Error 127
/bin/sh: 2: llvm-strip: not found
make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bperf_cgroup.bpf.o] Error 127
make[1]: *** [Makefile.perf:240: sub-make] Error 2
make: *** [Makefile:113: install-bin] Error 2
make: Leaving directory '/home/acme/git/perf/tools/perf'
So this is just me taking notes, feel free to fix it if you want ;-)
acme@roc-rk3399-pc:~/git/perf$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
acme@roc-rk3399-pc:~/git/perf$
perf should check for that and give per-distro hints on how to overcome
those, for instance, on ubuntu I had to:
acme@roc-rk3399-pc:~/git/perf$ dpkg -L llvm-14 | grep strip
/usr/share/man/man1/llvm-strip-14.1.gz
/usr/bin/llvm-bitcode-strip-14
/usr/bin/llvm-strip-14
/usr/lib/llvm-14/bin/llvm-bitcode-strip
/usr/lib/llvm-14/bin/llvm-strip
acme@roc-rk3399-pc:~/git/perf$ export PATH=$PATH:/usr/lib/llvm-14/bin
and now:
acme@roc-rk3399-pc:~/git/perf$ alias m
alias m='make -k BUILD_BPF_SKEL=1 CORESIGHT=1 O=/tmp/build/perf -C tools/perf install-bin && git status && perf test python'
acme@roc-rk3399-pc:~/git/perf$ m
make: Entering directory '/home/acme/git/perf/tools/perf'
BUILD: Doing 'make -j6' parallel build
Makefile.config:1136: No openjdk development package found, please install JDK package, e.g. openjdk-8-jdk, java-1.8.0-openjdk-devel
Auto-detecting system features:
... dwarf: [ on ]
... dwarf_getlocations: [ on ]
... glibc: [ on ]
... libbfd: [ on ]
... libbfd-buildid: [ on ]
... libcap: [ on ]
... libelf: [ on ]
... libnuma: [ on ]
... numa_num_possible_cpus: [ on ]
... libperl: [ on ]
... libpython: [ on ]
... libcrypto: [ on ]
... libunwind: [ on ]
... libdw-dwarf-unwind: [ on ]
... zlib: [ on ]
... lzma: [ on ]
... get_cpuid: [ OFF ]
... bpf: [ on ]
... libaio: [ on ]
... libzstd: [ on ]
INSTALL headers
<SNIP>
GENSKEL /tmp/build/perf/util/bpf_skel/bpf_prog_profiler.skel.h
GENSKEL /tmp/build/perf/util/bpf_skel/bperf_follower.skel.h
GENSKEL /tmp/build/perf/util/bpf_skel/bperf_leader.skel.h
GENSKEL /tmp/build/perf/util/bpf_skel/bperf_cgroup.skel.h
GENSKEL /tmp/build/perf/util/bpf_skel/func_latency.skel.h
CLANG /tmp/build/perf/util/bpf_skel/.tmp/off_cpu.bpf.o
CLANG /tmp/build/perf/util/bpf_skel/.tmp/lock_contention.bpf.o
CLANG /tmp/build/perf/util/bpf_skel/.tmp/kwork_trace.bpf.o
GEN /tmp/build/perf/python/perf.so
INSTALL trace_plugins
GENSKEL /tmp/build/perf/util/bpf_skel/kwork_trace.skel.h
GENSKEL /tmp/build/perf/util/bpf_skel/lock_contention.skel.h
GENSKEL /tmp/build/perf/util/bpf_skel/off_cpu.skel.h
CC /tmp/build/perf/builtin-bench.o
<SNIP>
CC /tmp/build/perf/util/bpf-loader.o
CC /tmp/build/perf/util/bpf_map.o
CC /tmp/build/perf/util/bpf_counter.o
CC /tmp/build/perf/util/bpf_counter_cgroup.o
CC /tmp/build/perf/util/bpf_ftrace.o
CC /tmp/build/perf/util/bpf_off_cpu.o
CC /tmp/build/perf/util/bpf_kwork.o
CC /tmp/build/perf/util/bpf_lock_contention.o
CC /tmp/build/perf/util/bpf-prologue.o
<SNIP>
INSTALL binaries
INSTALL tests
INSTALL libexec
INSTALL bpf-examples
INSTALL perf-archive
INSTALL perf-iostat
INSTALL strace/groups
INSTALL perl-scripts
INSTALL python-scripts
INSTALL dlfilters
INSTALL perf_completion-script
INSTALL perf-tip
make: Leaving directory '/home/acme/git/perf/tools/perf'
On branch perf/core
Your branch is up to date with 'five/perf/core'.
nothing to commit, working tree clean
19: 'import perf' in python : Ok
acme@roc-rk3399-pc:~/git/perf$
Seems to work:
acme@roc-rk3399-pc:~/git/perf$ ls -la ~/bin/perf
-rwxr-xr-x 2 acme acme 21281824 Nov 17 12:45 /home/acme/bin/perf
acme@roc-rk3399-pc:~/git/perf$ strip ~/bin/perf
acme@roc-rk3399-pc:~/git/perf$ ls -la ~/bin/perf
-rwxr-xr-x 2 acme acme 4961472 Nov 17 12:47 /home/acme/bin/perf
acme@roc-rk3399-pc:~/git/perf$ ls -lah ~/bin/perf
-rwxr-xr-x 2 acme acme 4.8M Nov 17 12:47 /home/acme/bin/perf
acme@roc-rk3399-pc:~/git/perf$
root@roc-rk3399-pc:~# file ~/bin/perf
/root/bin/perf: symbolic link to /home/acme/bin/perf
root@roc-rk3399-pc:~# file /home/acme/bin/perf
/home/acme/bin/perf: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=54ecfa892a4ee52c4b57b86c11a5aeaa0603f49d, for GNU/Linux 3.7.0, stripped
root@roc-rk3399-pc:~#
Testing non-BPF skel integration on arm64 by using perf + BPF to trace
the perf_event_open, clone and kill system calls using as a workload
'perf stat' with one and then two events:
root@roc-rk3399-pc:~# perf trace -e ~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o,perf_*,clone,kill perf stat -e cycles sleep 1
0.000 clone(clone_flags: CHILD_CLEARTID|CHILD_SETTID|0x11) = 10801 (perf)
2.988 perf_event_open(attr_uptr: { size: 128, sample_type: IDENTIFIER, read_format: TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING, disabled: 1, inherit: 1, enable_on_exec: 1, exclude_guest: 1 }, pid: 10801 (perf), cpu: -1, group_fd: -1, flags: FD_CLOEXEC) = 3
Performance counter stats for 'sleep 1':
5716210 cycles
1.013109875 seconds time elapsed
0.000000000 seconds user
0.012232000 seconds sys
1017.474 kill(pid: 10800 (perf), sig: CHLD) = 0
root@roc-rk3399-pc:~# perf trace -e ~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o,perf_*,clone,kill perf stat -e cycles,cache-misses sleep 1
0.000 clone(clone_flags: CHILD_CLEARTID|CHILD_SETTID|0x11) = 10804 (perf)
3.042 perf_event_open(attr_uptr: { size: 128, sample_type: IDENTIFIER, read_format: TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING, disabled: 1, inherit: 1, enable_on_exec: 1, exclude_guest: 1 }, pid: 10804 (perf), cpu: -1, group_fd: -1, flags: FD_CLOEXEC) = 3
3.115 perf_event_open(attr_uptr: { size: 128, config: 0x3, sample_type: IDENTIFIER, read_format: TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING, disabled: 1, inherit: 1, enable_on_exec: 1, exclude_guest: 1 }, pid: 10804 (perf), cpu: -1, group_fd: -1, flags: FD_CLOEXEC) = 4
Performance counter stats for 'sleep 1':
5937955 cycles
18037 cache-misses
1.013214453 seconds time elapsed
0.000000000 seconds user
0.012167000 seconds sys
1017.881 kill(pid: 10803 (perf), sig: CHLD) = 0
root@roc-rk3399-pc:~#
First this was run with -e
~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.c, and as
I have:
root@roc-rk3399-pc:~# cat ~/.perfconfig
[llvm]
dump-obj = true
clang-opt = -g
[trace]
show_zeros = no
show_duration = no
no_inherit = yes
args_alignment = 40
root@roc-rk3399-pc:~#
Then that 'dump-obj' ends up keeping the .o BPF bytecode saved:
root@roc-rk3399-pc:~# file ~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o
/home/acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.o: ELF 64-bit LSB relocatable, eBPF, version 1 (SYSV), with debug_info, not stripped
root@roc-rk3399-pc:~#
And I can reuse it to skip compiling it using clang (version 14 on this
ubuntu 22.04.1 system).
Now trying some of those bpf skels:
root@roc-rk3399-pc:~# perf ftrace latency -b -n -T dput -a sleep 1
libbpf: failed to add legacy kprobe event for 'dput+0x0': No such file or directory
libbpf: prog 'func_begin': failed to create kprobe 'dput+0x0' perf event: No such file or directory
libbpf: failed to add legacy kprobe event for 'dput+0x0': No such file or directory
libbpf: prog 'func_end': failed to create kretprobe 'dput+0x0' perf event: No such file or directory
No data found
root@roc-rk3399-pc:~#
root@roc-rk3399-pc:~# perf record sleep 12
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.018 MB perf.data (10 samples) ]
root@roc-rk3399-pc:~#
root@roc-rk3399-pc:~#
root@roc-rk3399-pc:~# perf report
root@roc-rk3399-pc:~# perf ftrace latency -b -T mas_wr_walk -a sleep 1
libbpf: failed to add legacy kprobe event for 'mas_wr_walk+0x0': No such file or directory
libbpf: prog 'func_begin': failed to create kprobe 'mas_wr_walk+0x0' perf event: No such file or directory
libbpf: failed to add legacy kprobe event for 'mas_wr_walk+0x0': No such file or directory
libbpf: prog 'func_end': failed to create kretprobe 'mas_wr_walk+0x0' perf event: No such file or directory
No data found
root@roc-rk3399-pc:~# perf report --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 10 of event 'cycles'
# Event count (approx.): 3110967
#
# Overhead Command Shared Object Symbol
# ........ ....... ................ ...............................
#
41.69% sleep [kernel.vmlinux] [k] mas_leaf_max_gap
41.54% sleep [kernel.vmlinux] [k] mas_wr_walk
15.61% sleep [kernel.vmlinux] [k] copy_page
1.09% sleep [kernel.vmlinux] [k] shift_arg_pages
0.06% perf-ex [kernel.vmlinux] [k] _raw_spin_unlock_irqrestore
0.00% perf-ex [kernel.vmlinux] [k] perf_event_exec
#
# (Tip: Create an archive with symtabs to analyse on other machine: perf archive)
#
root@roc-rk3399-pc:~#
I'll continue this later.
- Arnaldo
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Building perf with BUILD_BPF_SKEL=1
2022-11-17 13:11 Building perf with BUILD_BPF_SKEL=1 Arnaldo Carvalho de Melo
@ 2022-11-17 17:00 ` Andrii Nakryiko
0 siblings, 0 replies; 2+ messages in thread
From: Andrii Nakryiko @ 2022-11-17 17:00 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Namhyung Kim, Song Liu, Adrian Hunter, Ian Rogers, Jiri Olsa,
Linux Kernel Mailing List
On Thu, Nov 17, 2022 at 5:11 AM Arnaldo Carvalho de Melo
<arnaldo.melo@gmail.com> wrote:
>
> Hi guys,
>
> At some point we should switch to building with BPF skels by
> default as there are many features that are implemented that way in
> perf:
>
> ⬢[acme@toolbox perf]$ ls -la tools/perf/util/bpf_skel/
> total 464
> drwxr-xr-x. 1 acme acme 334 Oct 14 10:28 .
> drwxr-xr-x. 1 acme acme 7380 Nov 17 09:22 ..
> -rw-r--r--. 1 acme acme 5581 Oct 14 10:28 bperf_cgroup.bpf.c
> -rw-r--r--. 1 acme acme 1764 Mar 14 2022 bperf_follower.bpf.c
> -rw-r--r--. 1 acme acme 1438 Mar 14 2022 bperf_leader.bpf.c
> -rw-r--r--. 1 acme acme 285 Mar 14 2022 bperf_u.h
> -rw-r--r--. 1 acme acme 2290 Mar 14 2022 bpf_prog_profiler.bpf.c
> -rw-r--r--. 1 acme acme 2164 Mar 27 2022 func_latency.bpf.c
> -rw-r--r--. 1 acme acme 53 Nov 6 2021 .gitignore
> -rw-r--r--. 1 acme acme 9017 Sep 27 09:29 kwork_trace.bpf.c
> -rw-r--r--. 1 acme acme 3691 Oct 6 08:03 lock_contention.bpf.c
> -rw-r--r--. 1 acme acme 6102 Oct 4 08:55 off_cpu.bpf.c
> ⬢[acme@toolbox perf]$
>
>
> Since I'm finally using the Firefly ARM board the fine folks at
> Librecomputer gave us at Kernel Recipes, I'm noticing issues as I go on
> adding the components, for instance:
>
> /bin/sh: 2: llvm-strip: not found
> make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bperf_follower.bpf.o] Error 127
> make[2]: *** Waiting for unfinished jobs....
> /bin/sh: 2: llvm-strip: not found
> make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bpf_prog_profiler.bpf.o] Error 127
> /bin/sh: 2: llvm-strip: not found
> make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bperf_leader.bpf.o] Error 127
> /bin/sh: 2: llvm-strip: not found
> make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/func_latency.bpf.o] Error 127
> /bin/sh: 2: llvm-strip: not found
> make[2]: *** [Makefile.perf:1136: /tmp/build/perf/util/bpf_skel/.tmp/bperf_cgroup.bpf.o] Error 127
> make[1]: *** [Makefile.perf:240: sub-make] Error 2
> make: *** [Makefile:113: install-bin] Error 2
> make: Leaving directory '/home/acme/git/perf/tools/perf'
>
> So this is just me taking notes, feel free to fix it if you want ;-)
>
> acme@roc-rk3399-pc:~/git/perf$ cat /etc/os-release
> PRETTY_NAME="Ubuntu 22.04.1 LTS"
> NAME="Ubuntu"
> VERSION_ID="22.04"
> VERSION="22.04.1 LTS (Jammy Jellyfish)"
> VERSION_CODENAME=jammy
> ID=ubuntu
> ID_LIKE=debian
> HOME_URL="https://www.ubuntu.com/"
> SUPPORT_URL="https://help.ubuntu.com/"
> BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
> PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
> UBUNTU_CODENAME=jammy
> acme@roc-rk3399-pc:~/git/perf$
>
> perf should check for that and give per-distro hints on how to overcome
> those, for instance, on ubuntu I had to:
there is no need to use llvm-strip anymore, if you use BPF static
linking (even if for single .bpf.o file). We do `bpftool obj gen` and
that effectively strips away DWARF.
>
> acme@roc-rk3399-pc:~/git/perf$ dpkg -L llvm-14 | grep strip
> /usr/share/man/man1/llvm-strip-14.1.gz
> /usr/bin/llvm-bitcode-strip-14
> /usr/bin/llvm-strip-14
> /usr/lib/llvm-14/bin/llvm-bitcode-strip
> /usr/lib/llvm-14/bin/llvm-strip
> acme@roc-rk3399-pc:~/git/perf$ export PATH=$PATH:/usr/lib/llvm-14/bin
>
>
> and now:
>
[...]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-11-17 17:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-17 13:11 Building perf with BUILD_BPF_SKEL=1 Arnaldo Carvalho de Melo
2022-11-17 17:00 ` Andrii Nakryiko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).