El proceso MySQL supera el 100% del uso de la CPU

10

Estoy experimentando algunos problemas con mi servidor LAMP. Recientemente todo se volvió muy lento, aunque el número de visitantes en mis sitios web no cambió demasiado. Cuando ejecuto el topcomando, dice que el proceso MySQL ha tomado más del 150-200% de la CPU. ¿Cómo es eso posible, siempre pensé que 100% es un máximo?

Estoy ejecutando Ubuntu 9.04 server edition con 1,5 GB de RAM.

my.cnf ajustes:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Aquí está la salida de MySQLTuner :

Salida MySQLTuner

El topcomando:

salida superior

¿Cúal podría ser la causa de este problema? ¿Puedo hacer cambios en mi my.cnfpara evitar que el servidor se cuelgue?

Temnovit
fuente

Respuestas:

15
  1. Aumente Key Buffer (el suyo es actualmente de 64 MB, pero los índices totales son de 116 M, por lo tanto, coloque al menos 128 MB). Debería ayudar de inmediato.
  2. Ejecute mysqloptimize y mysqlrepair en sus tablas
  3. Aumente el caché de la tabla / disminuya el número total de tablas para aumentar la tasa de aciertos de la caché de la tabla. Tal vez tenga algunas tablas no utilizadas o antiguas que podrían eliminarse.

Otras opciones de confugración recomendadas:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • log-consultas-no-utilizando-índices

Verifique el archivo de registro después de un tiempo.

shakalandy
fuente
Gracias por las recomendaciones, las probaré y le haré saber si ayudó.
Temnovit
dígame por favor, ¿cómo calculó que los índices totales son 116M?
Temnovit
lo tengo yo mismo :)
Temnovit
5

Tiene un procesador que tiene más de un núcleo, o tiene múltiples procesadores. Si tiene dos núcleos y un proceso está utilizando el 100% de ambos núcleos, se mostrará como 200% en la parte superior.

Del mismo modo, es probable que esto funcione según lo previsto: su configuración no tiene nada de malo. Si experimenta bloqueos frecuentes, por lo que publicó, es posible que desee agregar índices adecuados a sus tablas (u optimizar sus consultas).

Kyle Brantley
fuente
5

Ejecute top -Hpara ver todos los subprocesos en ejecución y no solo el proceso general. Además, si presiona la 1tecla mientras está en la parte superior, le mostrará el uso de la CPU para las CPU / núcleos individuales.

Niall Donegan
fuente
Gracias, esto realmente me ayudó: he estado usando top durante años y no sabía que tenía esta capacidad. Encontré que hay un hilo de mysql "eterno" que consume el 60% de la CPU del usuario todo el tiempo, mientras que los hilos de consulta van y vienen encima de esto. Ahora para descubrir qué está haciendo realmente este hilo ...
scipilot
1

Mysql tiene múltiples procesos (hilos) que funcionan de forma independiente, uno, por ejemplo, es responsable de escribir los datos de la memoria en el disco. Con múltiples núcleos en la CPU (y / o múltiples CPU), más de un hilo está funcionando y, por lo tanto, puede ejecutar más del 100% de un solo núcleo; en un nivel simplista, tal vez el 75% de cada uno de los dos núcleos se está ejecutando , dando el 150%.

Alister Bulman
fuente
1

He notado un problema, no relacionado con la CPU. Si usa Apache y MySQL en el mismo servidor, puede alcanzar malas condiciones ( RAM ) cuando aumenta su actividad de Apache.

MySQLTunner le dice que usando las 200 conexiones disponibles (su configuración de conexión máxima) llenará la RAM. Digamos que tiene un proceso de apache limitado a 150, ciertamente no tendrá suficiente RAM cuando MySQL y apache intenten usar 150 conexiones (ya que Apache también es un buen devorador de RAM).

Entonces, esto se trata de RAM y quizás aún no haya sido alcanzado :-) Los comandos superiores muestran solo 15 procesos de apache (pero tiene un promedio de carga del 3/6/16, lo que significa que la tormenta fue hace 15 minutos y ahora está en dejando).

Sobre el problema de la CPU, para complementar la buena respuesta de shakalandy , esto puede deberse a una sola consulta. Puede estar en una mesa enorme, o haciendo muchas tareas de reindexación, o usando muchos archivos temporales, faltando un índice (¿eliminado?), Etc. La única forma de detectarlo es activando el registro de consulta lento (tal vez con un alto umbral, como 8s). Luego use la herramienta mysqlsla para analizar este registro lento de consultas y ejecute algunas explicaciones sobre las consultas identificadas.

regilero
fuente
Gracias, de hecho, mysql no es el único proceso alrededor :)
Temnovit