Le processus MySQL dépasse 100% de l'utilisation du processeur

10

Je rencontre des problèmes avec mon serveur LAMP. Récemment, tout est devenu très lent, même si le nombre de visiteurs sur mes sites Web n'a pas beaucoup changé. Lorsque j'exécute une topcommande, cela indique que le processus MySQL a pris plus de 150-200% du CPU. Comment est-ce possible, j'ai toujours pensé que 100% est un maximum?

J'utilise l'édition serveur Ubuntu 9.04 avec 1,5 Go de RAM.

my.cnf réglages:

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 :

Sortie MySQLTuner

La topcommande:

sortie supérieure

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

Temnovit
la source

Réponses:

15
  1. Augmentez le tampon de clé (le vôtre est actuellement de 64 Mo, mais les index totaux sont de 116 Mo, alors mettez au moins 128 Mo). Devrait aider immédiatement.
  2. Exécutez mysqloptimize et mysqlrepair sur vos tables
  3. Augmentez le cache de table / diminuez le nombre total de tables pour augmenter le taux d'accès au cache de table. Vous avez peut-être des tables inutilisées ou anciennes qui pourraient être supprimées.

Autres options de configuration recommandées:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • log-queries-not-using-indexes

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

shakalandy
la source
Merci pour les recommandations, je vais les essayer et vous faire savoir si cela a aidé.
Temnovit
dites-moi s'il vous plaît, comment avez-vous calculé que les indices totaux sont 116M?
Temnovit
je l'ai eu moi-même :)
Temnovit
5

Vous avez un processeur qui a plus d'un cœur ou vous avez plusieurs processeurs. Si vous avez deux cœurs et qu'un processus utilise 100% des deux cœurs, il s'affichera comme 200% en haut.

De même, cela fonctionne probablement comme prévu - rien ne va mal avec votre configuration. Si vous rencontrez des blocages fréquents, d'après ce que vous avez publié, vous pouvez envisager d'ajouter des index appropriés à vos tables (ou d'optimiser vos requêtes).

Kyle Brantley
la source
5

Exécutez top -Hpour voir tous les threads en cours d'exécution et pas seulement le processus global. De plus, si vous appuyez sur la 1touche en haut, cela vous montrera l'utilisation du processeur pour les CPU / cœurs individuels.

Niall Donegan
la source
Merci, cela m'a vraiment aidé - j'utilise le top depuis des années et je ne savais pas qu'il avait cette capacité. J'ai trouvé qu'il y a un thread mysql "éternel" consommant 60% de CPU utilisateur tout le temps, tandis que les threads de requête vont et viennent en plus de cela. Maintenant, pour savoir ce que ce fil fait réellement ...
scipilot
1

Mysql a plusieurs processus (threads) fonctionnant indépendamment, l'un, par exemple, est responsable de l'écriture des données de la mémoire sur le disque. Avec plusieurs cœurs dans le processeur (et / ou plusieurs processeurs), plus d'un thread fonctionne, et il peut donc exécuter plus de 100% d'un seul cœur - à un niveau simpliste, peut-être 75% de chacun des deux cœurs sont en cours d'exécution , donnant 150%.

Alister Bulman
la source
1

J'ai remarqué un problème, non lié au 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 qu'en utilisant les 200 connexions disponibles (votre paramètre de connexion maximum), vous remplissez la RAM. Disons que vous avez limité apache à 150 processus, vous n'aurez certainement pas assez de RAM lorsque MySQL et apache essaieront d'utiliser 150 connexions (car Apache est également un bon mangeur de RAM).

Il s'agit donc de RAM et vous n'êtes peut-être pas encore touché :-) Les meilleures commandes ne montrent que 15 processus apache (mais vous êtes en moyenne de charge 3/6/16, ce qui signifie que la tempête s'est produite il y a 15 minutes et est maintenant dans en quittant).

À propos du problème de CPU, pour compléter la bonne réponse de shakalandy , cela peut être dû à une seule requête. Il peut être sur une grande table, ou faire beaucoup de tâches de réindexation, ou utiliser beaucoup de fichiers temporaires, un index manquant (supprimé?), Etc. La seule façon de le détecter est d'activer le journal des requêtes lentes (peut-être avec un seuil élevé, comme 8s). Utilisez ensuite l' outil mysqlsla pour analyser ce journal de requête lent et exécutez quelques explications sur les requêtes identifiées.

regilero
la source
Merci, en effet, mysql n'est pas le seul processus autour :)
Temnovit