[Buildroot] [git commit] core/instrumentation: shave minutes off the build time

Peter Korsgaard peter at korsgaard.com
Fri Apr 6 16:55:25 UTC 2018


>>>>> "Peter" == Peter Korsgaard <peter at korsgaard.com> writes:

 > commit: https://git.buildroot.net/buildroot/commit/?id=7fb6e782542fc440c2da226ec4525236d0508b77
 > branch: https://git.buildroot.net/buildroot/commit/?id=refs/heads/master

 > As part of the build, we run some instrumentation hooks to gather
 > statistics about the usage of the target/, staging/ and host/
 > directories, so that we can generate reports for the user, that
 > shows:
 >   - for each file, what package installed it,
 >   - for each package,the size that it installed.

 > In so doing, we run a double md5 pass on all files of the affected
 > directories (before/after installation).  These passes were mostly invisible
 > when we were only scanning target/, but has greatly increased in time now
 > that we also scan staging/ and host/ (but only in the corresponding _CMDS,
 > of course).

 > This md5 was mostly aimed at catching packages that would "cheat" with
 > mtime/atime/ctime somehow. They can't really cheat on md5, though [0].

 > Timings however speak for themselves, with this defconfig (slightly
 > biggish-but-still-manageable build) [1].

 > host/      20965 files    1.2GiB
 > staging/    4715 files    333MiB
 > target/     1801 files     44MiB

 > All instrumentation steps, using md5:    19min 27s
 > All instrumentation steps, using mtime:  14min 45s
 > No instrumentation step at all:          14min 31s

 > So, using mtime is an almost-5min improvement, i.e. about 25% faster,
 > while removing all instrumentation steps does not gain that much more...

 > So, we switch to using mtime, because in the end that's still good-enough
 > for our use-case: generating some graphs.  It is not mission-critical, and
 > if a graph is slightly off, that's not a biggy.  It can anyway be attributed
 > to a broken package's buildsystem, which should get fixed.

 > However, we lose the ability to track directories. Non-empty directories
 > can be tracked back by a bit of scripting, but empty directories are
 > simply not caught. If we were to also look for directories using mtime,
 > we would catch parents of installed files:

 >   - /foo/bar/ exists
 >   - a package installs /foo/bar/buz
 >   - mtime of /foo/bar/ is changed to account for the new file in it.

 > So we do not track directories at all, and we lose empty directories.
 > The existing tracking was mostly happenstance, with the original
 > submission and comments not really accounting for a real use-case.

 > Now, we also change the way we handle symlinks. Previously, we would
 > hash the file pointed to by the symlink. Now, we only look at the mtime
 > of the symlink itself, which still detects modifications.

 > Eventually, this also means that we now no longer need to establish a
 > list before the install step; we can now simply run after the install
 > step, finding any files newer than the build stamp.

 > [0] Yeah, md5 is very weak, but we're not guarding against malicious
 > attacks, just about careless modifications.

 > [1] defconfig used for tests:
 > BR2_arm=y
 > BR2_cortex_a7=y
 > BR2_TOOLCHAIN_EXTERNAL=y
 > BR2_INIT_SYSTEMD=y
 > BR2_PACKAGE_MESA3D=y
 > BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV=y
 > BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SWRAST=y
 > BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VC4=y
 > BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL=y
 > BR2_PACKAGE_MESA3D_DRI_DRIVER_SWRAST=y
 > BR2_PACKAGE_MESA3D_OSMESA=y
 > BR2_PACKAGE_MESA3D_OPENGL_ES=y
 > BR2_PACKAGE_SYSTEMD_JOURNAL_GATEWAY=y
 > BR2_PACKAGE_SYSTEMD_BACKLIGHT=y
 > BR2_PACKAGE_SYSTEMD_BINFMT=y
 > BR2_PACKAGE_SYSTEMD_COREDUMP=y
 > BR2_PACKAGE_SYSTEMD_FIRSTBOOT=y
 > BR2_PACKAGE_SYSTEMD_HIBERNATE=y
 > BR2_PACKAGE_SYSTEMD_IMPORTD=y
 > BR2_PACKAGE_SYSTEMD_LOCALED=y
 > BR2_PACKAGE_SYSTEMD_LOGIND=y
 > BR2_PACKAGE_SYSTEMD_MACHINED=y
 > BR2_PACKAGE_SYSTEMD_POLKIT=y
 > BR2_PACKAGE_SYSTEMD_QUOTACHECK=y
 > BR2_PACKAGE_SYSTEMD_RANDOMSEED=y
 > BR2_PACKAGE_SYSTEMD_RFKILL=y
 > BR2_PACKAGE_SYSTEMD_SMACK_SUPPORT=y
 > BR2_PACKAGE_SYSTEMD_SYSUSERS=y
 > BR2_PACKAGE_SYSTEMD_VCONSOLE=y

 > [Peter: tweak commit message, use find -type l]
 > Reported-by: Trent Piepho <tpiepho at impinj.com>
 > Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
 > Cc: Trent Piepho <tpiepho at impinj.com>
 > Cc: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
 > Cc: Peter Korsgaard <peter at korsgaard.com>
 > Signed-off-by: Peter Korsgaard <peter at korsgaard.com>

Committed to 2018.02.x, thanks.

-- 
Bye, Peter Korsgaard


More information about the buildroot mailing list