Commit bb150966 authored by Harald Hoyer's avatar Harald Hoyer

systemd-analyse: add "critical-chain" command

"critical-chain" prints a tree of the critical chain of units

$ ./systemd-analyze critical-chain
graphical.target @1.226s
└─multi-user.target @1.226s
  └─nfs-lock.service @961ms +265ms
    └─rpcbind.service @958ms +1ms
      └─network.target @957ms
        └─NetworkManager.service @434ms +522ms
          └─basic.target @428ms
            └─sockets.target @428ms
              └─dbus.socket @428ms
                └─sysinit.target @427ms
                  └─systemd-tmpfiles-setup.service @411ms +15ms
                    └─local-fs.target @410ms
                      └─boot-efi.automount @410ms
                        └─boot.mount @397ms +9ms
                          └─local-fs-pre.target @192ms
                            └─systemd-udevd.service @187ms +5ms
                              └─systemd-udevd-control.socket @140ms
                                └─-.mount

With the "--fuzz=<ms>" parameter one can display more units around
the critical units.

$ ./systemd-analyze --fuzz=10ms critical-chain
└─multi-user.target @1.226s
  └─nfs-lock.service @961ms +265ms
    ├─rpcbind.service @958ms +1ms
    │ └─network.target @957ms
    │   └─NetworkManager.service @434ms +522ms
    │     ├─basic.target @428ms
    │     │ ├─sockets.target @428ms
    │     │ │ ├─dbus.socket @428ms
    │     │ │ │ └─sysinit.target @427ms
    │     │ │ │   ├─systemd-tmpfiles-setup.service @411ms +15ms
    │     │ │ │   │ └─local-fs.target @410ms
    │     │ │ │   │   └─boot-efi.automount @410ms
    │     │ │ │   │     └─boot.mount @397ms +9ms
    │     │ │ │   │       └─local-fs-pre.target @192ms
    │     │ │ │   │         └─systemd-udevd.service @187ms +5ms
    │     │ │ │   │           ├─systemd-udevd-control.socket @140ms
    │     │ │ │   │           │ └─-.mount
    │     │ │ │   │           └─systemd-udevd-kernel.socket @140ms
    │     │ │ │   └─swap.target @421ms
    │     │ │ │     └─dev-disk-by\x2duuid-....swap @414ms +6ms
    │     │ │ │       └─systemd-journald.socket
    │     │ │ ├─rpcbind.socket @428ms
    │     │ │ └─cups.socket @428ms
    │     │ ├─paths.target @428ms
    │     │ │ └─cups.path @428ms
    │     │ ├─timers.target @427ms
    │     │ │ └─systemd-tmpfiles-clean.timer @427ms
    │     │ └─sysinit.target @427ms
    │     │   └─...
    │     └─dbus.socket @428ms
    │       └─...
    └─network.target @957ms
      └─...
parent 17f5e457
......@@ -34,6 +34,12 @@
<surname>Poettering</surname>
<email>lennart@poettering.net</email>
</author>
<author>
<contrib>Developer</contrib>
<firstname>Harald</firstname>
<surname>Hoyer</surname>
<email>harald@redhat.com</email>
</author>
</authorgroup>
</refentryinfo>
......@@ -54,6 +60,9 @@
<cmdsynopsis>
<command>systemd-analyze <arg choice="opt" rep="repeat">OPTIONS</arg> blame </command>
</cmdsynopsis>
<cmdsynopsis>
<command>systemd-analyze <arg choice="opt" rep="repeat">OPTIONS</arg> critical-chain </command>
</cmdsynopsis>
<cmdsynopsis>
<command>systemd-analyze <arg choice="opt" rep="repeat">OPTIONS</arg> plot <arg choice="opt">&gt; file.svg</arg></command>
</cmdsynopsis>
......@@ -88,6 +97,16 @@
be slow simply because it waits for the initialization
of another service to complete.</para>
<para><command>systemd-analyze critical-chain</command>
prints a tree of the time critical chain of units.
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.</para>
<para><command>systemd-analyze plot</command> prints
an SVG graphic detailing which system services have
been started at what time, highlighting the time they
......@@ -181,6 +200,19 @@
unit name must match one of given
values.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--fuzz=</option><replaceable>timespan</replaceable></term>
<listitem><para>When used in conjunction
with the <command>critical-chain</command>
command (see above), also show units, which
finished <replaceable>timespan</replaceable> earlier, than the
latest unit in the same level. The unit of
<replaceable>timespan</replaceable> is seconds
unless specified with a different unit,
i.e. "50ms".</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
......
......@@ -31,6 +31,7 @@ _systemd_analyze() {
local -A VERBS=(
[NO_OPTION]='time blame plot'
[CRITICAL_CHAIN]='critical-chain'
[DOT]='dot'
)
......@@ -57,6 +58,11 @@ _systemd_analyze() {
comps='--help --version --system --user'
fi
elif __contains_word "$verb" ${VERBS[CRITICAL_CHAIN]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user --fuzz'
fi
elif __contains_word "$verb" ${VERBS[DOT]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user --from-pattern --to-pattern --order --require'
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment