Depuis quelques temps, je trouve que le temps de démarrage de mon PC sous Ubuntu est bien long... alors que le disque principal est un SSD.
Identifier le temps total de démarrage
Sur les O.S. qui utilisent systemd, il existe une commande permettant de connaître le temps nécessaire au démarrage : systemd-analyze.
Sans option, cette commande donne juste le temps total nécessaire au démarrage, ainsi que le temps après lequel on arrive à l'écran de connexion. Exemple :
systemd-analyze Startup finished in 8.078s (kernel) + 52.777s (userspace) = 1min 856ms graphical.target reached after 27.874s in userspace
Identifier les services les plus lents
La commande system-analyze utilisée avec l'option blame donne la liste des services en cours, triés par ordre de temps nécessaire à leur initialisation (ordre décroissant).
Exemple :
systemd-analyze blame
24.810s apt-daily.service
16.382s lvm2-pvscan@8:2.service
6.372s NetworkManager-wait-online.service
5.261s plymouth-quit-wait.service
2.539s dev-sdb1.device
1.871s systemd-journal-flush.service
1.010s apt-daily-upgrade.service
929ms postfix@-.service
901ms fwupd.service
876ms grub-common.service
838ms udisks2.service
831ms lvm2-monitor.service
824ms plymouth-start.service
822ms accounts-daemon.service
784ms systemd-hwdb-update.service
769ms libvirtd.service
749ms snapd.service
707ms NetworkManager.service
638ms networking.service
627ms ModemManager.service
577ms data.mount
574ms phpsessionclean.service
.../...
13ms ureadahead-stop.service
10ms systemd-update-utmp.service
10ms systemd-update-utmp-runlevel.service
7ms systemd-user-sessions.service
7ms resolvconf.service
6ms var-tmp.mount
4ms setvtrgb.service
3ms sys-kernel-config.mount
3ms postfix.service
Note : le temps de démarrage d'un service peut être long car il attend la fin d'un autre service.
On peut utiliser l'option critical-chain pour identifier toute la chaine des services qui sont sur le "chemin critique", ce qui permet de mieux cibler les pistes d'amélioration.
Exemple :
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.
graphical.target @27.874s
└─multi-user.target @27.874s
└─postfix.service @27.870s +3ms
└─postfix@-.service @26.939s +929ms
└─network-online.target @26.938s
└─NetworkManager-wait-online.service @20.565s +6.372s
└─NetworkManager.service @19.850s +707ms
└─dbus.service @19.796s
└─basic.target @19.782s
└─sockets.target @19.782s
└─snapd.socket @19.756s +22ms
└─sysinit.target @19.733s
└─systemd-timesyncd.service @19.580s +152ms
└─systemd-tmpfiles-setup.service @19.501s +73ms
└─local-fs.target @19.490s
└─run-user-1000-gvfs.mount @39.321s
└─run-user-1000.mount @35.922s
└─swap.target @2.766s
└─dev-disk-by\x2duuid-4d84083a\x2d5db7\x2d4856\x2d8642\x2defa9
└─dev-disk-by\x2duuid-4d84083a\x2d5db7\x2d4856\x2d8642\x2def
Comme l'indique la commande, le temps de démarrage du service (unit dans la terminologie systemd) est donné après le caractère '+'.
Dans l'exemple ci-dessus, on constate donc que l'on passe près de 8 secondes avec les services :
- NetworkManager (707 ms)
- NetworkManager-wait-online (6372ms)
- postfix (932ms)
Optimisation
La liste des services "lents" doit ensuite être analysée, en fonction du contexte. Sur mon PC personnel, je n'ai pas forcément besoin de lancer à chaque démarrage :
- un serveur nginx
- les daemon libvirtd et qemu (pour des VM KVM)
- le service ModemManager (mais pourquoi donc)
- un serveur postfix
On peut donc désactiver les différents services au démarrage :
sudo systemctl disable nginx sudo systemctl disable libvirtd sudo systemctl disable postfix sudo systemctl disable ModemManager
Sachant qu'on pourra toujours démarrer les services manuellement, par exemple :
# démarrage nginx sudo systemctl start nginx
On peut ensuite rebooter pour vérifier l'impact :
systemd-analyze Startup finished in 8.293s (kernel) + 27.220s (userspace) = 35.514s graphical.target reached after 26.075s in userspace
On a gagné environ 30 secondes sur le temps de démarrage. Par contre l'écran de connexion ne s'affiche qu'une seconde plus tôt.
On a aussi désactivé des processus et donc potentiellement amélioré l'utilisation de la mémoire et de la CPU.