¿Cuál es la fórmula para determinar cuánta memoria consume un socket en Linux?

11

Estoy planeando algo de capacidad y me preguntaba si hay una fórmula que pueda usar para predecir (desde el punto de vista de la memoria) cuántas conexiones TCP podría manejar en mi servidor. Por el momento, solo me preocupan los requisitos de memoria.

Algunas variables que creo que aparecerán en la fórmula son:

  • sysctl net.ipv4.tcp_wmem(valor mínimo o predeterminado)
  • sysctl net.ipv4.tcp_rmem(valor mínimo o predeterminado)
  • El tamaño del calcetín, sock_common, proto y otras estructuras de datos por socket.

No estoy seguro de cuánto de tcp_wmem y tcp_rmem se asignan realmente y cuándo se asigna esa memoria. ¿En el momento de la creación del socket? ¿Bajo demanda?

Tim Stewart
fuente

Respuestas:

2

Si puede modificar el código fuente, utilice los datos de rusage para medir el RSS y registrar cuántas conexiones TCP están en juego en el momento de la medición.

Si no se puede cambiar el código fuente, utilice el RSS de la aplicación de red según lo informado por top o ps y obtenga el número de conexiones de red en el momento de la medición lsof -i.

Recopile estos datos cada minuto mientras su aplicación se mueve a través de la carga máxima, y ​​de esos datos puede llegar a una fórmula que relacione el número de conexiones con el uso de RAM.

Por supuesto, hay muchas más cosas que puede medir, en particular es posible que desee medir el uso de RAM del núcleo, aunque las estructuras de datos tcp deben ser predecibles y calculables de antemano. En cualquier caso, eche un vistazo a esta pregunta /server/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server para obtener más información sobre la sintonización TCP y cómo obtener una visión clara de lo que está sucediendo en la pila de red.

Michael Dillon
fuente
¡Gracias por estresar la medición y por señalarme enlaces que muestran cómo recopilar esas métricas!
Tim Stewart
8

tcp_mem es más importante porque define cómo debe comportarse la pila tcp cuando se trata del uso de la memoria. El búfer de envío y recepción de IMO debe ser un múltiplo de tcp_mem. Aquí hay un enlace a una fórmula para recibir buffer: http://www.acc.umu.se/~maswan/linux-netperf.txt . En breve:

La sobrecarga es: window / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale el valor predeterminado es 2) Entonces, para los parámetros predeterminados de linux para la ventana de recepción (tcp_rmem): 87380 - (87380/2 ^ 2) = 65536. Dado un enlace transatlántico (150 ms RTT), el rendimiento máximo termina en: 65536 / 0.150 = 436906 bytes / so aproximadamente 400 kbyte / s, lo cual es realmente lento hoy. Con el tamaño predeterminado aumentado: (873800 - 873800/2 ^ 2) /0.150 = 4369000 bytes / s, o aproximadamente 4Mbytes / s, lo cual es razonable para una red moderna. Y tenga en cuenta que este es el valor predeterminado, si el remitente está configurado con un tamaño de ventana más grande, se escalará felizmente hasta 10 veces (8738000 * 0.75 / 0.150 = ~ 40Mbytes / s), bastante bueno para una red moderna.

Esto es lo que dice el artículo sobre tcp_mem:

Lo que elimina es un límite artificial para el rendimiento de TCP, sin ese límite está limitado por el ancho de banda y la pérdida de extremo a extremo disponibles. Por lo tanto, puede terminar saturando su enlace ascendente de manera más efectiva, pero tcp es bueno para manejar esto.

En mi opinión, un valor tcp_mem medio más grande acelera la conexión al perder menos seguridad y aumenta ligeramente el uso de memoria.

Puede monitorear la pila de red con:

grep skbuff /proc/slabinfo
Gigamegs
fuente
1
Gracias por la respuesta informativa. Muestra cuánto necesito aprender sobre las redes.
Tim Stewart
1

David ha proporcionado una muy buena respuesta a la pregunta que se le hizo, sin embargo, a menos que esté utilizando exclusivamente LFN , incluso en un servidor basado en eventos, es probable que las memorias intermedias de TCP sean solo una pequeña parte de la huella por conexión.

Para la planificación de la capacidad no hay sustituto para probar el servidor y calcular la regresión del uso de memoria por carga.

symcbean
fuente
Gracias, es genial cuando una fórmula simple funcionará, pero hay momentos en los que solo tienes que medir.
Tim Stewart