Risoluzione dei problemi di prestazioni lente: Utilizzare 'netstat' e 'ss' in modo efficace
Quando si diagnosticano prestazioni lente delle applicazioni o comportamenti di connessione imprevisti su un sistema Linux, lo stack di rete è spesso il primo punto da esaminare. Comprendere le connessioni stabilite, in ascolto e transitorie è fondamentale per identificare colli di bottiglia, processi anomali o anomalie di sicurezza. Storicamente, gli amministratori facevano molto affidamento sull'utility netstat. Tuttavia, le distribuzioni Linux moderne prediligono l'utility ss (socket statistics), più veloce e ricca di funzionalità.
Questa guida fornirà un confronto completo tra netstat e ss, illustrando come utilizzare entrambi gli strumenti efficacemente per monitorare i socket TCP e UDP, analizzare gli stati delle connessioni e individuare i problemi di prestazioni sul proprio sistema.
Perché monitorare i socket di rete?
La latenza di rete e la lentezza sono spesso legate a problemi di connessione piuttosto che all'esaurimento di CPU o memoria. Il monitoraggio dei socket aiuta gli amministratori a rispondere a domande critiche come:
- Quali porte sono in ascolto attivo per le connessioni?
- Ci sono troppe connessioni bloccate negli stati
SYN_RECVoTIME_WAIT? - Quale processo (PID) sta utilizzando una specifica porta?
- Si stanno verificando connessioni in uscita impreviste?
Esaminando le statistiche dei socket, è possibile escludere rapidamente problemi di configurazione di rete o identificare contese di risorse legate alla gestione delle connessioni.
Lo strumento legacy: netstat
netstat è stata l'utility standard per visualizzare connessioni di rete, tabelle di routing, statistiche delle interfacce e connessioni di mascheramento per decenni. Sebbene sia stata deprecata a favore di ss su molti sistemi moderni, rimane ampiamente disponibile e spesso familiare agli amministratori di lunga data.
Esempi comuni di netstat
I flag più comuni utilizzati con netstat forniscono una panoramica completa:
| Flag | Descrizione |
|---|---|
-a |
Mostra tutti i socket (in ascolto e non in ascolto) |
-n |
Mostra gli indirizzi numerici invece di tentare di risolvere nomi host e nomi di servizio (accelera l'output) |
-t |
Mostra le connessioni TCP |
-u |
Mostra le connessioni UDP |
-l |
Mostra solo i socket in ascolto |
-p |
Mostra il PID/Nome del programma associato al socket (richiede privilegi di root) |
Esempio: Visualizzazione di tutte le connessioni TCP attive in formato numerico
sudo netstat -ant
Esempio: Trovare cosa è in ascolto sulla porta 80 (HTTP)
sudo netstat -antlp | grep ':80'
Comprensione degli stati di connessione (netstat)
L'output di netstat include spesso una colonna State. Gli stati chiave da osservare includono:
- LISTEN: In attesa di connessioni in ingresso.
- ESTABLISHED: Una connessione attiva e aperta.
- TIME_WAIT: Un socket in attesa per un breve periodo dopo la chiusura per garantire che i pacchetti ritardati vengano gestiti.
- SYN_RECV: In attesa della conferma finale di un handshake a tre vie (può indicare un attacco SYN flood se eccessivo).
Avvertenza su
netstat:netstatspesso si basa sulla lettura dei file/proc/net/*, il che può essere lento, specialmente su sistemi con un volume molto elevato di connessioni attive (migliaia). Questo è il motivo principale per cui è stato sviluppatoss.
Il sostituto moderno: ss (Socket Statistics)
l'utility ss è significativamente più veloce di netstat perché recupera le informazioni sui socket direttamente dallo spazio kernel utilizzando i socket Netlink, aggirando le ricerche più lente sul file system.
Esempi comuni di ss
La struttura dei flag per ss è molto simile a netstat, favorendo una facile transizione:
| Flag | Descrizione |
|---|---|
-a |
Mostra tutti i socket |
-n |
Mostra gli indirizzi numerici |
-t |
Mostra i socket TCP |
-u |
Mostra i socket UDP |
-l |
Mostra i socket in ascolto |
-p |
Mostra le informazioni sul processo (PID/Programma) |
Esempio: Visualizzazione di tutte le connessioni TCP attive in formato numerico (Equivalente a netstat -ant)
ss -ant
Esempio: Trovare cosa è in ascolto sulla porta 443 (HTTPS)
sudo ss -antlp | grep ':443'
Filtraggio avanzato con ss
Uno dei maggiori vantaggi di ss è la sua capacità di eseguire filtri diretti sugli stati delle connessioni, il che è molto più efficiente rispetto all'invio tramite pipe dell'output di netstat a grep.
Filtraggio per stato di connessione
È possibile utilizzare l'opzione state direttamente nel comando ss. Questo è estremamente utile per diagnosticare l'accumulo di connessioni.
Trovare tutti i socket attualmente nello stato TIME-WAIT:
ss -s state time-wait
Trovare tutti i socket nello stato SYN-SENT (lato client in attesa della risposta del server):
ss -s state syn-sent
Filtraggio per porta o indirizzo
Il filtraggio per indirizzo/porta di destinazione o di origine è semplice:
Mostra le connessioni stabilite destinate alla porta 22 (SSH):
ss -tn state established '( dport = :22 or sport = :22 )'
Mostra le connessioni relative a un indirizzo IP locale specifico:
ss -ant '( daddr = 192.168.1.100 or saddr = 192.168.1.100 )'
Analisi delle prestazioni: Confronto netstat vs. ss
Durante la risoluzione dei problemi, la scelta tra gli strumenti dipende spesso dalla velocità e dal dettaglio.
| Funzionalità | netstat |
ss |
|---|---|---|
| Velocità | Più lento (Legge i file) | Molto più veloce (Utilizza socket Netlink) |
| Sintassi | Maturata, ampiamente documentata | Flag simili, opzioni specifiche più recenti |
| Filtraggio | Richiede l'uso di pipe con grep |
Supporto nativo per il filtraggio di stato e indirizzo |
| Profondità delle informazioni | Buono per le basi | Più dettagli sulla dimensione dei buffer dei socket (Informazioni TCP) |
| Disponibilità | Quasi universale | Standard sulle moderne distribuzioni Linux |
Diagnosi di un lento avvio della connessione
Se i client segnalano connessioni lente, verificare la presenza di socket bloccati in attesa degli handshake. L'utilizzo di ss è il modo più rapido per determinarlo:
- Controllare l'alto conteggio di
SYN-RECV: Ciò suggerisce che il server sta ricevendo richieste di connessione ma non sta completando l'handshake, spesso a causa di esaurimento delle risorse o elevato carico di traffico.
bash ss -s | grep syn-rec - Controllare l'alto conteggio di
SYN-SENT: Se il server stesso sta avviando molte connessioni (ad esempio, agendo come client verso database o altre API), questo indica che è in attesa di risposte.
bash ss -s | grep syn-sent
Se si notano numeri eccezionalmente elevati in una delle due categorie, l'applicazione che ha avviato tali connessioni sta probabilmente riscontrando problemi di latenza di rete o di firewall.
Best practice per la risoluzione dei problemi di rete
- Usare sempre
-n: Durante la risoluzione dei problemi di prestazioni o lo scripting, utilizzare il flag numerico (-n) per evitare ritardi nella risoluzione DNS, che possono rendere lenta la diagnostica. - Dare priorità a
ss: Adottaresscome strumento predefinito. Riservarenetstatsolo per sistemi legacy in cuissnon è disponibile. - Eseguire come Root per il PID: Per vedere quale programma sta utilizzando una porta, è generalmente necessario
sudoo privilegi di root quando si utilizza il flag-pcon entrambe le utility. - Controllare le statistiche dell'interfaccia: Non dimenticare i contatori dell'interfaccia. Utilizzare
ip -s link show <nome_interfaccia>per verificare la presenza di pacchetti persi o errori, che potrebbero indicare un problema a livello fisico piuttosto che un problema di socket.
Padroneggiando le moderne capacità di ss e comprendendo il contesto fondamentale fornito da netstat, gli amministratori di sistema ottengono una potente visione dello stato di rete di qualsiasi host Linux, accelerando notevolmente la diagnostica delle prestazioni.