Table of Contents:
Apertis has a fairly standard boot process which utilises systemd to perform user space initialisation. This document describes steps that can be taken to profile and optimise the boot process.
Startup sequence modification rules
A number of simple steps need to be followed when adding services to the boot process to ensure that an optimal boot process can be achieved:
- Configure systemd services to only depend upon other services they absolutely require to function: This helps simplify and shorten the boot process.
- Ensure less important services depend upon later stages of the systemd startup phase: This allows the system to bring up critical functionality sooner, which can make the startup feel shorter from the perspective of the user.
- Add arbitrary delays to services: Timing delays are fragile and slow the boot process, systemd supports a wide variety of ways to describe dependencies between services, enabling then to be started when the services they depend on are available.
- Remove actual dependencies from
.servicefiles in an attempt to shorten the boot process: systemd is very good at minimizing the impact of the sequencing of service activation on the total boot time, so it is more important to ensure that all of a service’s requirements are well described to enable it to optimise the process well.
Profilng the boot process
Is a tool to analyze a system boot performance, retrieve statistics in order to improve the system startup time. There are different arguments to retrieve information from the system and service manager.
Following are some useful options with the explanation taken from the systemd-analyze manpage.
systemd-analyze time prints the time spent in the kernel before
userspace has been reached, the time spent in the initial RAM disk
(initrd) before normal system userspace has been reached, and the time
normal system userspace took to initialize. Note that these measurements
simply measure the time passed up to the point where all system services
have been spawned, but not necessarily until they fully finished
initialization or the disk is idle.
# systemd-analyze time
Startup finished in 1.412s (kernel) + 1.869s (initrd) + 14.158s (userspace) = 17.440s
systemd-analyze blame prints a list of all running units, ordered by
the time they took to initialize. This information may be used to
optimize boot-up times. Note that the output might be misleading as the
initialization of one service might be slow simply because it waits for
the initialization of another service to complete.
# systemd-analyze blame
These numbers provide the relative duration of each service during the boot process (though their absolute time is only accurate if this is run on the target hardware).
systemd-analyze options can be used in conjunction with the
argument which shows the performance data for user session instead of
the system manager. For example the
email@example.com unit starts a set
of services so a finer grained information can be gathered with:
# systemd-analyze --user blame
systemd-analyze critical-chain \[UNIT...\] prints a tree of the
time-critical chain of units (for each of the specified
UNITs or for the
default target otherwise). 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. Note that the output might be
misleading as the initialization of one service might depend on socket
activation and because of the parallel execution of units.
# 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.
└─firstname.lastname@example.org @9.268s +4.601s
└─systemd-user-sessions.service @9.159s +89ms
systemd-analyze plot prints an SVG graphic detailing which system
services have been started at what time, highlighting the time they
spent on initialization.
# systemd-analyze plot > plot.svg
# eog plot.svg
systemd-bootchart is a tool that generates a SVG graph with information
about processes resources utilization (cpu, memory and I/O).
It can be executed at any time but is usually ran at boot time to collect information during the boot process in order to analyse and optimise it.
systemd-bootchart can be executed at boot time by passing
init=/lib/systemd/systemd-bootchart to the kernel command line.
There are different options that can be passed to bootchart to tune its
execution. These can also be set on
for information about the different options.
systemd-bootchart is provided in the
development Apertis repository.
Ensure this is installed and change the kernel command line by editing
/boot/extlinux/extlinux.conf and adding
init=/lib/systemd/systemd-bootchart to the end of the
for the required boot option.
systemd-bootchart will be invoked as the
init process and it will in turn fork and execute the real init so the
system can be booted as normal while bootchart collect the system
information during the boot process.
After a few seconds (20 by default but configurable in bootchart.conf) the data collection stops and the graph is generated. A message similar to the following will be shown:
systemd-bootchart wrote /run/log/bootchart-19700101-0000.svg
Displaying the svg generated will yield a graph similar to this: