Améliorer le temps de démarrage des distributions GNU/Linux
Y-a-t-il un outil qui montre le temps pris par les services pendant la phase de démarrage ? Comment puis-je trouver des processus bloquants et accélérer mon temps de démarrage ?
– Il existe plusieurs méthodes pour découvrir quels processus ralentissent le temps global de démarrage du système.
– La plupart des distributions de nos jours exécutent le logiciel d’initialisation et daemon ‘systemd‘ qui a été spécifiquement conçu pour le noyau Linux comme alternative à System V.
– En supposant que votre distribution utilise ‘systemd’, il existe un utilitaire spécial pour analyser le processus de démarrage et le temps nécessaire au lancement des services.
♦ Dans cet article, j’utilise :
- Distribution Linux Mint 19.1 Cinnamon 64-bit
- CPU Intel Core i7-720QM (1ère génération de 2009) @ 1.60 GHz × 4
- RAM DDR3 8 Go (2 x 4 Go)
- SSD Crucial 500 Go (2019)
- Carte graphique discrète NVIDIA GeForce GT 230M [GT216M]) :
♦ ‘systemd‘
Pour confirmer que votre distribution utilise systemd, exécutez la commande suivante dans un Terminal (Crtl + Alt + T), elle vous indiquera si votre système d’exploitation exécute systemd ou pas :
grep systemd /proc/1/comm && echo I am using systemd || echo I am not using systemd
Résultat dans le Terminal sur mon Linux Mint 19.1 Cinnamon 64-bit :
systemd I am using systemd
♦ Analyser et déboguer le gestionnaire du système avec ‘systemd-analyze‘
En plus d’Internet, la documentation de l’utilitaire systemd-analyze est directement accessible dans votre distribution GNU/Linux en entrant la commande suivante dans un Terminal (Crtl + Alt + T) :
man systemd-analyze
Les distributions GNU/Linux utilisant systemd peuvent exécuter la commande suivante dans un Terminal (Crtl + Alt + T) pour voir le temps total de lancement du système GNU/Linux :
systemd-analyze
systemd-analyze peut être utilisé pour déterminer les statistiques de performances de démarrage du système, extraire d’autres informations d’état et de traçage du système et du gestionnaire de services, ainsi que pour vérifier l’exactitude des fichiers d’unité. Il est également utilisé pour accéder à des fonctions spéciales utiles au débogage avancé du gestionnaire système.
Si aucun paramètre n’est transmis à la commande, alors systemd-analyze time est appliquée.
Le résultat dans le Terminal est décomposé en Temps noyau Linux (Kernel) et Temps espace utilisateur (userspace), ainsi que le Temps accès utilisateur complet avec affichage graphique et mise en réseau (graphical.target). Cela peut ressembler à ceci (ici Linux Mint 19.1) :
Startup finished in 7.108s (kernel) + 13.303s (userspace) = 20.412s graphical.target reached after 11.504s in userspace
♦ ‘systemd-analyze blame‘
La commande suivante dans un Terminal (Crtl + Alt + T) permet de voir quels processus sont lancés au démarrage du système et combien de temps chacun prend pour être opérationnel :
systemd-analyze blame
systemd-analyze blame imprime une liste de toutes les unités en cours d’exécution, classées par le temps qu’elles ont pris pour s’initialiser. Ces informations peuvent être utilisées pour optimiser les temps de démarrage. Notez que la sortie peut être trompeuse car l’initialisation d’un service peut être lente, simplement parce qu’elle attend l’initialisation d’un autre service.
Remarque : systemd-analyze blame ne permet pas d’afficher les résultats des services de Type=simple, car systemd considère que ces services doivent être démarrés immédiatement. Par conséquent, aucune mesure des délais d’initialisation ne peut être effectuée.
Le résultat dans le Terminal est une liste de services de démarrage, triés par ordre chronologique descendant. Cela peut ressembler à ceci (ici Linux Mint 19.1) :
7.877s NetworkManager-wait-online.service 3.029s udisks2.service 1.664s dev-sda5.device 1.224s systemd-journal-flush.service 1.141s snapd.service 1.083s apt-daily.service 817ms apt-daily-upgrade.service 531ms lvm2-monitor.service 360ms NetworkManager.service 353ms systemd-logind.service 315ms apparmor.service 311ms systemd-udevd.service 293ms dev-disk-by\x2duuid-5105b258\x2d9bfe\x2d4fb7\x2d9a32\x2d622866176b78.swap 282ms ubuntu-system-adjustments.service 273ms systemd-tmpfiles-setup.service 272ms networkd-dispatcher.service 271ms speech-dispatcher.service 257ms upower.service 218ms apport.service 206ms systemd-resolved.service 201ms grub-common.service 187ms accounts-daemon.service 175ms dev-loop4.device 171ms dev-loop0.device 170ms systemd-timesyncd.service 152ms snap-core-6673.mount 149ms ModemManager.service 147ms dev-disk-by\x2duuid-ac0dc5c9\x2d0d2d\x2d4c0b\x2d864b\x2d59d80336447d.swap 147ms dev-loop3.device 146ms systemd-journald.service 145ms dev-loop2.device 138ms keyboard-setup.service 137ms bluetooth.service 135ms dev-loop1.device 130ms systemd-udev-trigger.service 123ms avahi-daemon.service 109ms virtualbox.service 103ms lightdm.service 102ms iio-sensor-proxy.service 101ms plymouth-quit-wait.service 100ms user@1000.service 98ms wpa_supplicant.service 92ms gpu-manager.service 90ms lm-sensors.service 84ms snap-audovia-58.mount 84ms rsyslog.service 82ms systemd-fsck@dev-disk-by\x2duuid-6cb54d34\x2dcc61\x2d405c\x2d8428\x2dabdd20234fcb.service 77ms snap-core-6818.mount 73ms systemd-tmpfiles-setup-dev.service 69ms systemd-modules-load.service 69ms thermald.service 62ms snap-audovia-57.mount 56ms packagekit.service 52ms snapd.seeded.service 49ms snap-core-6964.mount 47ms alsa-restore.service 41ms networking.service 37ms colord.service 33ms polkit.service 29ms pppd-dns.service 28ms systemd-tmpfiles-clean.service 26ms hddtemp.service 22ms dev-mqueue.mount 22ms dev-hugepages.mount 20ms kerneloops.service 20ms systemd-remount-fs.service 19ms ufw.service 19ms kmod-static-nodes.service 17ms plymouth-start.service 15ms plymouth-read-write.service 15ms dev-disk-by\x2duuid-04c60215\x2d90d4\x2d4683\x2d8429\x2dad3fdc3714f8.swap 15ms home.mount 14ms ureadahead-stop.service 14ms sys-kernel-debug.mount 13ms systemd-update-utmp.service 12ms dns-clean.service 11ms systemd-sysctl.service 9ms systemd-random-seed.service 9ms systemd-update-utmp-runlevel.service 8ms systemd-backlight@backlight:acpi_video0.service 7ms systemd-rfkill.service 6ms rtkit-daemon.service 6ms openvpn.service 5ms sys-fs-fuse-connections.mount 5ms console-setup.service 5ms motd-news.service 5ms blk-availability.service 4ms sys-kernel-config.mount 3ms setvtrgb.service 2ms systemd-user-sessions.service 991us snapd.socket
♦ ‘systemd-analyze critical-chain‘
La commande systemd-analyze peut également afficher des goulots d’étranglement dans les performances de démarrage. La commande suivante dans un Terminal (Crtl + Alt + T) affiche les services qui démarrent avec des indicateurs montrant à quelle heure ils ont commencé et combien de temps ils ont pris pour démarrer :
systemd-analyze critical-chain
systemd-analyze critical-chain imprime une arborescence de la chaîne d’unités critique pour le temps (pour chacune des unités spécifiées ou pour la cible par défaut sinon). Le temps après que l’unité soit active ou démarrée est imprimé après le caractère ‘@’. Le temps nécessaire au démarrage de l’unité est imprimé après le caractère ‘+’. Notez que la sortie peut être trompeuse car l’initialisation des services peut dépendre de l’activation d’un socket et du fait de l’exécution parallèle des unités.
La sortie dans le Terminal du paramètre chaîne critique peut ressembler à ceci (ici Linux Mint 19.1) :
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 @11.504s └─multi-user.target @11.504s └─virtualbox.service @11.394s +109ms └─network-online.target @11.390s └─NetworkManager-wait-online.service @3.512s +7.877s └─NetworkManager.service @3.149s +360ms └─dbus.service @3.123s └─basic.target @3.093s └─sockets.target @3.093s └─snapd.socket @3.091s +991us └─sysinit.target @3.087s └─swap.target @3.087s └─dev-disk-by\x2duuid-ac0dc5c9\x2d0d2d\x2d4c0b\x2d864b\x2d59d80336447d.swap @2.939s +147ms └─dev-disk-by\x2duuid-ac0dc5c9\x2d0d2d\x2d4c0b\x2d864b\x2d59d80336447d.device @2.938s
Les chiffres après le symbole ‘@’ indiquent quand la cible a été atteinte et le nombre après le ‘+’ indique le temps nécessaire au service pour démarrer. Dans les sorties Terminal ci-dessus, nous pouvons voir, par exemple, que le service NetworkManager-wait-online prend le temps le plus long (7,877s secondes) pour démarrer, ce qui correspond à peu près au tiers du temps de démarrage total (25,356 secondes). Nous devrons peut-être modifier sa configuration ou déterminer pourquoi il met si longtemps ou pas à mener à bien ses tâches.
♦ ‘systemd-analyze plot‘
Enfin, examinons une autre commande importante qui permet de produire des détails graphiques (au format *.svg) des services système qui ont été démarrés et à quelle heure, en soulignant leur heure d’initialisation.
Exécuter la commande suivante dans un Terminal (Crtl + Alt + T) pour créer un graphique boot-time_analysis.svg dans votre répertoire /home (dépend d’où vous avez ouvert votre Terminal) :
systemd-analyze plot > boot-time_analysis.svg
Et nous obtenons un beau graphique détaillé et explicite (ici Linux Mint 19.1) :
♦ Conclusion
Fondamentalement, l’un des moyens les plus simples d’améliorer les temps de démarrage du système est de déterminer les services en cours d’exécution dont nous n’avons pas besoin et de les désactiver ou de les désinstaller. L’utilitaire systemd-analyse permet d’identifier non seulement les services qui démarrent, mais également ceux qui entraînent le plus de retards.
Pour les utilisateurs de disques durs à rotation (HDD), si les ressources nécessaires sont disponibles, l’un des moyens les plus simples pour améliorer les temps d’amorçage consiste à passer à l’utilisation d’un disque SSD (Solid State Drive), ce qui est mon cas depuis quelques mois. Les SSD sont plus rapides que leurs homologues HDD et ils lisent mieux les petits fichiers placés au hasard, ce qui tend à améliorer les temps de démarrage.
Documentation à consulter
- systemd – Wiki Debian – systemd est un gestionnaire de système et de services pour le noyau Linux. Il est le système d’init par défaut dans Debian depuis Jessie et les distributions GNU/Linux dérivées comme Ubuntu et variantes, Linux Mint. etc. Systemd est compatible avec les scripts d’init SysV et LSB. Il peut fonctionner comme un remplaçant de sysvinit.
- systemd – Wiki Ach Linux – systemd est un gestionnaire de système / service. Il permet entre autre un démarrage en parallèle, à la demande, par activation D-Bus ou socket, un suivi des services etc.
- systemd System and Service Manager – site du projet Systemd sur freedesktop.org
- systemd-analyze – site du projet sur freedesktop.org
- systemd, init – systemd system and service manager
- systemctl – Control the systemd system and service manager
- Improving performance/Boot process – Arch Linux Wiki