2011-12-27 19 views
26

Quanta memoria mediamente viene consumata dal kernel Linux (nello spazio indirizzo del kernel) per connessione di rete TCP/IP?Quanta memoria viene consumata dal kernel Linux per connessione di rete TCP/IP?

+0

Puoi descrivere la situazione in modo più dettagliato? Senza di esso, la migliore stima che chiunque sarebbe in grado di dare sarebbe qualcosa come "tra 1K e 10M", che non ti aiuterà molto. Immagino tu intenda le connessioni TCP/IP dove un capo (il server?) È la tua macchina.Potete supporre che la connessione sia al momento inattiva, o almeno che non sia bloccata (cioè tutto è ACK in un tempo ragionevole)? – ugoren

risposta

40

Per una memoria di collegamento TCP consumata dipende

  1. dimensione sk_buff (struttura di rete interno utilizzato dal kernel)

  2. di lettura e scrittura del buffer per una connessione

la dimensione dei buffer può essere modificata come richiesto

[email protected]:~# sysctl -A | grep net | grep mem 

assegno di queste variabili

questi specificare l'utilizzo massimo buffer di memoria di default per tutte le connessioni di rete nel kernel

net.core.wmem_max = 131071 

net.core.rmem_max = 131071 

net.core.wmem_default = 126976 

net.core.rmem_default = 126976 

questi specificare l'utilizzo della memoria di buffer specifico per le connessioni TCP

net.ipv4.tcp_mem = 378528 504704 757056 

net.ipv4.tcp_wmem = 4096 16384 4194304 

net.ipv4.tcp_rmem = 4096 87380 4194304 

la tre valori specificati sono le dimensioni del buffer "min default max". Quindi, per iniziare con Linux, verranno utilizzati i valori predefiniti del buffer di lettura e scrittura per ciascuna connessione. All'aumentare del numero di connessioni, questi buffer saranno ridotti [al massimo fino al valore minimo specificato] Lo stesso vale per il valore massimo del buffer.

Questi valori possono essere impostati utilizzando questo sysctl -w KEY=KEY VALUE

es. Il comando seguente garantisce che i buffer di lettura e scrittura per ciascuna connessione siano 4096 ciascuno.

sysctl -w net.ipv4.tcp_rmem='4096 4096 4096' 

sysctl -w net.ipv4.tcp_wmem='4096 4096 4096' 
-1

Dipende. Su molte molte cose
Penso che una connessione inattiva richiederà alcune centinaia di byte.
Ma se ci sono dati in trasmissione e/o ricezione dati, il consumo aumenta. Le dimensioni della finestra possono limitare approssimativamente questo consumo.
Il consumo extra per i dati non è solo i byte nella coda di ricezione/trasmissione. Esistono overhead, quindi un segmento con un byte potrebbe richiedere qualcosa come 2K. TCP tenta di ridurre questo, ad esempio unendo i segmenti in un singolo sk_buff, ma non sempre riesce.

2

Dipende anche da quale livello. Nel caso di uno scenario di puro bridging, c'è solo l'FDB a livello di bridge. Quando il routing entra in gioco, c'è la tabella di routing e l'FDB/vicino di livello IP db. E infine, una volta che un socket locale è in gioco, si hanno ovviamente dimensione della finestra, buffer di socket (sia di invio che di ricezione, e sono predefiniti a 128k l'ultima volta che ho controllato), liste di frammenti (se usati), quindi è lì che la memoria va, ma una risposta chiara è difficile da fare con tutte le parti in uso. È possibile utilizzare ss -m per ottenere alcune statistiche di memoria dei socket stream locali.

+0

Puoi spiegarmi i 4 caratteri (r, w, f, t) nell'output di 'ss -m'? – pradeepchhetri

Problemi correlati