起動時間が長くなった時、何にそんなに時間がかかってるんだ!と思うことがある。
それを調査してくれるコマンドがあった。
それが、systemd-analyze

使い方は簡単。 systemd-analyze と打って Enter を押すだけ。

systemd-analyze の実行結果

1
2
# systemd-analyze
Startup finished in 666ms (kernel) + 2.171s (initrd) + 4.705s (userspace) = 7.542s

kernel, initrd, userspace それぞれの合計時間をだしてくれる。

より詳細を知りたい場合は、blame オプションを使う。

systemd-analyze blame の実行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# systemd-analyze  blame
1.120s firewalld.service
1.032s network.service
987ms boot.mount
712ms tuned.service
574ms vboxadd.service
458ms vboxadd-x11.service
320ms systemd-vconsole-setup.service
293ms lvm2-monitor.service
189ms rhel-readonly.service
179ms systemd-logind.service
168ms rsyslog.service
141ms systemd-udev-trigger.service
139ms systemd-tmpfiles-setup-dev.service
126ms rhel-dmesg.service
121ms NetworkManager.service
114ms auditd.service
102ms systemd-user-sessions.service
95ms polkit.service
94ms kmod-static-nodes.service
86ms vboxadd-service.service
84ms systemd-random-seed.service
75ms sys-kernel-debug.mount
75ms systemd-sysctl.service
56ms dev-mqueue.mount
56ms dev-hugepages.mount
56ms lvm2-pvscan@8:2.service
45ms systemd-tmpfiles-setup.service
34ms systemd-remount-fs.service
32ms systemd-journal-flush.service
31ms sm-client.service
28ms sendmail.service
18ms dev-mapper-centos\x2dswap.swap
13ms systemd-udevd.service
10ms sys-kernel-config.mount
10ms systemd-update-utmp-runlevel.service
4ms systemd-update-utmp.service

起動に時間のかかったユニット順に出力してくれる。

どのユニットが問題か知りたい場合は、 critical-chain オプション

systemd-analyze critical-chain の実行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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 @4.686s
└─sshd.service @4.436s
└─network.target @4.429s
└─network.service @3.394s +1.032s
└─NetworkManager.service @3.266s +121ms
└─firewalld.service @2.139s +1.120s
└─basic.target @2.130s
└─paths.target @2.128s
└─brandbot.path @2.128s
└─sysinit.target @2.115s
└─systemd-update-utmp.service @2.106s +4ms
└─auditd.service @1.988s +114ms
└─systemd-tmpfiles-setup.service @1.936s +45ms
└─local-fs.target @1.926s
└─boot.mount @936ms +987ms
└─dev-disk-by\x2duuid-1320e8a2\x2da3f3\x2d4a2f\x2d8ff6\x2d6c533eee9dd7.device @871ms

結果をsvgファイルで視覚的に表示するには prot オプション

systemd-analyze plot > result.svg の実行結果

[result.svg]

このように視覚的に出力することも出来る。

詳細なログを出したい時は、 dump オプション

systemd-analyze dump の実行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# systemd-analyze  dump
-> Unit network.service:
Description: LSB: Bring up/down networking
Instance: n/a
Unit Load State: loaded
Unit Active State: active
Inactive Exit Timestamp: Tue 2015-06-02 14:51:10 UTC
Active Enter Timestamp: Tue 2015-06-02 14:51:11 UTC
Active Exit Timestamp: n/a
Inactive Enter Timestamp: n/a
GC Check Good: yes
Need Daemon Reload: no
Transient: no
Slice: system.slice
CGroup: /system.slice/network.service
CGroup realized: yes
CGroup mask: 0x0
Name: network.service
Source Path: /etc/rc.d/init.d/network
Condition Timestamp: Tue 2015-06-02 14:51:10 UTC
Condition Result: yes
Requires: basic.target
(省略)

詳細を追うことが出来る。

重い原因を特定して、起動を爆速にしてしまおう。