Améliorer le temps de démarrage des distributions GNU/Linux

Joe Linux Utilitaires, Trucs et Astuces

 

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 :

♦ ‘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 :

1

2

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

1

2

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

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

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

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

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