Optimisation du temps de démarrage Ubuntu Linux

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.

Catégorie