Why Is My Build So Slow?!
Ross Burton
meta-arm co-maintainer
Principal Software Engineer
Arm Ltd
ross.burton@arm.com
https://xkcd.com/303/
Always share SSTATE_DIR
and DL_DIR
The Build Machine
A typical laptop after building Chromium
lo-fi benchmark
$ git clone --branch kirkstone https://git.yoctoproject.org/poky
$ cd poky
$ . oe-init-build-env
$ bitbake core-image-sato --runall fetch
$ time bitbake core-image-sato
Corporate Laptop
Cost around £1.5K
8 cores, 16GB RAM
core-image-sato in 2 hours 30 minutes
“Mobile Workstation”
Cost around £3K
16 cores, 64GB RAM
core-image-sato in 1 hour 45 minutes
Workstation
Cost around £5K
32 cores, 64GB RAM
core-image-sato in 27 minutes
From sstate in 48 seconds
How much is your time worth?
Build Machine Wishlist
Plenty of cores
Good cooling
Lots of memory
Fast storage
Understand your build
$ bitbake --graphviz core-image-sato # or -g
$ cat pn-buildlist
core-image-minimal
quilt-native
patch-native
pseudo-native
linux-yocto
...
$ grep gcc pn-buildlist
gcc-cross-aarch64
gcc
$ oe-depends-dot task-depends.dot --why --key gcc
Because: core-image-sato elfutils
core-image-sato -> elfutils -> gcc
elfutils_0.187.bb
RDEPENDS:${PN}-ptest += "libasm libelf bash make coreutils
iproute2-ss bsdtar libgcc-dev
gcc-symlinks binutils-symlinks"
$ grep x11 pn-buildlist
libx11
$ oe-depends-dot task-depends.dot --why --key libx11
Because: core-image-minimal dbus libxkbcommon
core-image-minimal -> dbus -> libx11
dbus_1.14.4.bb
PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'x11', d)}"
PACKAGECONFIG[x11] = "--enable-x11-autolaunch,
--without-x --disable-x11-autolaunch,
libx11 libsm"
$ DISTRO=poky bitbake-getvar DISTRO_FEATURES
DISTRO_FEATURES="acl alsa bluetooth debuginfod ext2 ipv4 ipv6
pcmcia usbgadget usbhost wifi xattr nfs zeroconf pci 3g nfc
x11 vfat seccomp largefile opengl ptest multiarch wayland
vulkan pam systemd"
$ oe-depends-dot task-depends.dot --why --key bluez5
Because: connman core-image-sato gstreamer1 libpcap neard ofono packagegroup-base pulseaudio
core-image-sato -> connman -> ofono -> bluez5
core-image-sato -> packagegroup-base -> ofono -> bluez5
core-image-sato -> pulseaudio -> ofono -> bluez5
core-image-sato -> gstreamer1 -> pulseaudio -> ofono -> bluez5
core-image-sato -> libpcap -> bluez5
core-image-sato -> packagegroup-base -> neard -> bluez5
3g bluetooth nfc wifi
INHERIT += "buildstats"
$ bitbake core-image-sato
$ cat tmp/buildstats/20221110124011/curl-7.82.0-r0/do_configure
Event: TaskStarted
Started: 1668084334.63
curl-7.82.0-r0: do_configure
Elapsed time: 136.91 seconds
utime: 21
stime: 6
cutime: 2679
cstime: 654
IO rchar: 430902147
IO wchar: 59525723
...
Ended: 1668084471.54
scripts/pybootchartgui/pybootchartgui.py
autotools.bbclass
???
rust-native
Making bitbake PSI-chic: regulating builds using /proc/pressure
by Randy MacLeod
https://youtu.be/aWq9KQI6dAU
Optimising Rebuilds
Hash Equivalence
https://docs.yoctoproject.org/overview-manual/concepts.html#hash-equivalence
Sstate summary: Wanted 972 Local 0 Mirrors 0 Missed 972 Current 479 (0% match, 33% complete)
NOTE: Executing Tasks
NOTE: recipe autoconf-native-2.71-r0: task do_configure: Succeeded
NOTE: recipe autoconf-native-2.71-r0: task do_compile: Succeeded
NOTE: recipe autoconf-native-2.71-r0: task do_install: Succeeded
NOTE: recipe autoconf-native-2.71-r0: task do_populate_sysroot: Succeeded
NOTE: Task virtual:native:autoconf_2.71.bb:do_populate_sysroot
unihash changed to 76620844bfe6f3ad30ac3fa55fad8f9775cb68afacdedfc29822fe0a758cfa6e
NOTE: Setscene task zstd_1.5.2.bb:do_package_qa became valid
NOTE: Setscene task kbd_2.5.1.bb:do_package became valid
NOTE: Setscene task gcc_12.2.bb:do_packagedata became valid
NOTE: Setscene task libffi_3.4.4.bb:do_package_write_rpm became valid
...
NOTE: recipe core-image-minimal-1.0-r0: task do_image: Succeeded
NOTE: Tasks Summary: Attempted 3742 tasks of which 3729 didn't need to be rerun and all succeeded.
tl;dr: for faster rebuilds
BB_SIGNATURE_HANDLER = "OEEquivHash"
BB_HASHSERVE = "auto"
2 Mirrors 2 Fast 2 Furious:
Using Autobuilder SState
BB_HASHSERVE_UPSTREAM = "hashserv.yocto.io:8687"
SSTATE_MIRRORS = "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH"
Locked SState
Generating Locked Hashes
$ bitbake core-image-sato --dump-signatures=none
$ code locked-sigs.inc
+# Don't fail when calculated hash doesn't match locked hash
+SIGGEN_LOCKEDSIGS_TASKSIG_CHECK = ""
SIGGEN_LOCKEDSIGS_t-cortexa57 = "
...
-python3:do_compile:7e46157c6c9b4053507e314015a2823da08aea33f2a21b4f6aa0e57eb8458125
-python3:do_configure:b868b7690a1db7b7720527e19b60f9bf17b294ac576a5972e04bff9be2df079a
-python3:do_fetch:d23108869e5dde01e6662a9c6ff6d96aea1307fc39e435b9e9e99861c9ea0dd6
-python3:do_install:72db8e3503e96d62b3e5be5a0eb252da583e357ab93bb693f3b54e740e9b770d
-python3:do_package:0549c987964b31f37e2575a8f592bee6be393ecd275ee8dbbc61e378a8f28021
...
$ mv locked-sigs.inc conf/auto.conf
$ bitbake core-image-sato
ross.burton@arm.com
rburton
on #yocto@libera.chat