sql >> Base de Datos >  >> RDS >> Mysql

mysql TIEMPO_ESPERA; problema de demasiadas conexiones

Si un cliente se conecta a un servidor MySQL, generalmente abre un puerto local, ejemplo:

 localhost:12345 -> mysqlserver:3306

Si el cliente cierra la conexión, obtiene un TIME_WAIT. Debido al enrutamiento TCP, es posible que un paquete llegue tarde al puerto temporal. Una conexión en TIME_WAIT simplemente descarta estos paquetes. Sin TIME_WAIT, el puerto local podría reutilizarse para otra conexión y podría recibir paquetes de una conexión anterior.

En una aplicación de alta frecuencia en la web que abre una conexión mysql por solicitud, se espera una gran cantidad de conexiones TIME_WAIT. No tiene nada de malo.

Pueden ocurrir problemas, si su rango de puerto local es demasiado bajo, por lo que ya no puede abrir conexiones salientes. El tiempo de espera habitual se establece en 60 segundos. Entonces, un problema ya puede ocurrir en más de 400 solicitudes por segundo en rangos bajos.

Verificar:

Para verificar la cantidad de TIME_WAIT, puede usar el siguiente comando:

$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

El valor después de "tw", en este caso 33365, muestra la cantidad de TIME_WAIT.

Soluciones:

una. Ajuste TIME_WAIT (ejemplos de sistemas operativos basados ​​en Linux):

Reduzca el tiempo de espera para TIME_WAIT:

# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout

Aumente el rango de puertos para puertos locales:

# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range

La configuración /proc/sys/net/ipv4/tcp_tw_recycle y /proc/sys/net/ipv4/tcp_tw_reuse también podría ser interesante. (Pero experimentamos efectos secundarios extraños con esta configuración, así que es mejor evitarlos. Más información en este respuesta )

b. Conexiones persistentes

Algunos lenguajes de programación y bibliotecas admiten conexiones persistentes. Otra solución podría ser usar un proxy instalado localmente como "ProxySQL". Esto reduce la cantidad de conexiones nuevas y cerradas.