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.