Linuxでシステムの起動時間を調べる

はじめに

LinuxのシステムでOSの起動時間を調べるためにはsystemd-analyzeというツールが使えるみたいです。 このブログではsystem-analyzeについてまとめ、いくつかの機能を試してみたいと思います。

systemd-analyzeとは

Linuxシステムの起動時の情報を解析するためのツールです。システムの起動にかかった時間とユニットサービスの起動にかかった時間を解析することができます。
systemdのビルドインのツールなので、systemdを使っているLinuxシステムであれば特にインストールなどを行なう必要がありません。

使ってみる

環境

実行環境は以下の通りです。

$ lsb_release -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal


$ uname -srvmpio
Linux 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

総合的な起動時間を調べる

system-analyzeを引数なしで実行すると、system-analyze timeが実行されます。このコマンドではKernelが起動に使った 時間とuserspaceが初期化に使った時間を調べることができます。

$ systemd-analyze 
Startup finished in 8.832s (firmware) + 8.755s (loader) + 2.129s (kernel) + 10.654s (userspace) = 30.371s 
graphical.target reached after 10.646s in userspace

ちなみに、manによると、Dockerなどのコンテナ内でこのコマンドを実行するとuserspaceのみの時間が出力されるっぽいです。

各ユニットサービスの起動にどのくらいの時間がかかっているかを調べる

system-analyze balmeを使うことで、各ユニットサービスが起動にどのくらいの時間を使っているのかを調べることができます。
リストは起動時間の降順で表示されるため、どのユニットサービスの起動に時間がかかっているかを調べ、最適化を行なうためのインプットとして利用することができます。

$ systemd-analyze blame | head
6.504s NetworkManager-wait-online.service                   
2.713s snap-gnome\x2d3\x2d34\x2d1804-36.mount               
2.671s snap-gnome\x2dsystem\x2dmonitor-148.mount            
2.535s postgresql@12-main.service                           
2.440s postgresql@10-main.service                           
2.357s dev-loop8.device                                     
2.326s dev-loop9.device                                     
2.233s dev-loop11.device                                    
2.170s dev-loop12.device                                    
2.169s dev-loop10.device   

起動時のクリティカルチェインを調べる

systemd-analyze critical-chainを使うことでクリティカルチェインを出力することができます。

$ systemd-analyze critical-chain
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.

graphical.target @10.646s
└─multi-user.target @10.646s
  └─docker.service @9.905s +740ms
    └─network-online.target @9.903s
      └─NetworkManager-wait-online.service @3.397s +6.504s
        └─NetworkManager.service @3.262s +133ms
          └─dbus.service @3.252s
            └─basic.target @3.220s
              └─sockets.target @3.220s
                └─libvirtd-ro.socket @3.220s
                  └─libvirtd.socket @3.217s +2ms
                    └─sysinit.target @3.209s
                      └─systemd-timesyncd.service @3.087s +121ms
                        └─systemd-tmpfiles-setup.service @3.044s +38ms
                          └─local-fs.target @3.035s
                            └─run-vmblock\x2dfuse.mount @10.091s
                              └─local-fs-pre.target @314ms
                                └─lvm2-monitor.service @228ms +85ms
                                  └─systemd-journald.socket @222ms
                                    └─-.mount @219ms
                                      └─system.slice @219ms
                                        └─-.slice @219ms