Ottenere il conteggio delle connessioni TCP corrente su un sistema


22

Invece di fare wc -l /proc/net/tcp, c'è un modo più veloce per farlo?

Ho solo bisogno di un conteggio totale delle connessioni TCPC.


5
Forse provaciss -s
Ulrich Dangel

@UlrichDangel cool, che è più veloce, leggendo sockstat; puoi effettivamente inserirlo nell'area di risposta ;-)
margherita

Risposte:


20

Se vuoi solo ottenere il numero e non hai bisogno di dettagli, puoi leggere i dati /proc/net/sockstat{,6}. Tieni presente che devi combinare entrambi i valori per ottenere il conteggio assoluto delle connessioni.

Se vuoi ottenere le informazioni dal kernel stesso, puoi usarle NETLINK_INET_DIAGper ottenere le informazioni dal kernel senza doverle leggere/proc


1
Sarei curioso di vedere un test su un sistema con molte connessioni che confronta le prestazioni della mia soluzione con la soluzione suggerita sopra che richiede ulteriore aritmetica e filtro per ottenere la risposta finale, che è solo un singolo numero!
Johan

7

Un modo più veloce? In questo modo produce una risposta in una frazione di secondo, in realtà ci vogliono 0,009 secondi sul mio computer!

Stai cercando un modo che richiede meno battitura a macchina? In tal caso impostare un alias, ad es

alias tcpcount="wc -l /proc/net/tcp"

Ora puoi semplicemente inserire lo pseudonimo, ad es. tcpcountÈ quello che ho usato nel mio esempio per ottenere questo numero.

Inserisci la linea o aggiungila al tuo .bashrc in modo che l'alias venga definito ogni volta che accedi.

Per un numero elevato di connessioni, è possibile che ciò avvenga in modo leggermente più veloce (e leggermente più lento per un numero molto piccolo di connessioni):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

O forse ...

awk 'END {print NR}' /proc/net/tcp

Entrambe queste soluzioni presuppongono che "wc" non sia ottimale per il solo conteggio del numero di righe. I miei test mostrano che questo presupposto è vero.

Il primo si basa sul presupposto che il comando tail è davvero efficace nello scartare i dati non necessari, al punto da compensare la creazione di una sotto-shell aggiuntiva e il lavoro extra sulle variabili di ambiente. Sfrutta il fatto che le righe in / proc / net / tcp sono già numerate per eliminare la necessità di contare le righe. La soluzione finale presuppone che awk conti abbastanza bene da compensare qualsiasi svantaggio dovuto al caricamento di un programma più grande rispetto alla creazione di più processi. La soluzione awk ha l'ulteriore vantaggio di adattarsi perfettamente a una semplice definizione di alias a una riga (che offre ulteriori vantaggi in quanto non vi è alcun script chiamato, quindi nessun processo di shell aggiuntivo biforcato, che offre un ulteriore vantaggio di pochi secondi).


1
Ho una connessione 40k + dove ci vogliono più di 3 secondi
daisy

2
Hmm, non penso che ci sia un modo molto più veloce di leggere /proc/net/tcp. Puoi provare netstat -n -t | wc -l, ma la mia ipotesi è che anche netstat legga da/proc/net/tcp
Kotte

netstat è più di 3 volte più lento della lettura di / proc / net / tcp sul mio sistema, ma è con un numero molto piccolo di connessioni, quindi potrebbe essere mitigato un overhead di avvio se il numero di connessioni è grande. netstat rende facile ottenere conteggi di connessioni in diversi stati ....
Johan

1
Su un server con 16 GB di RAM, ora ci vuole più di un minuto per eseguire un netstat -ntcon circa 180.000 connessioni. Non vedo alcun motivo per cui dovrebbe essere così lento ... (anche la lettura /proc/net/tcpè molto lenta)
Marki555

1
Alcuni timidi test su una macchina con connessioni a 180k indicano che l' awkapproccio è terribilmente più lento di wc. tailsembra essere alla pari wc.
Felix Frank,

-1

Utilizzare il ss -scomando per ottenere la risposta dettagliata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.