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

Questi post potrebbero interessarti

disqus

Licenza

Licenza Creative Commons

Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 4.0 Internazionale. Questo blog non rappresenta una testata giornalistica, in quanto viene aggiornato senza alcuna periodicità. Non può, pertanto, considerarsi un prodotto editoriale, ai sensi della legge n. 62 del 7/03/2001.

Disclaimer immagini Le immagini utilizzate in questo blog appartengono ai loro rispettivi autori e sono utilizzati per scopi educativi, personali e senza scopo di lucro. Ogni eventuale violazione del copyright non è intenzionale, ma se si riconosce un'immagine protetta da copyright, fatemelo sapere qui, e sarò lieto di aggiungere i credits o modificarla o rimuoverla.

Disclaimer images Images used on this blog belong to their respective authors and are used for educational, personal and no profit purposes. Any eventual copyright infringement is not intentional, but if you recognize a copyrighted image, please let me know here, and I'll happily provide to add the right credits or modify or remove it.