Monitoraggio dell’I/O del disco con iostat e dstat
Introduzione
Il monitoraggio dell'input/output del disco (disk I/O) è uno dei compiti chiave nella gestione dei server in un'infrastruttura di hosting. Il sottosistema disco influisce direttamente sulle prestazioni dei servizi web, dei database, delle macchine virtuali, dei container e delle attività in background. Anche con RAM sufficiente e risorse CPU libere, un disco sovraccarico o lento può diventare il collo di bottiglia dell'intero sistema.
Questo manuale è destinato ad amministratori di sistema, ingegneri DevOps e proprietari di server. Tratta le utility iostat e dstat, i loro principi di funzionamento, l'interpretazione delle metriche e un approccio pratico per individuare i colli di bottiglia dell'I/O del disco in un ambiente di hosting.
Informazioni generali e principi di funzionamento
I/O del disco in un'infrastruttura server
L'input/output del disco comprende le operazioni di lettura e scrittura dei dati sui dispositivi a blocchi. Negli scenari reali di hosting, il carico sul sottosistema disco è generato più spesso da:
- database (MySQL, MariaDB, PostgreSQL);
- applicazioni web con contenuti dinamici;
- servizi di posta;
- backup e sincronizzazione dei dati;
- logging;
- swap e file temporanei;
- script utente e job cron.
I colli di bottiglia possono derivare da dispositivi di archiviazione lenti, forte contesa tra processi, scheduler di I/O non ottimali, funzionamento errato della cache o particolarità della virtualizzazione.
Finalità di iostat e dstat
iostat è un'utility del pacchetto sysstat progettata per raccogliere statistiche dettagliate sul carico della CPU e dei dispositivi disco. Il compito principale di iostat è mostrare con quale intensità viene utilizzato uno specifico disco, se è presente una coda di richieste e qual è il tempo medio di attesa delle operazioni.
dstat è uno strumento di monitoraggio versatile che visualizza in tempo reale le statistiche di più sottosistemi contemporaneamente: CPU, memoria, disco, rete, processi. Consente di correlare l'attività del disco con il carico complessivo del server ed è comodo per la diagnostica rapida.
Queste utility si completano a vicenda: iostat fornisce un quadro accurato a livello di dispositivo, mentre dstat offre il contesto dell'intero sistema.
Prerequisiti e requisiti
Prima di iniziare l'analisi devono essere soddisfatte le seguenti condizioni:
- Sistema operativo Linux (Debian, Ubuntu, AlmaLinux, Rocky Linux, CentOS).
- Accesso SSH al server.
- Privilegi di root o possibilità di eseguire comandi tramite sudo.
Verifica della versione del sistema operativo:
cat /etc/os-release
Installazione dei pacchetti necessari:
Debian / Ubuntu:
sudo apt update sudo apt install sysstat dstat
CentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install sysstat dstat # or sudo dnf install sysstat dstat
Verifica del funzionamento di sysstat:
systemctl status sysstat
Se il servizio è attivo, verranno visualizzate le informazioni corrispondenti:
root@server:~# systemctl status sysstat ● sysstat.service - Resets System Activity Logs Loaded: loaded (/usr/lib/systemd/system/sysstat.service; enabled; preset: enabled) Active: active (exited) since Tue 2025-12-23 10:35:35 UTC; 16min ago Docs: man:sa1(8) man:sadc(8) man:sar(1) Main PID: 731 (code=exited, status=0/SUCCESS) CPU: 7ms
Esame e analisi passo dopo passo
Analisi di base del disco con iostat
L'utility iostat serve a valutare il carico della CPU e del sottosistema disco, nonché a individuare ritardi e code di I/O.
Sintassi:
sudo iostat [options] [interval] [count]
Parametri più utilizzati:
- -x - statistiche estese;
- -d - solo dati del disco;
- -k - output in kilobyte;
- -p - statistiche per le partizioni o per un dispositivo specifico.
Esempio di base:
sudo iostat -x
Analisi dinamica:
sudo iostat -xk 5 3
L'intervallo e il numero di campioni consentono di seguire le variazioni del carico nel tempo, anziché lo stato medio dall'avvio del sistema.
Esempio di output di iostat

Metriche chiave della CPU:
- %iowait - la percentuale di tempo in cui la CPU è inattiva in attesa del completamento di operazioni di I/O. Un aumento di questa metrica indica l'impatto del disco sulle prestazioni complessive.
- %steal - rilevante per i server virtuali; mostra il tempo CPU «rubato».
Metriche chiave del disco:
- %util - la percentuale di tempo in cui il disco è stato occupato. Valori costantemente superiori all'80-90% indicano saturazione del dispositivo.
- r_await - il tempo medio (ms) di completamento delle operazioni di lettura (compreso il tempo in coda).
- w_await - il tempo medio (ms) di completamento delle operazioni di scrittura (compreso il tempo in coda).
- aqu-sz - (avg queue size) la lunghezza media della coda di richieste del disco. Un valore > 1 indica già la formazione di una coda. Un valore > 2-4 per HDD / > 1-2 per SSD è segno che il disco non regge il carico.
La differenza tra await e svctm mostra se il ritardo è causato dalla coda e non dalla velocità fisica del disco.
Se await supera svctm solo di poco (differenza < 20-30%), i ritardi sono dovuti principalmente al disco stesso (lettura/scrittura fisica lenta).
Se await è significativamente maggiore di svctm (differenza > 50-100%), il ritardo principale è causato dalla coda di richieste (aqu-sz sarà alto), il che indica un sovraccarico del disco dovuto a numerose richieste parallele.
Nelle versioni moderne di iostat (come nell'esempio) svctm non viene visualizzato perché il suo calcolo non è affidabile. Per l'analisi si utilizza la combinazione await + aqu-sz: un await alto con aqu-sz basso (~0) indica un disco lento; un await alto con aqu-sz alto (>1) indica che il disco è sovraccarico di richieste.
Analisi del quadro generale con dstat
dstat viene utilizzato per l'osservazione del sistema in tempo reale e per correlare il carico del disco con le altre risorse.
Esempi di comandi:
dstat -d dstat --disk-util dstat -rd --disk-util dstat -D vda,sda
Esempio di esecuzione con intervallo:
dstat -rd --disk-util 1 5
Durante l'analisi occorre prestare attenzione a:
- aumento di iowait della CPU;
- picchi di lettura o scrittura;
- attività simultanea di rete e disco (backup, sincronizzazione).
Example dstat output: dstat -rd --disk-util 1 5 --io/total- -dsk/total- vda- read write| read write|util 0 4.00 | 0 76k|0.50 0 29.5 | 0 240k|0.20 0 1.00 | 0 4096B| 0 0 0 | 0 0 | 0 0 1.00 | 0 32k| 0
Confronto tra dstat e iostat:
| Criterio | iostat | dstat |
|---|---|---|
| Accuratezza dei dati | Alta | Alta |
| Modalità in tempo reale | Limitata | Eccellente |
| Dati storici | Sì (sar) | No |
| Output colorato | No | Sì |
| Estensibilità | No | Plugin |
| Esportazione CSV | No | Sì |
| Carico sulla CPU | Basso | Medio |
dstat è particolarmente utile per i picchi di carico di breve durata, che in iostat non sono sempre evidenti.
Individuazione dei colli di bottiglia dell'I/O del disco
Per la diagnostica rapida si utilizzano i seguenti comandi:
sudo iostat -mx 2 sudo iostat -p /dev/vda 2 5 sar -d 1 5
Segnali tipici di un problema:
- %util superiore all'80% per un periodo prolungato;
- await superiore a 20-30 ms per SSD o superiore a 50-100 ms per HDD;
- aqu-sz superiore a 2-3, il che indica un accumulo di richieste in coda.
Nell'esempio viene utilizzato il disco /dev/vda: si tratta di un disco virtuale (VirtIO) su un server virtuale.
Sui server fisici e in altri ambienti i dischi possono avere nomi diversi:
- /dev/sdX (ad es. /dev/sda) - normali dischi SATA/SAS/USB
- /dev/nvmeXnY (ad es. /dev/nvme0n1) - unità NVMe
- /dev/vdX - dischi virtuali
Individuazione dei processi che causano un elevato carico di I/O del disco
Dopo aver accertato con iostat e dstat la presenza di un sovraccarico del sottosistema disco, il passo successivo consiste nell'individuare i processi specifici che avviano intense operazioni di lettura o scrittura. L'analisi a livello di dispositivo senza l'identificazione della sorgente del carico non consente di adottare misure correttive appropriate.
Utilizzo di iotop
Lo strumento principale per trovare i processi che utilizzano attivamente il disco è l'utility iotop.
sudo iotop -ao
Parametri del comando:
-a - mostra le statistiche cumulative dall'avvio del processo, il che aiuta a individuare attività in background con I/O di lunga durata;
-o - mostra solo i processi che stanno eseguendo operazioni di I/O in quel momento.
Esempio di output:
TID 41PRIO USER41DISK READ41DISK WRITE41SWAPIN41IO>4141COMMAND 1105641be/441mysql410.00 B 413.44 M410.00 %410.76 %41mysqld 258041be/441rsync410.00 B4123.48 M410.00 %411.17 %41rsync
Nell'output di iotop occorre prestare particolare attenzione ai campi DISK READ e DISK WRITE e alla percentuale di tempo di I/O. Tipicamente le sorgenti del carico sono processi di database, processi di backup, processi di sincronizzazione dei file o script utente.
Utilizzo di pidstat per l'analisi dell'I/O per singolo processo
Per un'analisi più formalizzata e ripetibile si può utilizzare pidstat, che fa parte del pacchetto sysstat.
pidstat -d 1
Questo comando restituisce le statistiche di I/O del disco per ciascun processo a intervalli di un secondo. È utile per individuare picchi di attività di breve durata e correlarli con altre metriche di sistema.
pidstat è particolarmente utile nelle situazioni in cui il carico si presenta periodicamente e non sempre viene rilevato da iotop.
Utilizzo di lsof per l'analisi dell'attività sui file
Nei casi in cui occorre capire con quali file o directory specifici lavora un processo, si utilizza l'utility lsof.
lsof +D /path
Dove /path è una directory specifica all'interno della quale si vogliono individuare i file e i processi attivi. Ad esempio, può trattarsi della directory del database, della directory dei backup o dell'area dei file temporanei.
Il comando consente di determinare quali processi detengono attualmente descrittori di file ed eseguono operazioni all'interno del percorso indicato, il che è particolarmente utile nell'analisi del carico generato dalle applicazioni.
Analisi del contesto del carico
Individuare un processo con elevata attività su disco non è l'obiettivo finale. L'amministratore deve valutare il contesto della sua esecuzione:
- se il carico è atteso per quel servizio;
- se il processo viene eseguito in un momento appropriato (ad es. backup durante le ore di punta);
- se è possibile modificare la pianificazione o i parametri di funzionamento;
- se è ammissibile ridurre la priorità di I/O.
Questo approccio consente di distinguere il carico normale da quello problematico e di scegliere il corretto metodo di ottimizzazione.
Verifica della correttezza dell'analisi
La correttezza dell'analisi eseguita è confermata se:
- i picchi di %util, await o aqu-sz in iostat coincidono nel tempo con l'attività dei processi in iotop o pidstat;
- l'aumento di iowait in dstat coincide con le operazioni su disco e non con il carico della CPU;
- le misurazioni ripetute mostrano un andamento del carico riproducibile.
Per l'accumulo dei dati e la successiva analisi si consiglia di utilizzare la registrazione su file:
sar -d 1 100 > io.log
Ciò consente di registrare il comportamento del sottosistema disco in un periodo definito e di utilizzare i dati durante l'analisi degli incidenti.
Errori tipici e particolarità operative
Nella pratica di gestione dei server di hosting, i problemi più frequenti sono i seguenti:
- esecuzione di backup e sincronizzazione dei dati durante le ore di punta;
- uso intensivo dello swap in caso di RAM insufficiente;
- uno scheduler di I/O non adatto al tipo di unità;
- assenza di prioritizzazione delle attività in background.
Per ridurre l'impatto dei processi in background sulle prestazioni, si consiglia di utilizzare l'utility ionice per gestire la priorità di I/O di un processo, il che consente di attenuare l'effetto delle attività in background sulla reattività del sistema.
Esempio di utilizzo:
ionice -c3 rsync /source /destination
Priorità principali:
- -c1 (realtime) - la priorità massima. Utilizzata per attività critiche dal punto di vista della latenza. Può bloccare completamente gli altri processi.
- -c2 (best-effort) - il valore predefinito per la maggior parte dei processi. Consente di regolare il livello di priorità (da 0 (alta) a 7 (bassa)).
- -c3 (idle) - background. Il processo ottiene l'accesso al disco solo quando nessun altro processo lo sta utilizzando. Sicuro e consigliato per le operazioni in background (backup, sincronizzazione dei dati).
In questo esempio il processo rsync viene eseguito con la priorità di I/O più bassa, riducendo al minimo il suo impatto sulle operazioni fondamentali del sistema. L'uso di ionice consente di ridurre al minimo l'influenza dei processi in background senza doverli disattivare completamente.
Conclusione
Il monitoraggio dell'I/O del disco è parte integrante del mantenimento delle prestazioni e della stabilità di un'infrastruttura server. Le utility iostat e dstat consentono di individuare situazioni di sovraccarico e di valutare lo stato del sottosistema disco, mentre strumenti come iotop, pidstat e lsof aiutano a identificare i processi specifici e la natura del loro carico.
L'applicazione regolare dell'approccio descritto, la corretta interpretazione delle metriche e la gestione delle priorità di I/O contribuiscono a ridurre i tempi di risposta dei servizi, ad aumentare la prevedibilità del carico e a garantire il rispetto dei requisiti SLA. In seguito, questa metodologia può essere estesa tramite il monitoraggio centralizzato e l'automazione dell'analisi del carico di I/O.