Monitoraggio dell'I/O del disco con iostat e dstat: individuazione dei colli di bottiglia
Introduzione
Il monitoraggio dell’input-output del disco è una delle attività fondamentali nella gestione dei server all’interno di un’infrastruttura di hosting. Il sottosistema del disco influisce direttamente sulle prestazioni dei servizi web, dei database, delle macchine virtuali, dei container e delle attività in background. Anche in presenza di RAM e risorse CPU libere sufficienti, un disco sovraccarico o lento può diventare il collo di bottiglia dell’intero sistema.
Il presente manuale è destinato agli amministratori di sistema, agli ingegneri DevOps e ai proprietari di server. Tratta le utility iostat e dstat, i principi del loro funzionamento, l’interpretazione delle metriche e un approccio pratico all’individuazione dei colli di bottiglia nell’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 su dispositivi a blocchi. Negli scenari di hosting reali, il carico sul sottosistema del disco è generato più spesso da:
- database (MySQL, MariaDB, PostgreSQL);
- applicazioni web con contenuti dinamici;
- servizi di posta;
- backup e sincronizzazione dei dati;
- registrazione dei log;
- file di swap e file temporanei;
- script utente e cron job.
I colli di bottiglia possono verificarsi a causa di dispositivi di archiviazione lenti, elevata contesa tra i processi, scheduler di I/O non ottimali, operazioni di caching errate o funzionalità di virtualizzazione.
Scopo di iostat e dstat
iostat è un'utilità del pacchetto sysstat progettata per raccogliere statistiche dettagliate sul carico della CPU e dei dispositivi a disco. Il compito principale di iostat è mostrare l’intensità di utilizzo di un disco specifico, se esiste una coda di richieste e qual è il tempo medio di attesa per le operazioni.
dstat è uno strumento di monitoraggio versatile che visualizza statistiche in tempo reale su diversi sottosistemi contemporaneamente: CPU, memoria, disco, rete, processi. Consente di correlare l’attività del disco con il carico complessivo del server ed è utile per una rapida diagnostica.
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 avviare 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 la 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 pertinenti:
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
Revisione e analisi passo dopo passo
Analisi di base del disco tramite iostat
L'utilità iostat viene utilizzata per valutare il carico della CPU e del sottosistema del disco, nonché per identificare ritardi e code di I/O.
Sintassi:
sudo iostat [options] [interval] [count]
Parametri più comunemente utilizzati:
- -x - statistiche estese;
- -d - solo dati relativi al disco;
- -k - output in kilobyte;
- -p - statistiche relative alle partizioni o a 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 monitorare le variazioni di 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 rimane inattiva in attesa di operazioni di I/O. Un aumento di questa metrica indica l'impatto del disco sulle prestazioni complessive.
- %steal: rilevante per i server virtuali, indica il tempo di CPU sottratto.
Metriche chiave del disco:
- %util: la percentuale di tempo in cui il disco è stato occupato. Valori che superano costantemente l'80-90% indicano la saturazione del dispositivo.
- r_await: il tempo medio (in ms) necessario per il completamento delle operazioni di lettura (compreso il tempo di attesa in coda).
- w_await - il tempo medio (ms) necessario per il completamento delle operazioni di scrittura (incluso il tempo di attesa in coda).
- aqu-sz - (dimensione media della coda): la lunghezza media della coda delle richieste per il disco. Un valore > 1 indica già la formazione di una coda. Un valore > 2-4 per gli HDD / > 1-2 per gli SSD è un segno che il disco non riesce a stare al passo con il carico.
La differenza tra await e svctm indica se il ritardo è causato dalla coda piuttosto che dalla velocità fisica del disco.
Se "await" supera solo leggermente "svctm" (differenza < 20-30%), i ritardi sono causati principalmente dal disco stesso (lettura/scrittura fisica lenta).
Se "await" è significativamente maggiore di "svctm" (differenza > 50-100%), il ritardo principale è causato dalla coda delle richieste (il valore di "aqu-sz" sarà elevato), il che indica un sovraccarico del disco dovuto a numerose richieste in parallelo.
Nelle versioni moderne di iostat (come nell’esempio), svctm non viene visualizzato poiché il suo calcolo non è affidabile. Per l’analisi si utilizza la combinazione di await + aqu-sz: un valore elevato di await con un valore basso di aqu-sz (~0) indica un disco lento; un valore elevato di await con un valore elevato di aqu-sz (>1) indica che il disco è sovraccarico di richieste.
Analisi del quadro generale con dstat
dstat viene utilizzato per l’osservazione in tempo reale del sistema e per mettere in correlazione il carico del disco con altre risorse.
Esempi di comandi:
dstat -d dstat --disk-util dstat -rd --disk-util dstat -D vda,sda
Esempio di esecuzione con un intervallo:
dstat -rd --disk-util 1 5
Durante l'analisi, prestare attenzione a:
- all'aumento di iowait nella 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:
| Criteri | iostat | dstat |
|---|---|---|
| Precisione dei dati | Elevata | Elevata |
| Modalità in tempo reale | Limitata | Eccellente |
| Dati storici | Sì (sar) | No |
| Uscita a colori | No | Sì |
| Estensibilità | No | Plugin |
| Esportazione CSV | No | Sì |
| Carico della CPU | Basso | Medio |
dstat è particolarmente utile per i picchi di carico di breve durata che non sempre sono evidenti in iostat.
Identificazione dei colli di bottiglia nell'I/O del disco
I seguenti comandi vengono utilizzati per una diagnostica rapida:
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 gli SSD o superiore a 50-100 ms per gli HDD;
- aqu-sz superiore a 2-3, che indica un accumulo nella 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
Identificazione dei processi che causano un elevato carico di I/O del disco
Dopo aver accertato la presenza di un sovraccarico del sottosistema disco utilizzando iostat e dstat, il passo successivo consiste nell’identificare i processi specifici che avviano operazioni intensive di lettura o scrittura. Un’analisi a livello di dispositivo senza identificare la fonte del carico non consente di intraprendere azioni correttive adeguate.
Utilizzo di iotop
Lo strumento principale per individuare i processi che stanno utilizzando attivamente il disco è l’utilità iotop.
sudo iotop -ao
Parametri del comando:
-a - visualizza le statistiche cumulative dall’avvio del processo, il che aiuta a identificare le attività in background con operazioni di I/O di lunga durata;
-o - mostra solo i processi che stanno attualmente eseguendo operazioni di I/O.
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, DISK WRITE e alla percentuale di tempo dedicata alle operazioni di I/O. In genere, le fonti di carico sono processi relativi a database, processi di backup, processi di sincronizzazione dei file o script degli utenti.
Utilizzo di pidstat per l’analisi dell’I/O per singolo processo
Per un’analisi più formalizzata e ripetibile, è possibile utilizzare pidstat, che fa parte del pacchetto sysstat.
pidstat -d 1
Questo comando fornisce statistiche sull’I/O del disco per ciascun processo a intervalli di un secondo. Ciò è utile per identificare picchi di attività di breve durata e metterli in relazione con altre metriche di sistema.
pidstat è particolarmente utile in situazioni in cui il carico si manifesta periodicamente e potrebbe non essere sempre rilevato da iotop.
Utilizzo di lsof per l’analisi dell’attività dei file
Nei casi in cui sia necessario capire con quali file o directory specifici sta lavorando un processo, si utilizza l’utilità lsof.
lsof +D /path
Dove/path è una directory specifica all’interno della quale devono essere identificati i file e i processi attivi. Ad esempio, potrebbe trattarsi di una directory di database, di una directory di backup o di un’area di file temporanei.
Il comando consente di determinare quali processi stanno attualmente detenendo descrittori di file ed eseguendo operazioni all'interno del percorso specificato, il che è particolarmente utile quando si analizza il carico proveniente dalle applicazioni.
Analisi del contesto del carico
Identificare un processo con elevata attività su disco non è l’obiettivo finale. L’amministratore deve valutare il contesto del suo funzionamento:
- il carico è previsto per questo servizio;
- il processo è in esecuzione in un momento appropriato (ad esempio, backup durante le ore di punta);
- è possibile modificare la pianificazione o i parametri operativi;
- è ammissibile ridurre la priorità di I/O?
Questo approccio consente di distinguere il carico normale da quello problematico e di scegliere il metodo di ottimizzazione corretto.
Verifica della correttezza dell’analisi
La correttezza dell’analisi effettuata è confermata se:
- i picchi di %util, await o aqu-sz in iostat coincidono temporalmente con l'attività dei processi in iotop o pidstat;
- un 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 raccomanda di utilizzare la registrazione:
sar -d 1 100 > io.log
Ciò consente di registrare il comportamento del sottosistema disco in un periodo specificato e di utilizzare i dati durante l’analisi degli incidenti.
Errori tipici e caratteristiche operative
Nella pratica della gestione dei server di hosting, i problemi più comuni sono i seguenti:
- esecuzione di backup e sincronizzazione dei dati durante le ore di picco;
- uso intensivo dello swap in caso di RAM insufficiente;
- uno scheduler I/O inadeguato al tipo di unità;
- mancanza di definizione delle priorità per le attività in background.
Per ridurre l'impatto dei processi in background sulle prestazioni, si consiglia di utilizzare l'utilità ionice per gestire la priorità di I/O di un processo, il che consente di ridurre l'impatto delle attività in background sulla reattività del sistema.
Esempio di utilizzo:
ionice -c3 rsync /source /destination
Priorità principali:
- -c1 (tempo reale) - la priorità più alta. Utilizzata per attività in cui la latenza è critica. Può bloccare completamente altri processi.
- -c2 (best-effort) – l’impostazione predefinita per la maggior parte dei processi. Consente la regolazione del livello di priorità (da 0 (alto) a 7 (basso)).
- -c3 (inattivo) – in background. Il processo avrà 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à I/O più bassa, riducendo al minimo il suo impatto sulle operazioni di sistema fondamentali. L’uso di ionice consente di ridurre al minimo l’impatto dei processi in background senza doverli disabilitare completamente.
Conclusione
Il monitoraggio dell’I/O del disco è parte integrante del mantenimento delle prestazioni e della stabilità di un’infrastruttura server. Le utilità iostat e dstat consentono di identificare situazioni di sovraccarico e valutare lo stato del sottosistema del disco, mentre strumenti come iotop, pidstat e lsof aiutano a identificare 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 la conformità ai requisiti SLA. Successivamente, questa metodologia può essere estesa attraverso il monitoraggio centralizzato e l’automazione dell’analisi del carico di I/O.