Andrea PazGuideInformaticaMondo Linuxsystemd

Usare systemd-analyze

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

Marco Giannini

Quello del pacco / fondatore di Marco’s Box