Monitoraggio dell'I/O del disco con iostat e dstat: individuazione dei colli di bottiglia | INTROSERV
EUR
european

EUR

usa

USD

Italy It
Ex. VAT Ex. VAT 0%

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.

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 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
Estensibilità No Plugin
Esportazione CSV No
Carico della CPU Basso Medio

Info

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.

Info

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.

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
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • 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