Project

General

Profile

Status RPi3 20200526

Build 11.51, May 26th 2020

Size

# rpm-sortbysize |tail -20
5660408 libsolv-tools
5737343 raspberrypi-firmware
5916442 file-magic
5996273 kbd
6016237 rpm
6530502 glibc
7195074 openssh
7774733 zypper
8034287 udev
8375418 gpg2
8457236 xtables-plugins
8533749 libzypp
9183861 util-linux
9620460 coreutils
13150058 systemd
25159592 grub2
27441111 glibc-locale-base
27863675 ignition
346060194 kernel-default
511097221 kernel-firmware

Boot Times

Initial boot, network connected

# systemd-analyze
Startup finished in 42.032s (kernel) + 19.073s (initrd) + 24.977s (userspace) = 1min 26.084s
# systemd-analyze blame|head -20
         14.088s btrfsmaintenance-refresh.service
          7.666s wicked.service
          4.904s create-dirs-from-rpmdb.service
          4.554s dracut-initqueue.service
          3.808s dracut-pre-mount.service
          3.678s lvm2-monitor.service
          2.578s initrd-switch-root.service
          2.263s systemd-journal-flush.service
          2.023s systemd-udev-settle.service
          1.744s systemd-logind.service
          1.741s kbdsettings.service
          1.225s systemd-remount-fs.service
          1.118s initrd-parse-etc.service
          1.028s dracut-cmdline.service
           986ms wickedd-auto4.service
           975ms wickedd-dhcp4.service
           970ms wickedd-dhcp6.service
           925ms rebootmgr.service
           786ms systemd-user-sessions.service
           746ms systemd-sysctl.service
# du -sh /boot/initrd-5.3.18-lp152.16-default
61M     /boot/initrd-5.3.18-lp152.16-default

The initrd is too big with 61MB. Let's rebuild it as the first boot one was created using --no-hostonly.

# mkinitrd
# du -sh /boot/initrd-5.3.18-lp152.16-default
23M     /boot/initrd-5.3.18-lp152.16-default

Remove kiwi dracut hooks and ignition as they are not needed after first boot and see the impact on initrd

# zypper rm dracut-kiwi-lib ignition ignition-dracut
# mkinitrd
# du -sh /boot/initrd-5.3.18-lp152.16-default 
12M     /boot/initrd-5.3.18-lp152.16-default
# reboot
# systemd-analyze 
Startup finished in 3.784s (kernel) + 7.243s (initrd) + 36.189s (userspace) = 47.217s
# systemd-analyze blame|head -20
         20.997s btrfsmaintenance-refresh.service
         14.378s wicked.service
          6.367s create-dirs-from-rpmdb.service
          5.909s lvm2-monitor.service
          4.429s systemd-journal-flush.service
          3.412s systemd-remount-fs.service
          3.094s systemd-modules-load.service
          2.684s systemd-udev-settle.service
          2.221s initrd-switch-root.service
          1.613s kbdsettings.service
          1.303s wickedd-auto4.service
          1.291s wickedd-dhcp6.service
          1.283s wickedd-dhcp4.service
           862ms rebootmgr.service
           661ms sshd.service
           646ms initrd-parse-etc.service
           597ms systemd-udev-trigger.service
           460ms chronyd.service
           405ms boot-efi.mount
           357ms systemd-udevd.service

That helped a lot. Remove obvious offenders too

# rpm -e btrfsmaintenance lvm2 --nodeps
# sed -i -e '/WAIT_FOR_INTERFACES/s/30/1/' /etc/sysconfig/network/config
# reboot
# systemd-analyze 
Startup finished in 3.774s (kernel) + 7.262s (initrd) + 19.238s (userspace) = 30.275s
# systemd-analyze blame|head -20
          5.190s create-dirs-from-rpmdb.service
          3.098s systemd-journal-flush.service
          2.903s systemd-udev-settle.service
          2.753s systemd-remount-fs.service
          2.471s systemd-modules-load.service
          2.038s initrd-switch-root.service
          1.856s wickedd-dhcp4.service
          1.846s wickedd-dhcp6.service
          1.818s wickedd-auto4.service
          1.150s wicked.service
          1.003s health-checker.service
           954ms rebootmgr.service
           765ms kbdsettings.service
           723ms boot-efi.mount
           700ms sshd.service
           696ms chronyd.service
           631ms initrd-parse-etc.service
           567ms systemd-udev-trigger.service
           542ms systemd-udevd.service
           462ms systemd-logind.service
# systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @19.111s
└─getty.target @18.505s
  └─getty@tty1.service @18.504s
    └─systemd-user-sessions.service @18.353s +132ms
      └─network.target @17.112s
        └─wicked.service @15.960s +1.150s
          └─wickedd-nanny.service @15.853s +100ms
            └─wickedd.service @15.743s +104ms
              └─wickedd-dhcp6.service @13.891s +1.846s
                └─dbus.service @12.479s
                  └─basic.target @12.464s
                    └─paths.target @12.463s
                      └─ca-certificates.path @12.463s
                        └─sysinit.target @12.459s
                          └─systemd-update-utmp.service @12.380s +77ms
                            └─auditd.service @12.169s +204ms
                              └─systemd-tmpfiles-setup.service @12.097s +68ms
                                └─create-dirs-from-rpmdb.service @6.902s +5.190s
                                  └─local-fs.target @6.880s
                                    └─boot-efi.mount @6.125s +723ms
                                      └─dev-disk-by\x2duuid-34A1\x2d7474.device @5.877s

create-dirs-from-rpmdb in Factory uses a cookie to check if the rpmdb actually changed. In 15 it runs always. So let's disable it. Also syncing of the journal to the SD card.

# systemctl disable create-dirs-from-rpmdb.service
# rpm -e systemd-logger --nodeps
# rm -rf /var/log/journal/
# reboot
# systemd-analyze 
Startup finished in 3.764s (kernel) + 7.143s (initrd) + 10.558s (userspace) = 21.467s
# systemd-analyze blame|head -20
          2.454s systemd-udev-settle.service
          2.007s initrd-switch-root.service
          1.552s systemd-remount-fs.service
          1.238s systemd-sysctl.service
          1.198s health-checker.service
          1.147s wicked.service
           939ms rebootmgr.service
           722ms chronyd.service
           711ms sshd.service
           596ms initrd-parse-etc.service
           556ms boot-efi.mount
           519ms systemd-udev-trigger.service
           465ms opt.mount
           456ms home.mount
           444ms srv.mount
           416ms systemd-modules-load.service
           414ms tmp.mount
           401ms usr-local.mount
           400ms systemd-journal-flush.service
           386ms \x2esnapshots.mount
localhost:~ # systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @10.426s
└─getty.target @9.607s
  └─serial-getty@ttyS0.service @9.604s
    └─systemd-user-sessions.service @9.425s +158ms
      └─network.target @8.252s
        └─wicked.service @7.103s +1.147s
          └─wickedd-nanny.service @6.992s +104ms
            └─wickedd.service @6.883s +103ms
              └─wickedd-dhcp4.service @6.633s +243ms
                └─dbus.service @6.458s
                  └─basic.target @6.417s
                    └─sockets.target @6.416s
                      └─dbus.socket @6.416s
                        └─sysinit.target @6.410s
                          └─systemd-update-utmp.service @6.256s +152ms
                            └─auditd.service @5.943s +305ms
                              └─systemd-tmpfiles-setup.service @5.803s +132ms
                                └─systemd-journal-flush.service @5.390s +400ms
                                  └─local-fs.target @5.380s
                                    └─boot-efi.mount @4.763s +556ms
                                      └─dev-disk-by\x2duuid-34A1\x2d7474.device @4.546s

Let's get rid of wicked for the fun of it

# rpm -e wicked wicked-service --nodeps
# systemctl enable systemd-networkd
# cat > 50-eth0.network <<-EOF
[Match]
Name=eth0

[Network]
DHCP=yes
EOF
``
# reboot
# systemd-analyze 
Startup finished in 3.784s (kernel) + 7.131s (initrd) + 13.681s (userspace) = 24.596s
# systemd-analyze blame|head -20
          8.018s systemd-networkd-wait-online.service
          2.020s initrd-switch-root.service
          1.968s systemd-remount-fs.service
          1.671s systemd-modules-load.service
          1.072s health-checker.service
           657ms sshd.service
           639ms initrd-parse-etc.service
           604ms systemd-udev-trigger.service
           493ms rebootmgr.service
           414ms systemd-sysctl.service
           362ms systemd-udevd.service
           347ms chronyd.service
           335ms systemd-journald.service
           324ms sys-kernel-debug.mount
           322ms home.mount
           318ms auditd.service
           316ms systemd-logind.service
           313ms dev-hugepages.mount
           311ms boot-writable.mount
           300ms opt.mount

OOps! Now this actually works correctly. wicked and network-online semantics do not work actually. Rebootmgr pulls in network-online. The previous wicked timeout reduction would have actually broken rebootmgr if it really required the network to be online. Let's assume it does not.

# sed -i -e '/network-online.target/d' /usr/lib/systemd/system/rebootmgr.service
# systemd-analyze
Startup finished in 3.764s (kernel) + 7.078s (initrd) + 9.769s (userspace) = 20.612s
# systemd-analyze blame|head -20
          2.367s systemd-remount-fs.service
          2.105s systemd-sysctl.service
          2.008s initrd-switch-root.service
          1.374s health-checker.service
           983ms sshd.service
           679ms rebootmgr.service
           675ms systemd-udev-trigger.service
           592ms initrd-parse-etc.service
           516ms boot-efi.mount
           382ms chronyd.service
           359ms systemd-udevd.service
           320ms systemd-journald.service
           289ms systemd-modules-load.service
           286ms boot-grub2-arm64\x2defi.mount
           282ms \x2esnapshots.mount
           276ms systemd-networkd.service
           271ms boot-writable.mount
           266ms issue-add-ssh-keys.service
           256ms dracut-cmdline.service
           253ms home.mount
# systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @9.653s
└─getty.target @8.936s
  └─serial-getty@ttyS0.service @8.934s
    └─systemd-user-sessions.service @8.817s +103ms
      └─network.target @7.282s
        └─tallow.service @7.281s
          └─basic.target @7.272s
            └─sockets.target @7.272s
              └─dbus.socket @7.272s
                └─sysinit.target @7.267s
                  └─systemd-update-utmp.service @7.180s +86ms
                    └─auditd.service @6.960s +212ms
                      └─systemd-tmpfiles-setup.service @6.878s +77ms
                        └─systemd-journal-flush.service @6.693s +179ms
                          └─local-fs.target @6.678s
                            └─boot-efi.mount @6.107s +516ms
                              └─dev-disk-by\x2duuid-34A1\x2d7474.device @5.655s

More than one minute boot time saved. Still not great. More than that would require deeper investigation. For sure the initrd size needs to be reduced first.
Not included yet is the time in grub. It also has a 10s timeout by default that should be mostly useless on such systems.