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