Linux's perf
subsystem, about which you can read a lot more here https://www.brendangregg.com/perf.html is an invaluable subsystem for tracing the performance of the kernel and user-space code.
It's a bit of the wild-west, it's a fast moving space with lots of moving pieces, and lots of unusual kernel- and user-space interop which makes it tricky to use.
What makes it trickier unfortunately is that Canonical saw fit to remove scripting support from the perf
tool in the linux-tools-generic
(and linux-tools-$(name -r)
) package rendering it practically useless.
Confirm you have this problem with the following:
sudo perf script -s lang
Scripting language extensions (used in perf script -s [spec:]script.[spec]):
Perl [Perl]
pl [Perl]
Python [Python]
py [Python]
Great, seems like perf script
has Python and Perl support, right? ... not quite:
The steps here can be also used to enable Perl scripting support, but I'm sticking with Python, since what little documentation there is covers this specifically.
sudo perf script -g py
Python scripting not supported. Install libpython and rebuild perf to enable it.
For example:
# apt-get install python-dev (ubuntu)
# yum install python-devel (Fedora)
etc.
Unfortunately the instructions won't help you and there's no way to rebuild the linux-tools-*
packages easily even after adding the {python,perl}-dev{,el}
packages as suggested.
Rather one is required to get the kernel sources, and patch them and then re-build the entire kernel package tree and then and only then can a version of linux-tools-*
with scripting support be installed:
The instructions ultimately are the normal instructions for building a new kernel; but I'll drop a block of shell commands below to save having to read a bunch of convolouted docs with multiple options:
- Follow to about half way: https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel
- Modify a file to remove
NO_LIBPYTHON=1
(note it must be REMOVED, not set to0
) - Compile the kernel from that source tree (resume the build your own kernel guide)
- Install the
linux-tools
package withdpkg -i ..
from the newly built packages.
So:
# 1. enable deb sources in /etc/sources.list
sed -i '/deb-src/s/^# //' /etc/apt/sources.list && apt update
# 2. install kernel sources for current kernel (installs to $PWD) e.g ./linux-5.4.0
apt-get source linux-image-unsigned-$(uname -r)
# 3. install python-dev package & general kernel build deps
apt install python-dev libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf default-jdk
# 4. change into the directory
cd ./linux-generic-5.4.0
# 5. apply this patch:
patch -p1 << EOPATCH
--- ./debian/rules.d/2-binary-arch.mkbak 2022-01-26 09:40:31.791079823 +0100
+++ ./debian/rules.d/2-binary-arch.mk 2022-01-26 09:40:46.671072005 +0100
@@ -702,7 +702,7 @@
cd $(builddirpa) && $(kmake) syncconfig
cd $(builddirpa) && $(kmake) prepare
cd $(builddirpa)/tools/perf && \
- $(kmake) prefix=/usr HAVE_NO_LIBBFD=1 HAVE_CPLUS_DEMANGLE_SUPPORT=1 CROSS_COMPILE=$(CROSS_COMPILE) NO_LIBPYTHON=1 NO_LIBPERL=1
+ $(kmake) prefix=/usr HAVE_NO_LIBBFD=1 HAVE_CPLUS_DEMANGLE_SUPPORT=1 CROSS_COMPILE=$(CROSS_COMPILE) NO_LIBPERL=1
endif
ifeq ($(do_tools_bpftool),true)
$(kmake) CROSS_COMPILE=$(CROSS_COMPILE) -C $(builddirpa)/tools/bpf/bpftool
EOPATCH
# 6. Build the targets
# if this fails and you need to install new deps, then
# reset things with `fakeroot debian/rules clean`
fakeroot debian/rules binary-arch
# 7. Wait (about 15-20 minutes on a decent laptop, probably, YMMV with virtualization)
# 8. Install the new package with dpkg -i
# note: filename here varies a lot by version and arch
sudo dpkg -i linux-tools-*.deb
After all this then the command sudo perf script -g py
should generate a pyton script with hooks for any perf recorders you might have enabled already.
Top comments (0)