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) :

Extrait (début) du graphique généré par la commande ‘systemd-analyze plot > boot-time_analysis.svg’ qui affiche le détail des services système qui ont été démarrés et à quelle heure, en soulignant leur heure d’initialisation.

♦ 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