Ejecuto un sitio bastante ocupado, y durante las horas de observación veo más de 10.000 conexiones abiertas a mi servidor de base de datos en mi servidor web cuando ejecuto un comando netstat. El 99% de las conexiones están en el TIME_WAIT
estado.
Aprendí sobre esta variable mysql: wait_timeout
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout hoy. El mío todavía está configurado en los 28.800 segundos predeterminados.
¿Es seguro bajar este valor?
Ninguna de mis consultas generalmente toma más de un segundo. Por lo tanto, parece una tontería mantener una conexión abierta durante 480 minutos.
También escuché sobre el uso en mysql_pconnect
lugar de mysql_connect
, pero no he estado leyendo más que historias de terror al respecto, así que creo que me mantendré alejado de eso.
wait_timeout
hace que se cierre una conexión cuando el software espera que permanezca abierto.Respuestas:
Bajar el valor es bastante trivial sin un reinicio de mysql
Digamos que desea reducir los tiempos de espera a 30 segundos.
Primero, agregue esto a my.cnf
Entonces, puedes hacer algo como esto
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 esa conexión abierta hasta que se agota el tiempo de espera. Peor aún, puede ver TIME_WAITs con más frecuencia. Elija sus valores de tiempo de espera sabiamente.
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 líneas:Cuando ejecute esto, debería ver algo como esto:
Si todavía ve una gran cantidad de mysql
TIME_WAITs
para cualquier servidor web dado, aquí hay dos pasos de escalación a seguir:ESCALACIÓN # 1
Inicie sesión en el servidor web infractor y reinicie Apache de la siguiente manera:
Si es necesario, haga esto a todos los servidores web
ESCALACIÓN # 2
Puede forzar al sistema operativo a eliminar TIME_WAITs para mysql o cualquier otra aplicación con lo siguiente:
Esto hará que TIME_WAITs agote el tiempo de espera en 1 segundo.
Para dar crédito donde se debe crédito ...
TIME_WAIT
aparece a.fuente
Si está obteniendo 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 un host o varios hosts se pusieran en una lista de bloqueo. Puede borrar esto ejecutando:
Para obtener una lista de la cantidad de conexiones que tiene por ejecución de IP:
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:
fuente
Si tiene muchas conexiones TIME_WAIT a su servidor MySQL, significa que su código ejecuta muchas consultas en su base de datos y abre / cierra una conexión para cada consulta.
En este caso, debe utilizar la conectividad persistente a su servidor de base de datos, utilizando la extensión MySQLi.
http://php.net/manual/en/mysqli.persistconns.php
Si no puede usar MySQLi, debería usar el parámetro thread_cache_size en su configuración de MySQL.
fuente