Quando un server Linux diventa lento o un'applicazione inizia a rispondere con ritardi,la prima attività da svolgere è identificare quale risorsa sta raggiungendo il limite. CPU,RAM e storage rappresentano tre dei principali componenti da analizzare durante una diagnosi delle prestazioni.

L'interfaccia grafica non è normalmente necessaria. Linux mette a disposizione numerosi strumenti da terminale che consentono di osservare in tempo reale il carico del processore,la memoria utilizzata,lo stato dei processi,lo spazio disponibile sui filesystem e le prestazioni dei dispositivi di archiviazione.

La diagnostica da terminale è particolarmente importante sui server,perché molte installazioni Linux non dispongono di un ambiente desktop. Inoltre,strumenti come top,free,df,iostat e vmstat permettono di ottenere informazioni molto più precise rispetto a una semplice indicazione della percentuale di utilizzo.

Controllare la CPU con lscpu

Il primo comando utile per conoscere la configurazione del processore è:

lscpu

Il comando restituisce informazioni relative all'architettura,al numero di CPU logiche,ai core,ai socket,alla tecnologia di virtualizzazione e al modello del processore.

Tra i parametri più interessanti ci sono:

CPU(s)
Core(s) per socket
Socket(s)
Thread(s) per core
Model name
Architecture

È importante distinguere tra CPU fisiche,core e thread logici. Un server con un processore dotato di 8 core e 16 thread,per esempio,presenterà normalmente 16 CPU logiche al sistema operativo.

Questa informazione diventa particolarmente importante quando si analizzano processi,thread e carichi paralleli.

Analizzare il carico della CPU con top

Uno degli strumenti fondamentali per la diagnostica Linux è:

top

top mostra in tempo reale i processi in esecuzione e diverse informazioni sullo stato del sistema.

Nella parte superiore vengono normalmente visualizzati il load average,il numero di processi e le percentuali relative all'utilizzo della CPU.

Una delle righe più importanti è quella relativa alla CPU:

%Cpu(s): us sy ni id wa hi si st

I valori rappresentano differenti categorie di tempo CPU. us indica il tempo utilizzato dai processi in user space,mentre sy rappresenta il tempo impiegato dal kernel.

id indica il tempo di inattività,mentre wa rappresenta il tempo in attesa di operazioni I/O.

Quest'ultimo parametro è particolarmente interessante: una CPU apparentemente poco utilizzata ma con un wa elevato può indicare che il sistema sta aspettando il completamento di operazioni di storage.

Interpretare il load average

Il load average è uno dei parametri Linux più frequentemente interpretati in modo errato.

Con:

uptime

è possibile visualizzare il load average degli ultimi 1,5 e 15 minuti.

Un risultato potrebbe essere:

load average: 2.40,1.85,1.20

Il load average non rappresenta semplicemente la percentuale di CPU utilizzata. Indica il numero medio di task che stanno utilizzando o aspettando una risorsa,con dettagli che dipendono dal comportamento del kernel.

Per interpretarlo correttamente bisogna confrontarlo con il numero di CPU logiche.

Un load average di 4 può essere molto significativo su una macchina con 2 CPU logiche,ma relativamente normale su una macchina con 16 CPU logiche.

Controllare il numero di CPU logiche

Per ottenere rapidamente il numero di CPU disponibili:

nproc

Il comando restituisce il numero di processori logici disponibili al sistema.

Può essere utilizzato insieme al load average per avere una prima indicazione del livello di pressione sulla CPU.

Per una diagnosi completa è comunque necessario analizzare anche la natura dei processi e l'eventuale attesa I/O.

Analizzare i processi con ps

Un altro comando fondamentale è:

ps aux

Per ordinare i processi in base al consumo CPU si può utilizzare:

ps aux --sort=-%cpu

Per la memoria:

ps aux --sort=-%mem

Questo permette di individuare rapidamente quale processo sta utilizzando maggiormente una determinata risorsa.

Su un server web,per esempio,questa analisi può evidenziare un processo PHP,un worker,un database o un'applicazione che sta consumando una quantità anomala di CPU.

top e htop

Oltre a top è possibile utilizzare htop,quando installato:

htop

htop presenta una visualizzazione interattiva più leggibile e permette di filtrare e ordinare i processi.

Su server minimalisti potrebbe non essere installato,ma può essere aggiunto attraverso il gestore pacchetti della distribuzione.

Dal punto di vista diagnostico,top rimane comunque sufficiente per molte verifiche e ha il vantaggio di essere normalmente disponibile.

Controllare la RAM con free

Per analizzare la memoria RAM il comando principale è:

free -h

L'opzione -h rende i valori più facilmente leggibili.

Un risultato tipico contiene informazioni relative a:

total
used
free
shared
buff/cache
available

Il valore più importante da osservare non è necessariamente free,ma available.

Linux utilizza infatti parte della memoria disponibile come cache per migliorare le prestazioni del sistema. Una quantità ridotta di memoria indicata come free non significa automaticamente che il server stia esaurendo la RAM.

Perché Linux utilizza la RAM libera

Linux tende a utilizzare la memoria disponibile per cache e buffer.

Questo comportamento è normale e consente di ridurre gli accessi allo storage.

Quando un'applicazione necessita di memoria,il kernel può liberare parte della cache.

Per questo motivo un server che mostra poca memoria free può essere perfettamente sano.

Durante la diagnosi è quindi necessario considerare available,swap e andamento temporale della memoria,invece di osservare esclusivamente la quantità di RAM libera.

Controllare la memoria in /proc

Linux espone numerose informazioni del kernel attraverso il filesystem virtuale /proc.

Il comando:

cat /proc/meminfo

permette di visualizzare numerosi parametri relativi alla memoria.

Tra quelli più interessanti ci sono:

MemTotal
MemFree
MemAvailable
Buffers
Cached
SwapTotal
SwapFree

/proc/meminfo è particolarmente utile quando è necessario effettuare una diagnosi più approfondita rispetto a quella fornita da free.

Verificare lo swap

La swap viene utilizzata quando il sistema necessita di memoria e può trasferire pagine dalla RAM allo storage.

Per verificare lo stato:

swapon --show

oppure:

free -h

Uno swap utilizzato non significa automaticamente che il server abbia un problema.

Un utilizzo costante e intenso della swap,associato a poca memoria disponibile e forte attività I/O,può però indicare una pressione significativa sulla RAM.

In questi casi è necessario identificare quale processo sta consumando memoria.

Individuare i processi che consumano RAM

Il comando:

ps aux --sort=-%mem

permette di ordinare i processi in base alla percentuale di memoria utilizzata.

Per esempio,un database o un processo applicativo che cresce progressivamente nel consumo di RAM può essere sintomo di una configurazione non ottimale o di un possibile memory leak.

La diagnosi deve essere eseguita osservando il comportamento nel tempo e non soltanto un singolo valore.

Controllare lo spazio disco con df

Per verificare quanto spazio è disponibile nei filesystem:

df -h

L'opzione -h visualizza le dimensioni in formato leggibile.

Il comando mostra normalmente filesystem,dimensione totale,spazio utilizzato,spazio disponibile,percentuale di utilizzo e punto di mount.

Un filesystem che raggiunge il 100% può causare problemi molto seri.

Un server web,per esempio,potrebbe non riuscire più a scrivere log,file temporanei o dati applicativi.

Controllare anche gli inode

Un filesystem può esaurire gli inode anche quando dispone ancora di spazio in GB.

Per verificare la situazione:

df -i

Gli inode rappresentano le strutture utilizzate dal filesystem per gestire file e directory.

Un sistema che contiene milioni di piccoli file può quindi esaurire gli inode prima dello spazio fisico.

Questo scenario è particolarmente importante su server che gestiscono cache,mail,sessioni PHP,file temporanei o repository con moltissimi oggetti.

Individuare quali directory occupano spazio

Quando df -h mostra un filesystem quasi pieno,il passo successivo consiste nell'individuare dove viene utilizzato lo spazio.

Un comando utile è:

du -sh /*

Per analizzare una directory specifica:

du -sh /var/*

Su molti server /var merita particolare attenzione perché può contenere log,cache,database e dati applicativi.

Per ottenere un ordinamento delle directory:

du -h /var | sort -h

Questa analisi permette di individuare rapidamente le aree che stanno crescendo maggiormente.

Il problema dei log troppo grandi

I file di log rappresentano una delle cause più comuni di saturazione dello storage.

Directory come:

/var/log

possono crescere rapidamente se un servizio produce continuamente errori o se il sistema di log rotation non funziona correttamente.

È quindi importante controllare non soltanto la dimensione dei log,ma anche la loro gestione attraverso meccanismi come logrotate o journald.

Cancellare manualmente i log senza comprendere il motivo della crescita può risolvere temporaneamente il problema senza eliminarne la causa.

Analizzare i dischi con lsblk

Per conoscere la struttura dei dispositivi di storage:

lsblk

Il comando mostra dischi,partizioni e relativi mount point.

Una versione più dettagliata può essere:

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS

Questo è particolarmente utile quando il server dispone di più dischi,partizioni o volumi.

La differenza tra disco fisico,partizione,LVM e filesystem deve essere compresa prima di eseguire operazioni di modifica.

Controllare filesystem e mount

Il comando:

findmnt

permette di visualizzare i filesystem montati e la loro struttura.

Può essere utilizzato insieme a lsblk e df per capire come lo storage è organizzato.

Su server Linux complessi possono essere presenti volumi LVM,mount separati per /var,/home o directory applicative e filesystem distribuiti su dispositivi differenti.

Analizzare LVM

Quando viene utilizzato LVM,è utile conoscere la struttura dei volumi attraverso:

pvs
vgs
lvs

Questi comandi mostrano rispettivamente Physical Volumes,Volume Groups e Logical Volumes.

Un filesystem pieno non significa necessariamente che il disco fisico sia completamente occupato. Potrebbero esistere spazio libero nel volume group o possibilità di estendere il logical volume.

La diagnostica deve quindi considerare l'intero livello storage.

Monitorare l'I/O disco con iostat

Per analizzare le prestazioni dei dispositivi è molto utile:

iostat

Il comando appartiene normalmente al pacchetto sysstat.

Per ottenere informazioni più dettagliate:

iostat -xz 1

Il parametro 1 aggiorna i dati ogni secondo.

Tra i valori interessanti ci sono utilizzo del dispositivo,throughput,operazioni al secondo e tempi di attesa.

Un'elevata latenza I/O può spiegare un server lento anche quando l'utilizzo CPU appare relativamente basso.

CPU alta o disco lento?

Questo è uno dei problemi più importanti da distinguere durante la diagnostica.

Immaginiamo un'applicazione che risponde lentamente.

Se la CPU è costantemente prossima alla saturazione e i processi mostrano elevato consumo CPU,il problema potrebbe essere computazionale.

Se invece la CPU è relativamente libera ma iowait e latenza del disco sono elevati,il collo di bottiglia potrebbe essere lo storage.

Se RAM e swap sono sotto forte pressione,il problema potrebbe invece essere legato alla memoria.

Questa distinzione evita di aumentare inutilmente le risorse sbagliate.

vmstat per una visione generale

vmstat permette di ottenere una panoramica sintetica del comportamento del sistema:

vmstat 1

Il comando aggiorna le statistiche ogni secondo.

È possibile osservare processi,memoria,swap,I/O e CPU.

Tra i parametri più interessanti ci sono si e so,relativi allo swap in ingresso e uscita,e wa,relativo all'attesa I/O.

Un'attività di swap intensa associata a elevato I/O può fornire un'indicazione di pressione sulla memoria.

Monitorare la memoria in tempo reale

Un altro strumento utile è:

watch -n 1 free -h

Questo permette di aggiornare automaticamente il comando free ogni secondo.

Lo stesso principio può essere utilizzato per monitorare altre informazioni.

Per esempio:

watch -n 2 df -h

può essere utile per osservare la crescita dello spazio occupato durante un processo.

Controllare i processi con pidstat

Per un'analisi più approfondita è possibile utilizzare:

pidstat 1

pidstat permette di osservare l'attività dei singoli processi nel tempo.

È particolarmente utile quando un processo presenta un comportamento intermittente e non è sufficiente osservare un singolo snapshot prodotto da ps.

Possono essere analizzati CPU,I/O,memoria e altri parametri in funzione delle opzioni utilizzate.

Analizzare l'I/O dei singoli processi

Quando il problema sembra legato allo storage,è utile capire quale processo sta generando le operazioni.

pidstat può essere utilizzato anche per osservare l'attività I/O dei processi.

Questo permette di distinguere tra un problema generale del disco e un singolo servizio che sta generando una quantità anomala di letture o scritture.

Su un server database,per esempio,questa analisi può essere fondamentale per distinguere tra carico normale e query o processi che stanno producendo un'attività I/O eccessiva.

Controllare la temperatura della CPU

Quando la CPU raggiunge temperature elevate può intervenire il thermal throttling,riducendo la frequenza operativa.

Quando supportato dall'hardware e dal sistema,strumenti come:

sensors

possono fornire informazioni sulle temperature.

Il comando fa parte generalmente del pacchetto lm-sensors.

Una CPU che raggiunge frequentemente temperature elevate deve essere analizzata anche dal punto di vista hardware: dissipazione,ventole,polvere,airflow e carico.

Frequenza della CPU

È possibile osservare informazioni relative alla frequenza attraverso:

lscpu

e attraverso le informazioni esposte da /sys.

Su sistemi moderni la frequenza della CPU può variare dinamicamente in funzione del carico,del governor e della temperatura.

Per questo motivo il valore nominale riportato dal produttore non deve essere interpretato come frequenza costante.

Diagnosticare un server Linux lentamente

Quando un server Linux appare lento,una sequenza diagnostica ragionevole consiste nell'osservare contemporaneamente CPU,RAM e I/O.

Per una prima fotografia del sistema possono essere utilizzati:

uptime
free -h
df -h
top

Successivamente si può approfondire con:

vmstat 1
iostat -xz 1
ps aux --sort=-%cpu
ps aux --sort=-%mem

L'obiettivo non è eseguire indiscriminatamente decine di comandi,ma correlare le informazioni.

Un singolo parametro raramente identifica da solo la causa di un problema.

CPU,RAM e disco devono essere analizzati insieme

Un errore frequente consiste nel considerare CPU,RAM e disco come risorse completamente indipendenti.

In realtà esiste una relazione diretta.

Una carenza di RAM può provocare maggiore utilizzo della swap,che a sua volta genera attività I/O. L'aumento dell'I/O può produrre maggiore latenza applicativa e aumentare il load average.

Allo stesso modo,un processo che esegue un numero elevato di operazioni può saturare il disco senza consumare necessariamente una percentuale elevatissima di CPU.

La diagnostica efficace consiste quindi nell'osservare le correlazioni tra i diversi indicatori.

Controllare le risorse di un processo specifico

Una volta identificato il PID di un processo,è possibile utilizzare:

ps -p PID -o pid,ppid,%cpu,%mem,rss,vsz,cmd

Questo permette di ottenere informazioni più precise sul consumo del processo.

RSS rappresenta la memoria residente utilizzata dal processo,mentre VSZ rappresenta la dimensione dello spazio di memoria virtuale.

La distinzione è importante perché la memoria virtuale allocata non corrisponde necessariamente alla quantità di RAM fisicamente utilizzata.

/proc e diagnostica avanzata

Uno dei punti di forza di Linux è l'esposizione di informazioni del kernel attraverso /proc e /sys.

Per esempio:

cat /proc/cpuinfo

fornisce informazioni dettagliate sui processori.

Per la memoria:

cat /proc/meminfo

Per i dispositivi a blocchi è possibile utilizzare:

cat /proc/diskstats

Questi file rappresentano una fonte importante per strumenti di monitoraggio e software di observability.

Molti strumenti che utilizziamo quotidianamente non fanno altro che interpretare informazioni esposte dal kernel attraverso queste interfacce.

Monitoraggio continuo e observability

I comandi da terminale sono fondamentali per una diagnosi manuale,ma in ambienti di produzione non è sufficiente controllare il server soltanto quando un utente segnala un problema.

Per sistemi critici è opportuno implementare un sistema di monitoraggio continuo.

CPU,RAM,swap,filesystem,I/O,load average e stato dei processi possono essere raccolti nel tempo e associati a metriche e alert.

Il vantaggio è poter osservare la progressione di un problema invece di analizzare soltanto lo stato del server nel momento in cui si verifica un'anomalia.

Conclusione

Controllare CPU,RAM e disco su Linux da terminale significa avere accesso diretto alle informazioni fondamentali sul comportamento del sistema operativo.

Comandi come lscpu,top,ps,free,df,du,lsblk,iostat,vmstat e pidstat permettono di analizzare livelli differenti dell'infrastruttura,dal processore ai singoli processi,fino alla memoria e ai dispositivi di storage.

La parte più importante,però,non consiste nel conoscere semplicemente i comandi. La vera competenza tecnica sta nella capacità di interpretare le metriche e metterle in relazione. Un load average elevato non significa automaticamente CPU satura,una RAM quasi completamente utilizzata non indica necessariamente un problema e un disco pieno non è l'unico scenario nel quale lo storage può rappresentare un collo di bottiglia.

Una diagnosi corretta deve quindi partire da una visione generale e procedere progressivamente verso il dettaglio. top può evidenziare un processo anomalo,free può mostrare pressione sulla memoria,iostat può individuare latenze I/O e df può evidenziare filesystem prossimi alla saturazione. Incrociando questi dati è possibile identificare con maggiore precisione la risorsa responsabile del rallentamento e intervenire sul componente corretto.

Su un server Linux in produzione questo approccio dovrebbe essere affiancato da monitoraggio continuo,logging e alerting. In questo modo la diagnostica non viene effettuata soltanto dopo un malfunzionamento,ma diventa parte integrante della gestione dell'infrastruttura IT.