2010-10-29 40 views
9

Estoy insertando una prueba de estrés en mi aplicación web que se conecta a un servidor mysql y estoy monitoreando la lista de procesos show de mysql.La lista de procesos show de Mysql enumera muchos procesos sleep e info = null?

cuando la carga es alta (alta de intercambio de e/s) consigo muchos procesos como la que:

| 97535 | db| localhost | userA | Sleep | 515 |   | NULL 
| 97536 | db| localhost | userA | Sleep | 516 |   | NULL 
| 97786 | db| localhost | userA | Sleep | 343 |   | NULL 
| 97889 | db| localhost | userA | Sleep | 310 |   | NULL 

Pero no puedo entender por qué están todavía allí y no destruyen? Esto finalmente lleva a que mi aplicación use todas las max_connections y detenga el procesamiento de las solicitudes entrantes ...

¿Alguna idea de qué son esos procesos y qué están haciendo allí :)?

Respuesta

12

Esas son conexiones inactivas retenidas por un cliente. Debe asegurarse de que la biblioteca de cliente que esté utilizando (JDBC, ...) esté configurada para no mantener abiertas las conexiones no utilizadas durante tanto tiempo, o que sus # clientes * número máximo de conexiones no sean demasiado grandes.

+0

¿Hay alguna variable de tiempo de espera de mysql que pueda ajustar para evitar esto? – AlfaTeK

+4

Puede establecer wait_timeout en algo más pequeño (http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout) o aumentar el límite de conexión. Sin embargo, realmente quiere resolver esto en el lado de la aplicación. Colgar la conexión desde el lado de la base de datos corre el riesgo de cerrar una conexión justo cuando la aplicación intenta usarla, lo que puede causar un error de la aplicación sin una buena razón. ¿Qué biblioteca de conexión de base de datos está usando? –

+0

@KeithRandall, pero ¿cómo identificar los procesos nulos? – Khuram

3

Supongo que está utilizando conexiones permanentes, p. pconnect en php:

[..] cuando se conecta, la función intentará encontrar un enlace (persistente) que ya está abierto con el mismo host, nombre de usuario y contraseña. Si se encuentra uno, un identificador para que se devolverá en lugar de abrir una nueva conexión

y

[..] la conexión con el servidor SQL no se cerrará cuando la ejecución de la script termina. En su lugar, el enlace permanecerá abierta para su uso futuro

tuve una situación similar, y estaba usando CodeIgniter con pconnect encendido. Después de desactivarlo (see how) cada conexión se cerró correctamente después de su uso, y mi lista de procesos MySQL estaba vacía.

Rendimiento: Lo anterior no discute sobre el rendimiento, sino que simplemente trata de explicar por qué es posible que vea muchas conexiones Sleeping en MySQL. Puede que no sea negativo, con respecto al rendimiento, mantener las conexiones activas. Más información en: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

Cuestiones relacionadas