Monitorare l’I/O del disco con iostat e dstat sui server | INTROSERV
EUR
european

EUR

usa

USD

Italy It
Ex. VAT Ex. VAT 0%

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.

Tip

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

Info

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.

Info

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.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • kingdom
  • germany
  • Español
  • French
  • Hrvatska
  • Italiano
  • Poland
  • Slovenski
  • ukraine
  • Türkçe
  • Русский
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA