Processi e scritture su disco - atop

Da più di un anno ormai tengo monitorate le scritture sui dischi dei server che mi trovo a gestire. Avendo iniziato per testare la durata di alcuni ssd (qui e qui) , ho poi notato che, mantenere in piedi la misurazione,  permetteva di accorgersi delle anomalie nell'uso dei server, che spesso costituivano degli indizi fondamentali nel risolvere problemi: ricordo per esempio un'intrusione su un famoso cms che era stato installato e che ha prodotto per giorni dei picchi sulle attività degli hard disk.

Le scritture su disco le tengo monitorate scrivendo ogni giorno su un file l'output (opportunamente sistmato) di /proc/diskstats e facendo girare in cron il comando sa di sysstat: questi cron generano ogni giorno un file binario in /var/log/sa, chiamato saNN, che contiene  una moltitudine di informazioni (cpu, memoria etc). Si può poi andare a interrogare uno di questi file (sa10 corrisponde al log generato il 10 del mese) e vedere le scritture su disco memorizzate ogni tot minuti. Per esempio:

-d -> Mostra le attività sui block device
-p -> Scrive i nomi del block device in modo leggibile (pretty)

Il mio problema è sempre stato però capire, in un certo lasso di tempo, quali sono stati i processi che hanno provocato le scritture/letture sul block device che sto analizzando.

Il primo comando che ho iniziato a utilizzare si chiama iotop (che fa parte dell'omonimo pacchetto). Lanciato con opportuni parametri (trovati in rete) e filtrando l'output si può vedere in tempo reale quali processi stanno scrivendo sui dischi. Per esempio

qqq -> Molto quiet. non stampa il sommario, la legenda etc
k -> Output in kb
b -> Non interactive
o -> Mostra solo i processi che fanno I/O
t  -> Mostra anche il timestamp
P -> Mostra solo i processi (e non tutti i threads)
--iter=60 -> Effettuo 60 iterazioni, di default 1 al secondo (per cui monitorizza 60 secondi)

grep -P (quella che segue è una perl regexp) che compatta un po' l'output
\d\d inizia con 2 digit (numeri)
\. segue un punto
\d\d altri 2 numeri
K/s e poi la stringa K/s
(se ci sono meno di 2 numeri , ovvero un transfer minore di 10 KB/sec non registra)

Questo è uno strumento molto semplice e comodo se, in tempo reale, ho bisogno di capire chi sta scrivendo su disco. Non mi serve però per fare indagini retroattive, ovvero scoprire (per esempio) 20 giorni fa che processi hanno scritto su disco dalle 10 alle 12 del mattino.Per risolvere questo problema (almeno parzialmente) posso utilizzare atop.

L'installazione su centos 7 è banale, e consiste di un yum install atop.

In /etc/cron.d/ verrà creato un file chiamato atop che non fa altro che verificare alla mezzanotte di ogni giorno che il demone sia in funzione.

try-restart prova a riavviare il demone se in qualche modo stava funzionando: è l'analogo di cond-restart e non avvia di sua iniziativa il demone nel caso in cui lo avessi fermato io manualmente.

L'unità di systemd che avvia il demone richiama /usr/bin/atopd

che altro non è che uno script di shell che legge alcuni parametri di configurazione in /etc/sysconfig/atop, e scrive in /var/log/atop_YYYYMMDD i log del giorno a intervalli di 600 sec (di default).

Per vedere con che parametri sta funzionando atopd in questo momento

-a logga tutti i processi anche quelli disattivi
-w /var/log/atop/atop_20150518 sta scrivendo i log di giornata nel file specificato

Fatto questo potremo usare atop in maniera interattiva (tipo top), oppure fargli produrre un output analizzabile con altri strumenti (parsable). Non è mia intenzione scrivere una guida su come utilizzare atop, il manuale è davvero ben fatto e va letto con molta attenzione.

Usare atop in maniera interattiva non vuol dire analizzare necessariamente i dati in tempo reale: col comando

andremo a leggere l'ultimo file di log memorizzato (quello della giornata stessa in cui lo si lancia). Specificando dopo -r il nome di un file di log (atop -r /var/log/atop_20150523) andremo ad analizzare i log del 23/05/2015.

Torniamo al mio caso, vedo che durante la giornata del 28/05 ho avuto delle scritture eccessive sul disco.
Digito atop -r /var/log/atop_20150528.
La prima schermata mi mostra i dati incrementali dall'ultimo riavvio: in alto a destra vedrò il tempo trascorso.
Premendo T o t inizio a spostarmi avanti o indietro nel tempo di 10 minuti (600 sec di default). La prima fetta che posso analizzare è quindi quella che va dalle 00:00:00 fino alle 00:10:01.
Ordino i processi per utilizzo di disco premendo D e mostro l'utilizzo dello stesso premendo d. A questo punto avanzo col tempo fino a vedere delle scritture "anomale".
Nella fetta temporale che va dalle 11.38 alle 11.48 noto che

ovvero bash dell'utente "UTENTE"  ha scritto 2GB. La visualizzazione per disk usage, relativamente a questo medesimo slice mi dice che

Posso anche utilizzare la modalità non interattiva, sapendo la fetta temporale incriminata

Ne concludo quindi che l'utente "UTENTE" tramite un comando o uno script bash ha effettuato quella scrittura da 2GB sul block device sdb.
In generale non riesco però, tramite atop, a capire immediatamente quale comando è stato lanciato quando il processo che ha generato la scrittura è terminato: atop ne memorizza il pid ma poi, se non analizzato in tempo reale, la scrittura viene attribuito al processo parent, che quasi sicuramente sarà init o systemd.

 

Print Friendly, PDF & Email