web-dev-qa-db-fra.com

Le processus MySQL passe plus de 100% de l'utilisation de la CPU

Je rencontre des problèmes avec mon serveur de lampe. Récemment, tout est devenu très lent, même si les visiteurs comptent sur mes sites Web ne changèrent pas beaucoup. Lorsque je gère top commande, il est indiqué que le processus MySQL a pris plus de 150-200% de la CPU. Comment est-ce possible, j'ai toujours pensé que 100% est un maximum?

J'exécute une édition de serveur Ubuntu 9.04 avec 1,5 Go de RAM.

my.cnf Les paramètres:

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

Voici la sortie de mysqlTuner :

MySQLTuner output

La commande top:

top output

Quelle pourrait être la cause de ce problème? Puis-je apporter des modifications à mon my.cnf Pour empêcher le serveur de pendre?

10
Temnovit
  1. Augmentez le tampon clé (le vôtre est actuellement de 64 Mo, mais les index total sont de 116 m, alors mettez au moins 128 Mo). Devrait aider immédiatement.
  2. Run mysqloptimize et mysqlrepair sur vos tables
  3. Augmentez le cache de table/diminution du nombre total de tables pour augmenter le taux de frappe du cache de table. Peut-être que vous avez des tables non utilisées ou anciennes qui pourraient être supprimées.

Autres options de confrontation recommandées:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • demandes de journal-NUT-UTILISATION-INDEXES

Vérifiez le fichier journal après un certain temps.

15
shakalandy

Vous avez un processeur qui possède plus d'un noyau ou vous avez plusieurs processeurs. Si vous avez deux noyaux et un processus utilise 100% des cœurs, il montrera 200% en haut.

De même, cela fonctionne probablement comme prévu - rien n'est faux avec votre configuration. Si vous rencontrez des suspensions fréquentes, à partir de ce que vous avez posté, vous pouvez envisager d'ajouter des index appropriés à vos tables (ou d'optimiser vos requêtes).

5
Kyle Brantley

Courir top -H Pour voir tous les threads de course et non seulement le processus global. En outre, si vous frappez le 1 Touche en haut, il vous montrera la consommation de la CPU pour les processeurs/cœurs individuels.

5
Niall Donegan

MySQL dispose de plusieurs processus (threads) fonctionnant indépendamment, par exemple, est responsable de l'écriture de données de la mémoire sur le disque. Avec plusieurs cœurs de la CPU (et/ou des processeurs multiples), plusieurs threads fonctionnent, ce qui peut fonctionner plus de 100% d'un noyau unique - sur un niveau simpliste, peut-être 75% de chacun des deux cœurs fonctionnent. , donnant 150%.

1
Alister Bulman

J'ai remarqué un problème, non lié à la CPU. Si vous utilisez Apache et MySQL sur le même serveur, vous pouvez atteindre de mauvaises conditions ( [~ # ~ ~] RAM [~ # ~]) lorsque votre activité Apache augmente.

MySQLTUNNER vous indique que l'utilisation des 200 connexions disponibles (votre paramètre de connexion maximum) vous remplirez la RAM. Disons que vous disposiez d'Apache limitée à 150 processus, vous n'aurez certainement pas assez RAM lorsque MySQL et Apache tenteront d'utiliser 150 connexions (comme Apache, c'est un bon RAM mangeur).

Donc ceci est à propos de RAM et vous n'êtes peut-être pas encore touché :-) Les commandes supérieures indiquent seulement 15 processus Apache (mais vous êtes en charge la moyenne 3/6/16, donc cela signifie que le La tempête était il y a 15 minutes et est maintenant en train de partir).

À propos du problème de la CPU, pour compléter la bonne réponse de Shakalandy, cela peut être dû à une seule requête. Il peut s'agir d'une table immense ou de faire beaucoup de tâches de réindex, ou d'utiliser beaucoup de fichier temporaire, un index manquant (supprimé?), Etc. Le seul moyen de détecter qu'il active le lent Journal de requête (peut-être avec un thréféreux élevé, comme 8s). Ensuite, utilisez l'outil mysqlsla outil pour analyser ce journal de requête lent et expliquer certaines expliquer sur les requêtes identifiées.

1
regilero