Saltar al contenido

MySQL reduce el valor de wait_timeout para reducir el número de conexiones abiertas

Te traemos el resultado a este enigma, o por lo menos eso pensamos. Si sigues con interrogantes puedes dejar un comentario y sin dudarlo te ayudaremos

Solución:

Solución 1:

Reducir el valor es bastante trivial sin reiniciar mysql

Supongamos que desea reducir los tiempos de espera a 30 segundos

Primero, agregue esto a my.cnf

[mysqld]
interactive_timeout=30
wait_timeout=30

Entonces, puedes hacer algo como esto.

mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"

Todas las conexiones de base de datos después de esto expirarán en 30 segundos

ADVERTENCIA

Asegúrese de usar explícitamente mysql_close. No confío en Apache como lo hacen la mayoría de los desarrolladores. Si no, a veces, hay una condición de carrera en la que Apache cierra una conexión DB pero no informa a mysqld y mysqld mantiene abierta esa conexión hasta que se agote el tiempo de espera. Peor aún, es posible que vea TIME_WAIT con más frecuencia. Elija sabiamente sus valores de tiempo de espera.

ACTUALIZACIÓN 2012-11-12 10:10 EDT

ADVERTENCIA

Después de aplicar mis sugerencias publicadas, cree un script llamado /root/show_mysql_netstat.sh con las siguientes lineas:

netstat | grep mysql > /root/mysql_netstat.txt
cat /root/mysql_netstat.txt | awk 'print $5' | sed 's/:/ /g' | awk 'print $2' | sort -u > /root/mysql_netstat_iplist.txt
for IP in `cat /root/mysql_netstat_iplist.txt`
do
        ESCOUNT=`cat /root/mysql_netstat.txt | grep ESTABLISHED | awk 'print $5' | grep -c "$IP"`
        TWCOUNT=`cat /root/mysql_netstat.txt | grep TIME_WAIT   | awk 'print $5' | grep -c "$IP"`
        IPPAD=`echo "$IP..................................." | cut -b -35`
        (( ESCOUNT += 1000000 ))
        (( TWCOUNT += 1000000 ))
        ES=`echo $ESCOUNT | cut -b 3-`
        TW=`echo $TWCOUNT | cut -b 3-`
        echo $IPPAD : ESTABLISHED:$ES TIME_WAIT:$TW
done
echo ; echo
netstat -nat | awk 'print $6' | sort | uniq -c | sort -n | sed 's/d)/d/'

Cuando ejecutes esto, deberías ver algo como esto:

[[email protected]*** ~]# /root/ShowConnProfiles.sh
10.48.22.4......................... : ESTABLISHED:00002 TIME_WAIT:00008
10.48.22.8......................... : ESTABLISHED:00000 TIME_WAIT:00002
10.64.51.130....................... : ESTABLISHED:00001 TIME_WAIT:00000
10.64.51.133....................... : ESTABLISHED:00000 TIME_WAIT:00079
10.64.51.134....................... : ESTABLISHED:00002 TIME_WAIT:00001
10.64.51.17........................ : ESTABLISHED:00003 TIME_WAIT:01160
10.64.51.171....................... : ESTABLISHED:00002 TIME_WAIT:00000
10.64.51.174....................... : ESTABLISHED:00000 TIME_WAIT:00589
10.64.51.176....................... : ESTABLISHED:00001 TIME_WAIT:00570


      1 established
      1 Foreign
     11 LISTEN
     25 ESTABLISHED
   1301 TIME_WAIT

Si todavía ves mucho mysql TIME_WAITs para cualquier servidor web dado, aquí hay dos pasos de escalamiento a seguir:

ESCALADA #1

Inicie sesión en el servidor web infractor y reinicie apache de la siguiente manera:

service httpd stop
sleep 30
service httpd start

Si es necesario, haz esto en todos los servidores web.

service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)

ESCALADA #2

Puede obligar al sistema operativo a eliminar TIME_WAITs para mysql o cualquier otra aplicación con lo siguiente:

SEC_TO_TIMEWAIT=1
echo $SEC_TO_TIMEWAIT > /proc/sys/net/ipv4/tcp_tw_recycle
echo $SEC_TO_TIMEWAIT > /proc/sys/net/ipv4/tcp_tw_reuse

Esto hará que TIME_WAIT se agote en 1 segundo.

Para dar crédito donde se debe crédito…

  • Obtuve esta idea de esta publicación: ¿Cómo cerrar a la fuerza un socket en TIME_WAIT?
  • La respuesta aceptada tiene una representación pictórica de cuando un TIME_WAIT llega a existir.
  • La respuesta con la idea que me gustó es la que ahora sugiero.

Solución 2:

Si obtiene muchas conexiones TIME_WAIT en el servidor MySQL, eso significa que el servidor MySQL está cerrando la conexión. El caso más probable en este caso sería que uno o varios hosts estuvieran en una lista de bloqueo. Puede borrar esto ejecutando:

mysqladmin flush-hosts

Para obtener una lista de la cantidad de conexiones que tiene por ejecución de IP:

 netstat -nat | awk 'print $5' | cut -d ":" -f1 | sort | uniq -c | sort -n

También puede confirmar que esto está sucediendo yendo a uno de sus clientes que tiene problemas para conectarse y telnet al puerto 3306. Mostrará un mensaje con algo como:

telnet mysqlserver 3306
Trying 192.168.1.102...
Connected to mysqlserver.
Escape character is '^]'.
sHost 'clienthost.local' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.

Te mostramos las comentarios y valoraciones de los lectores

Si sostienes alguna suspicacia y forma de aclarar nuestro ensayo puedes escribir una acotación y con mucho placer lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *