The systemd project has an excellent tool systemd-analyze which allows an analysis of system boot performance.
Running without any parameters displays the startup time in total with figures for the kernel + userspace
$ systemd-analyze
Startup finished in 1.190s (kernel) + 8.312s (userspace) = 9.503s
The option
blame prints a list of all running units, ordered by the time they took to initialize. This may be used to optimize boot-up times. The output may be misleading as the initialization of one service might be slow simply because it waits for the initialization of another service to complete.
For example the 3 applications that took longest to initialise :
$ systemd-analyze blame | head -n 3
7.621s man-db.service
3.174s docker.service
1.134s mysqld.service
The option
critical-chain 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
For example reviewing the docker.service unit
$ systemd-analyze critical-chain docker.service
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.
docker.service +3.174s
`-network.target @1.287s
`-NetworkManager.service @830ms +172ms
`-dbus.service @691ms
`-basic.target @682ms
`-sockets.target @682ms
`-docker.socket @681ms +481us
`-sysinit.target @681ms
`-systemd-backlight@backlight:acpi_video0.service @1.321s +41ms
`-system-systemd\x2dbacklight.slice @1.320s
`-system.slice @123ms
`--.slice @102ms
The
plot option 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