2011-08-18 13 views
6

Tengo picos de CPU muy altos en el proceso de mysqld (más del 100%, e incluso vi un 300% en un punto). Mi promedio de carga es de alrededor de .25, .34, .28.MySQL Alto uso de CPU y enlaces persistentes

leí este gran post sobre este tema: MySQL high CPU usage

Una de las principales cosas que hacer es desactivar las conexiones persistentes. Así que revisé mi php.ini y mysql.allow_persistent = on y mysql.max_persistent = -1, lo que significa que no hay límite.

Esto plantea algunas preguntas para mí antes de cambiar nada sólo para estar seguro:

  1. Si mi proceso mysqld se Rematar más del 100% cada par de segundos no deberían mi promedio de carga será mayor a continuación, que son?
  2. Lo que deshabilitarán los enlaces persistentes, ¿mis scripts continuarán funcionando como están?
  3. Si apago esto y vuelvo a cargar php, ¿qué significa esto para mis usuarios actuales, ya que habrá muchos usuarios activos.

EDIT: Información

CPU: Core2Quad Q9400 2.6 Ghz

Respuesta

8

Las conexiones persistentes no usarán ninguna CPU por sí solas; si nada está utilizando una conexión, está simplemente inactiva y solo consume un poco de memoria y ocupa un zócalo.

Los promedios de carga son solo eso, medias. Si tiene un proceso que alterna entre 0% y 100% 10 veces por segundo, obtendría un promedio de carga de 0.5. Son buenos para descubrir la alta CPU persistente a largo plazo, pero por su naturaleza esconden/borran los signos de picos.

Las conexiones persistentes con mysql generalmente no son necesarias. MySQL tiene un protocolo de conexión relativamente rápido y cualquier ahorro de tiempo mediante el uso de conexiones persistentes es bastante mínimo. La desventaja es que una vez que una conexión continúa, puede dejarse en un estado inconsistente. p.ej. Si una aplicación que utiliza la conexión muere inesperadamente, MySQL no verá eso y comenzará a limpiar. Esto significa que cualquier variable del lado del servidor creada por la aplicación, cualquier bloqueo, cualquier transacción, etc., se dejará en el estado en el que se encontraba cuando la aplicación se bloqueó.

Cuando la conexión se vuelve a utilizar por otra aplicación, comenzará con lo que equivale a platos sucios en el fregadero y un inodoro no enjuagado. Puede causar bloqueos debido a las transacciones/bloqueos colgantes: la nueva aplicación no los conocerá y la aplicación anterior ya no está disponible para renunciar a ellos.

+0

gracias por la analogía del baño :) Así que la opción de enlaces persistentes en mi php.ini está bien, pero no uses mysql_pconnect - lo obtuve. – bMon

+0

¿En qué punto (número) debería uno preocuparse por los promedios de la carga? Más de 1.0, 5.0, 20.0? – bMon

+2

no hay nada de malo con las conexiones persistentes, siempre y cuando tenga el correcto "zomg acabo de cargar mis pantalones" manejo en caso de que alguno de sus scripts - si el script muere, entonces ejecute una llamada cercana para que mysql pueda limpiar. –

0

Spikes están bien. Esto es MySQL haciendo trabajo. Su promedio de carga parece apropiado.

La desactivación de enlaces persistentes simplemente significa que los scripts no pueden usar una conexión existente a la base de datos. No recomendaría deshabilitar esto. Por lo menos, si desea deshabilitarlos, hágalo en la aplicación más tarde, en lugar de en MySQL. Esto podría incluso aumentar ligeramente la carga, dependiendo de las condiciones.

Finalmente, la persistencia DB no tiene nada que ver con los usuarios en su sitio (en general). Los usuarios hacen una solicitud, y una vez que se cargan todos los recursos de la página, eso es todo, hasta la siguiente solicitud. (Excepto en algunos casos específicos). En cualquier caso, mientras se realiza la solicitud, la secuencia de comandos seguirá conectada a la base de datos.