diff options
| author | John Ogness <john.ogness@linutronix.de> | 2018-08-03 16:29:26 +0200 |
|---|---|---|
| committer | John Ogness <john.ogness@linutronix.de> | 2018-08-03 16:29:26 +0200 |
| commit | 6f9ffcc6d9a9018a21855b29bf5fbedb48386da1 (patch) | |
| tree | 40cf4313268626adf953661e28be53e2707092da /schulung_tools | |
| parent | 300d0f892506fda9c4bfa706ebee2e1fc3cc4fb7 (diff) | |
fastboot: add notes from previous schulungen
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Diffstat (limited to 'schulung_tools')
| -rw-r--r-- | schulung_tools/notes/fastboot.txt | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/schulung_tools/notes/fastboot.txt b/schulung_tools/notes/fastboot.txt new file mode 100644 index 0000000..8763939 --- /dev/null +++ b/schulung_tools/notes/fastboot.txt @@ -0,0 +1,81 @@ +This is a general procedure for improving Linux boot times. It only deals +with Linux drivers and userspace. + +NOTE: Everything before Linux (hardware, bootloader) have very important + roles also. They also must be considered for a complete fast boot + concept. + +1. Add "poweroff -f" to the beginning of the boot script /etc/init.d/rcS + - this allows us to measure time with "time ./start-vm.sh" + +2. Do not enable audio in qemu: QEMU_AUDIO_DRV=none + - this reduces qemu startup time (we want to measure Linux, not qemu) + +3. Switch from NFS-Root to initramfs. + - this avoids ethernet setup and DHCP at boot + - this avoids network latencies during filesystem interaction + - initramfs uses /init as default start program, so we add a soft link + from /init to bin/busybox in the root filesystem + - removed "ip=dhcp root=... nfsroot=..." from kernel arguments + +4. Strip all libraries and binaries. + - this makes the initramfs *much* smaller + - smaller initramfs means faster "populate rootfs" on boot + +5. Remove libm dependency from busybox. + - the busybox features using libm are not needed for fast boot requirements + - removing libm means smaller initramfs + - less dependencies means faster busybox start time + +6. Add "printk.time=1 loglevel=8" to kernel arguments. + - ./start-vm.sh > boot.log + - browse boot.log to find any errors, unused features, slow non-important + features. + - disable or compile the drivers/features as modules + +7. Add "initcall_debug" to kernel arguments. + - now we can see the time consumed by each driver's init function + - if the device is in the device-tree, this time will also include + the device's probe time + - ./start-vm.sh > boot.log + - cat boot.log | linux-4.6/scripts/bootgraph.pl > boot.svg + +8. Remove (or change to modules) drivers not needed for fast boot requirements + - search kernel code to find init function + - look at the Makefile in that directory to see the corresponding + kernel config option + - remove amba_clcdfd_init (as example) + - change smsc911x_init to module (as example) + +9. Remove initcall_debug, consoles and set loglevel=0. + - we are done evaluating individual driver times + - the console is slow, so don't output anything to it + - maybe even disable the console in the kernel config + +10. Pre-configure loops per jiffy calibration. + - ./start-vm.sh | grep lpj= + - add lpj=xyz to kernel parameters + +11. Choose optimal kernel compression + - General setup -> Kernel compression mode + - set kernel compression to LZO + +12. Create fastpoweroff script to run instead of busybox-init. + - add kernel parameter "rdinit=/bin/fastpoweroff" + - now init is not started (since init did much more than just + run /etc/init.d/rcS) + +13. Create binary to run instead of script or busybox-init. + - change kernel parameter to "rdinit=/bin/poweroff" + - (busybox was hacked so "poweroff" automatically uses "-f") + - in #12 first a shell is loaded, then the script is parsed, + then poweroff is called + - now poweroff is directly called by kernel + +14. Add ld.so.cache for initramfs libraries. + - the dynamic loader now does not search for dependencies + +15. For systemd-based userspace, use systemd tools. + - systemd-analyze blame + - systemd-analyze plot > systemd.svg + - systemd-analyze critcal-chain app-qt |
