Estoy programando un servidor y parece que mi número de conexiones está limitado ya que mi ancho de banda no está saturado, incluso cuando he establecido el número de conexiones en "ilimitado".
¿Cómo puedo aumentar o eliminar un número máximo de conexiones que mi caja de Ubuntu Linux puede abrir a la vez? ¿El sistema operativo limita esto, o es el enrutador o el ISP? ¿O es otra cosa?
linux
networking
linux-kernel
red0ct
fuente
fuente
Respuestas:
El número máximo de conexiones se ve afectado por ciertos límites tanto en el lado del cliente como del servidor, aunque de manera un poco diferente.
En el lado del cliente: aumente el rango de puertos ephermal y disminuya el
tcp_fin_timeout
Para conocer los valores predeterminados:
El rango de puertos ephermal define el número máximo de sockets salientes que un host puede crear desde una dirección IP particular. El
fin_timeout
define el tiempo mínimo de estas tomas permanecerán enTIME_WAIT
estado (inutilizable después de ser utilizado una vez). Los valores predeterminados habituales del sistema son:net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Esto básicamente significa que su sistema no puede garantizar consistentemente más de
(61000 - 32768) / 60 = 470
sockets por segundo. Si no está satisfecho con eso, podría comenzar aumentando elport_range
. Establecer el rango en15000 61000
es bastante común en estos días. Podría aumentar aún más la disponibilidad disminuyendo elfin_timeout
. Suponga que hace ambas cosas, debería ver más de 1500 conexiones salientes por segundo, más fácilmente.Para cambiar los valores :
Lo anterior no debe interpretarse como los factores que afectan la capacidad del sistema para realizar conexiones salientes por segundo. Pero más bien, estos factores afectan la capacidad del sistema para manejar conexiones concurrentes de manera sostenible durante grandes períodos de "actividad".
Los valores predeterminados de Sysctl en un cuadro típico de Linux para
tcp_tw_recycle
ytcp_tw_reuse
seríanEstos no permiten una conexión desde un zócalo "usado" (en estado de espera) y obligan a los zócalos a durar el
time_wait
ciclo completo . Recomiendo configurar:Esto permite un ciclo rápido de los enchufes en
time_wait
estado y su reutilización. Pero antes de hacer este cambio, asegúrese de que no entre en conflicto con los protocolos que usaría para la aplicación que necesita estos sockets. Asegúrese de leer la publicación "Enfrentando el TCP TIME-WAIT" de Vincent Bernat para comprender las implicaciones. Lanet.ipv4.tcp_tw_recycle
opción es bastante problemática para los servidores públicos, ya que no manejará las conexiones de dos computadoras diferentes detrás del mismo dispositivo NAT , lo cual es un problema difícil de detectar y espera para morderte. Tenga en cuenta quenet.ipv4.tcp_tw_recycle
se ha eliminado de Linux 4.12.En el lado del servidor: el
net.core.somaxconn
valor tiene un papel importante. Limita el número máximo de solicitudes en cola a un socket de escucha. Si está seguro de la capacidad de su aplicación de servidor, aumente el valor predeterminado de 128 a algo así como 128 a 1024. Ahora puede aprovechar este aumento modificando la variable de backlog de escucha en la llamada de escucha de su aplicación, a un número entero igual o superior.txqueuelen
El parámetro de sus tarjetas Ethernet también tiene un papel que desempeñar. Los valores predeterminados son 1000, por lo tanto, amplíelos hasta 5000 o incluso más si su sistema puede manejarlo.Del mismo modo aumentar los valores de
net.core.netdev_max_backlog
ynet.ipv4.tcp_max_syn_backlog
. Sus valores predeterminados son 1000 y 1024 respectivamente.Ahora recuerde iniciar las aplicaciones del lado del cliente y del servidor aumentando los límites de FD en el shell.
Además de la técnica anterior más utilizada por los programadores, es reducir la cantidad de llamadas de escritura tcp . Mi preferencia es usar un búfer en el que inserto los datos que deseo enviar al cliente y luego, en los puntos apropiados, escribo los datos almacenados en el zócalo real. Esta técnica me permite usar grandes paquetes de datos, reducir la fragmentación, reduce la utilización de mi CPU tanto en el terreno del usuario como a nivel del núcleo.
fuente
(61000 - 32768) / 60 = 470 sockets per second
. ¿Puedes por favor elaborar esto?Hay un par de variables para establecer el número máximo de conexiones. Lo más probable es que primero te estés quedando sin números de archivo. Verifique ulimit -n. Después de eso, hay configuraciones en / proc, pero las predeterminadas son decenas de miles.
Más importante aún, parece que estás haciendo algo mal. Una sola conexión TCP debería ser capaz de usar todo el ancho de banda entre dos partes; si no lo es:
ping -s 1472
...)tc
iperf
Posiblemente he entendido mal. Tal vez estás haciendo algo como Bittorrent, donde necesitas muchas conexiones. Si es así, debe averiguar cuántas conexiones está utilizando realmente (intente
netstat
olsof
). Si ese número es sustancial, podría:ulimit -n
. Aún así, ~ 1000 conexiones (por defecto en mi sistema) son bastantes.iostat -x
?Además, si está utilizando un enrutador NAT de nivel de consumidor (Linksys, Netgear, DLink, etc.), tenga en cuenta que puede exceder sus capacidades con miles de conexiones.
Espero que esto ayude un poco. Realmente estás haciendo una pregunta sobre redes.
fuente
Para mejorar la respuesta dada por derobert,
Puede determinar cuál es el límite de conexión de su sistema operativo capturando nf_conntrack_max.
Por ejemplo: cat / proc / sys / net / netfilter / nf_conntrack_max
Puede usar el siguiente script para contar el número de conexiones tcp a un rango determinado de puertos tcp. Por defecto 1-65535.
Esto confirmará si está maximizando o no el límite de conexión de su sistema operativo.
Aquí está el guión.
fuente
which awk
es tu amigo para determinar el camino hacia awk, SunOS también tiene un enlace :)which
se basa en el programa,PATH
en cuyo caso puede usarlo enawk
lugar de proporcionar la ruta completa. (Dicho esto, no estoy seguro de si la solución en el script está más cerca de la perfección, pero de esto no se trata el script).awk
ubicación, pero asume que Shell siempre es/bin/bash
(consejo profesional: AIX5 / 6 ni siquiera tiene bash por defecto).awk
útil la detección? Personalmente me gustaría asumir simplemente para tener una correctaPATH
sino una alternativa razonable podría ser/usr/bin/env awk
y/usr/bin/env bash
, respectivamente. Por lo que vale, se equivocó de ubicación en mi sistema Linux. Está en/usr/bin/awk
no/bin/awk
En un nivel de aplicación, aquí hay algo que un desarrollador puede hacer:
Del lado del servidor:
Compruebe si el equilibrador de carga (si lo tiene) funciona correctamente.
Convierta los tiempos de espera TCP lentos en 503 Respuesta inmediata rápida, si el equilibrador de carga funciona correctamente, debería elegir el recurso de trabajo para servir, y es mejor que quedarse allí con masajes de error inesperados.
Por ejemplo: si está usando un servidor de nodo, puede usar demasiado ocupado desde npm. Implementación algo como:
¿Por qué 503? Aquí hay algunas buenas ideas para la sobrecarga: http://ferd.ca/queues-don-t-fix-overload.html
También podemos hacer algo de trabajo en el lado del cliente:
Intente agrupar las llamadas por lotes, reduzca el tráfico y el número total de solicitudes en blanco y negro cliente y servidor.
Intente construir una capa intermedia de caché para manejar solicitudes duplicadas innecesarias.
fuente