Usare systemd-analyze

by Andrea Paz on

systemd-analyze è un comando da terminale che ci permette di analizzare il boot, alla ricerca di problemi che rallentano questa fase o suggerire ottimizzazioni per velocizzarla.

Il primo, semplice, comando è (si può omettere "time" che è usato di default):

 

$ systemd-analyze time

Startup finished in 15.573s (firmware) + 2.394s (loader) + 2.030s (kernel) + 1.914s (userspace) = 21.913s

graphical.target reached after 1.826s in userspace

 

Si vede che il boot sul mio PC è durato 22s in totale.

Possiamo approfondire la conoscenza del processo di avvio con il comando:

 

$ systemd-analyze blame

1.625s systemd-random-seed.service

1.359s systemd-resolved.service

544ms cpupower.service

124ms dev-nvme0n1p2.device

97ms udisks2.service

[...]

 

che mostra la durata di ogni servizio in successione. In realtà la lista non tiene conto dei rapporti fra i servizi (quale unità aspetta un’altra prima di avere il permesso di partire, ecc), per cui non è indicativa nel trovare le unità problematiche.

Per avere una lista gerarchica delle unità (service, target, device) si deve allora usare:

 

$ systemd-analyze critical-chain

The time when unit became active or started is printed after the "@" character.

The time the unit took to start is printed after the "+" character.

graphical.target @1.826s

└─sddm.service @1.825s

    └─systemd-user-sessions.service @1.819s +1ms

        └─network.target @1.815s

         [...]


che mostra un diagramma ad albero con le dipendenze di un'unità da un'altra. Questa lista è più informativa per la ricerca di problemi e ottimizzazioni. Per esempio se troviamo che il servizio "systemd-udev-settle.service" ci mette parecchio tempo ad avviarsi e sappiamo che non è utilizzato (nella maggioranza dei casi è così!), lo possiamo mascherare in modo che venga saltato al prossimo boot.

Comunque questo comando non è di agevole lettura e interpretazione perché consiste in una lunga lista di testo.

Molto più comodo è il comando:

 

$ systemd-analyze plot >bootup.svg

 

che indirizza l'output (simile a quello di critical-chain) in una immagine svg da visualizzare comodamente con Inkscape o altro programma. Avere sotto gli occhi il grafico ad albero permette di vedere immediatamente quale unità ci mette più tempo ad avviarsi e diventa un blocco per i servizi successivi. In pratica, più la colonna rosa è stretta e verticale meno rallentamenti ci sono nel boot.

C'è ancora un altro comando che può essere utile:

 

 

$ systemd-analyze dot ...

 

Che permette di creare un grafico svg in cui sono mostrate tutte le relazioni fra un unità e l'altra. Ogni unità è visibile in un cerchio dedicato e ogni relazione è rappresentata da frecce di vari colori a seconda del tipo di relazione. Tale comando richiede però l'installazione dei programmi dot e graphviz. Un esempio di uso, per mostrare le relazioni fra i vari target, è il seguente:

 

 

$ systemd-analyze dot --to-pattern='*.target' –from-pattern='*.target' | dot -Tsvg >targets.svg

 

In generale, però, le unità e le loro relazioni sono talmente tante che l'immagine risultante è troppo densa e completamente illeggibile. L'unica possibilità è riuscire a circoscrivere il tipo di unità che vogliamo analizzare, per esempio:

 

 

$ systemd-analyze dot 'systemd-networkd.*' | dot -Tsvg > network.svg

Color legend:    black = Requires

                            dark blue = Requisite

                            dark grey = Wants

                            red = Conflicts

                            green = After

 

Ma questo implica di conoscere già i servizi problematici e quindi, nella maggior parte delle volte, è inutile.

Un percorso per individuare i problemi potrebbe allora essere:

 

 

$ systemd-analyze

$ systemd-analyze plot > boot.svg

 (da cui si ricava l’unità problematica)

 $ systemd-analyze dot ‘unit_name.*’ | dot -Tsvg > unit_name.svg

Leggi il contenuto originale su Marco's Box

Written by: Andrea Paz