Uso de CPU alto de MySQL

Recientemente mi CPU de servidor ha estado yendo muy alto.

Los promedios de carga de la CPU son 13.91 (1 min) 11.72 (5 mins) 8.01 (15 min) y mi sitio solo ha tenido un ligero aumento en el tráfico.

Después de ejecutar un comando superior, vi que MySQL estaba usando un 160% de CPU.

Recientemente he estado optimizando las tablas y he cambiado a las conexiones persistentes. ¿Podría esto causar que MySQL use grandes cantidades de CPU?

Primero, diría que probablemente desee desactivar las conexiones persistentes, ya que casi siempre causan más daño que beneficio.

En segundo lugar, diría que desea verificar dos veces sus usuarios de MySQL, solo para asegurarse de que no sea posible que alguien se esté conectando desde un servidor remoto. Esto también es una cuestión de seguridad importante para verificar.

En tercer lugar, diría que desea activar el registro de consultas lentas de MySQL para controlar cualquier consulta que lleve mucho tiempo y utilizarla para asegurarse de que no tenga ninguna consulta bloqueando las tablas de claves durante demasiado tiempo.

Algunas otras cosas que puede verificar serían ejecutar la siguiente consulta mientras la carga de la CPU es alta:

SHOW PROCESSLIST; 

Esto le mostrará las consultas que se están ejecutando actualmente o en la cola para ejecutar, qué es la consulta y qué está haciendo (este comando truncará la consulta si es demasiado larga, puede usar SHOW FULL PROCESSLIST para ver el texto completo de la consulta) .

También querrá vigilar cosas como el tamaño del búfer, la memoria caché de tabla , el caché de consultas y innodb_buffer_pool_size (si está utilizando tablas innodb) ya que todas estas asignaciones de memoria pueden afectar el rendimiento de las consultas, lo que puede causar que MySQL comer CPU.

También es probable que desee dar una lectura a los siguientes ya que contienen buena información.

  • Cómo MySQL usa memoria
  • Variables del sistema MySQL

También es una muy buena idea usar un generador de perfiles. Algo que puede activar cuando lo desee que le mostrará qué consultas está ejecutando su aplicación, si hay consultas duplicadas, cuánto tiempo están tomando, etc. Un ejemplo de algo como este es en el que he estado trabajando llamado PHP Profiler, pero hay muchos por ahí. Si está utilizando un software como Drupal, Joomla o WordPress, querrá preguntar dentro de la comunidad, ya que probablemente haya módulos disponibles que le permitan obtener esta información sin necesidad de integrar nada manualmente.

Como esta es la publicación más importante, si usas MySQL para una carga o uso elevado de la CPU, agregaré una respuesta adicional:

El 1 de julio de 2012, se añadió un segundo intercalar al tiempo UTC actual para compensar la disminución de la velocidad de rotación de la tierra debido a las mareas. Al ejecutar ntp (o ntpd), este segundo se agregó al reloj de su computadora / servidor. A MySQLd no parece gustarle este segundo extra en algunos sistemas operativos, y ofrece una alta carga de CPU. La solución rápida es (como raíz):

 $ /etc/init.d/ntpd stop $ date -s "`date`" $ /etc/init.d/ntpd start 

Si este servidor es visible para el mundo exterior, vale la pena comprobar si tiene muchas solicitudes para conectarse desde el mundo exterior (es decir, las personas que intentan entrar en él).