2011-12-27 24 views
26

¿Cuánta memoria en promedio consume el kernel de Linux (en el espacio de direcciones del kernel) por conexión de red TCP/IP?¿Cuánta memoria consume el kernel de Linux por conexión de red TCP/IP?

+0

¿Puede describir la situación con más detalle? Sin él, la mejor estimación que cualquiera podría ofrecer sería algo así como "entre 1K y 10M", lo que no te ayudará mucho. Supongo que te refieres a las conexiones TCP/IP donde un extremo (¿el servidor?) Es tu máquina.¿Puede suponer que la conexión está actualmente inactiva o, al menos, que no está colgada (es decir, todo está acuse en un tiempo razonable)? – ugoren

Respuesta

40

Para una memoria de conexión TCP consumido depende de

  1. tamaño de sk_buff (estructura de red interna utilizados por el kernel Linux)

  2. la lectura y escritura de búfer para una conexión

el tamaño de los buffers se puede modificar según sea necesario

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

cheque por estas variables

estos especificar el uso máximo del búfer de memoria predeterminada para todas las conexiones de red en el kernel

net.core.wmem_max = 131071 

net.core.rmem_max = 131071 

net.core.wmem_default = 126976 

net.core.rmem_default = 126976 

estos especificar el uso de memoria intermedia específica a las conexiones TCP

net.ipv4.tcp_mem = 378528 504704 757056 

net.ipv4.tcp_wmem = 4096 16384 4194304 

net.ipv4.tcp_rmem = 4096 87380 4194304 

la tres valores especificados son tamaños de búfer "mínimo por defecto máximo". Entonces, para comenzar con Linux, se usarán los valores predeterminados de buffer de lectura y escritura para cada conexión. A medida que aumenta el número de conexiones, estos almacenamientos intermedios se reducirán [como máximo hasta el valor mínimo especificado] Igual es el caso para el valor máximo de almacenamiento intermedio.

Estos valores se pueden establecer utilizando este sysctl -w KEY=KEY VALUE

por ejemplo. El siguiente comando garantiza que los búferes de lectura y escritura para cada conexión sean 4096 cada uno.

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

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

Depende. En muchas muchas cosas.
Creo que una conexión inactiva tomará algunos cientos de bytes.
Pero si hay datos en la transmisión y/o recepción de datos, entonces el consumo aumenta. El tamaño de la ventana puede limitar aproximadamente este consumo.
El consumo extra de datos no es solo los bytes en la cola de recepción/transmisión. Hay gastos generales, por lo que un segmento con un byte puede tomar algo como 2K. TCP intenta reducir esto, por ejemplo, al fusionar segmentos en un solo sk_buff, pero no siempre tiene éxito.

2

También depende de qué capa. En el caso de un escenario de puente puro, solo existe el FDB a nivel de puente. Cuando el enrutamiento entra en juego, está la tabla de enrutamiento y el nivel de IP FDB/neighbor db. Y finalmente, una vez que un socket local está en la obra, tiene, por supuesto, tamaño de ventana, búferes de socket (ambos envían y reciben, y son predeterminados a 128k la última vez que lo verifiqué), listas de fragmentos (si se usan), así que es donde la memoria va, pero una respuesta clara es difícil de hacer con todas las partes en uso. Puede usar ss -m para obtener algunas estadísticas de memoria de sockets de flujo local.

+0

¿Puede explicarme los 4 caracteres (r, w, f, t) en la salida 'ss -m'? – pradeepchhetri

Cuestiones relacionadas