2010-01-19 12 views
5

Tengo un servidor de aplicaciones (embarcadero 6 en una caja Linux) que aloja 15 aplicaciones individuales (guerras individuales). Cada 3 o 4 días recibo una alerta de nagios con respecto al número de conexiones TCP abiertas. Tras la inspección, veo que la gran mayoría de estas conexiones son para el servidor MySQL.Rastreo de fugas de la conexión MySQL

netstat -ntu | grep TIME_WAIT 

Shows más de 10.000 conexiones en el servidor MySQL desde el servidor de aplicaciones (nótese el estado TIME_WAIT es). Si reinicio el embarcadero las conexiones caen casi a cero.

algunos valores interesantes desde un estado de espectáculo:

mysql> show status; 
+--------------------------+-----------+ 
| Variable_name   | Value  | 
+--------------------------+-----------+ 
| Aborted_clients   | 244  | 
| Aborted_connects   | 695853860 | 
| Connections    | 697203154 | 
| Max_used_connections  | 77  | 
+--------------------------+-----------+ 

un "show processlist" no muestra nada fuera de lo normal (que es lo que sería de esperar ya que la mayoría de las conexiones son ralentí - recordar la Estado TIME_WAIT desde arriba).

Tengo una PRUEBA env para este servidor pero nunca tiene ningún problema. Obviamente, no recibe mucho tráfico y el servidor de aplicaciones se reinicia constantemente, por lo que la eliminación de errores no es de mucha ayuda. Supongo que podría profundizar en cada aplicación individual y escribir una prueba de carga que golpearía el código de la base de datos, pero esto tomaría mucho tiempo/molestia.

¿Alguna idea de cómo podría rastrear la aplicación que está tomando todas estas conexiones y nunca dejar ir?

Respuesta

3

La respuesta parece estar añadiendo las siguientes entradas en my.cnf en [mysqld] :

wait_timeout=60 
interactive_timeout=60 

lo encontré aquí (todo el camino en la parte inferior): http://community.livejournal.com/mysql/82879.html

El valor por defecto el tiempo de espera para matar una conexión obsoleta es de 22800 segundos. Para verificar :

EDIT: se me olvidó mencionar, que también añadió lo siguiente a /etc/sysctl.conf:

net.ipv4.tcp_fin_timeout = 15 

Esto se supone para ayudar a bajar el umbral de espera del OS antes de reutilizar los recursos de conexión.

EDIT 2: /etc/init.d/mysql recargar realmente no se recargue su my.cnf (ver el enlace más abajo)

+2

No estoy seguro de que la recarga vuelva a cargar la configuración sin un reinicio completo. Verifique su comportamiento y la documentación. – MarkR

+0

Buen punto - http://serverfault.com/questions/79043/reload-my-cnf-without-restarting-mysql-service – jckdnk111

0

Bueno, una cosa que me viene a la mente (aunque no soy un experto en esto) es aumentar el registro en mySQL y buscar todos los mensajes de conexión/cierre. Si eso no funciona, puede escribir un pequeño proxy para sentarse entre el servidor mySQL real y su suite de aplicaciones que hace el registro adicional y sabrá quién se está conectando/saliendo.

+0

Pude hacer esto en el entorno de prueba, pero luego volví a escribir pruebas de carga en el código db nuevamente (para poder obtener algo de actividad en los registros). Esperaba algo de magia MySQL para rastrear una conexión muerta a un usuario/esquema/host/etc ... – jckdnk111

+0

¿Por qué no aumentar el registro en el servidor de producción? –

+0

Desde my.cnf directamente encima de la sección de registro "Tenga en cuenta que este tipo de registro es un asesino de rendimiento". Además, esto requeriría un reinicio del servidor PROD MySQL. Como este servidor db aloja muchos otros proyectos en vivo, realmente no puedo permitirme meterme con él innecesariamente. – jckdnk111

2

Posiblemente el grupo de conexiones están mal configurados para aferrarse a demasiadas conexiones y se mantienen en demasiados procesos inactivos.

Aparte de eso, todo lo que puedo pensar es que una parte del código se mantiene en un conjunto de resultados, pero parece menos probable. Para ver si es una consulta lenta que se agota, también puede configurar mysql para escribir en un registro lento de consultas en el archivo conf, y luego escribirá todas las consultas que tarden más de X segundos (el valor predeterminado es 5, creo) .

+0

Estoy registrando consultas lentas y eso realmente no parece ser un problema. Miré las configuraciones del conjunto de conexiones y todos me parecen bastante sanos. Los mecanismos de agrupación varían bastante (DBCP, persistencia de mariposa, Hibernate/JPA, beenkeeper, iBatis, etc.) por lo que no estoy seguro de mi capacidad para detectar una configuración incorrecta. – jckdnk111

0

SHOW PROCESSLIST muestra el usuario, servidor y base de datos para cada hilo.A menos que todas sus 15 aplicaciones utilicen la misma combinación, entonces debería poder diferenciar el uso de esta información.

+0

Solo para conexiones en vivo - no muestra conexiones obsoletas. – jckdnk111

0

Tuve el mismo problema con +30,000 TIME_WAIT en mi servidor cliente. Se ha solucionado el problema mediante la adición, en /etc/sysctl.conf:

net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_fin_timeout = 30 

Entonces:

/sbin/sysctl -p 

después de 2 o 3 minutos, conexiones TIME_WAIT fueron de 30 000-7 000.

0

/proc/sys/net/ipv4/tcp_fin_timeout fue 60 en RHEL7.tcp_tw_reuse y tcp_tw_recycle se cambió a 1 y se mejoró el rendimiento.

Cuestiones relacionadas