Utilisation élevée du processeur MySQL [fermé]

191

Récemment, le processeur de mon serveur est devenu très élevé.

La charge du processeur est en moyenne de 13,91 (1 min) 11,72 (5 min) 8,01 (15 min) et mon site n'a eu qu'une légère augmentation du trafic.

Après avoir exécuté une commande supérieure, j'ai vu que MySQL utilisait 160% de CPU!

Récemment, j'ai optimisé des tables et je suis passé à des connexions persistantes. Cela pourrait-il amener MySQL à utiliser de grandes quantités de CPU?

Juddling
la source
4
Les connexions persistantes ne sont presque toujours pas la bonne chose à utiliser.
jason
Je vais les enlever maintenant et surveiller la différence car je ne me souviens jamais que le processeur était au-dessus de 2 il y a un mois!
Juddling
2
Les serveurs ont tendance à avoir plus d'un cœur. Le pourcentage d'utilisation du processeur est calculé par rapport à un cœur, autrement dit, un processus utilisant complètement deux cœurs aura une utilisation du processeur de 200%. Ici, MySQL utilise jusqu'à 100% d'un cœur et 60% d'un autre cœur. Cela ne signifie pas que tous les processeurs sont épuisés, il a probablement encore au moins deux processeurs libres.
xaav
Un processeur élevé signifie presque toujours des requêtes inefficaces. Ces problèmes sont généralement résolus via une meilleure indexation (en particulier «composite») et / ou une reformulation de la requête.
Rick James

Réponses:

265

Tout d'abord, je dirais que vous voulez probablement désactiver les connexions persistantes car elles font presque toujours plus de mal que de bien.

Deuxièmement, je dirais que vous voulez vérifier vos utilisateurs MySQL, juste pour vous assurer qu'il n'est pas possible pour quiconque de se connecter à partir d'un serveur distant. C'est également un élément de sécurité majeur à vérifier.

Troisièmement, je dirais que vous voulez activer le journal des requêtes lentes MySQL pour garder un œil sur les requêtes qui prennent beaucoup de temps, et l'utiliser pour vous assurer que vous n'avez aucune requête verrouillant les tables clés pendant trop longtemps.

D'autres choses que vous pouvez vérifier sont d'exécuter la requête suivante alors que la charge du processeur est élevée:

SHOW PROCESSLIST;

Cela vous montrera toutes les requêtes en cours d'exécution ou dans la file d'attente à exécuter, ce qu'est la requête et ce qu'elle fait (cette commande tronquera la requête si elle est trop longue, vous pouvez utiliser SHOW FULL PROCESSLIST pour voir le texte complet de la requête) .

Vous aurez également besoin de garder un oeil sur des choses comme la taille de vos tampons, cache de table , cache de requêtes et innodb_buffer_pool_size (si vous utilisez InnoDB tables) que toutes ces allocations de mémoire peut avoir une incidence sur les performances des requêtes qui peuvent causer MySQL manger du processeur.

Vous voudrez probablement aussi relire les éléments suivants car ils contiennent de bonnes informations.

C'est aussi une très bonne idée d'utiliser un profileur. Quelque chose que vous pouvez activer quand vous le souhaitez et qui vous montrera quelles requêtes votre application est en cours d'exécution, s'il y a des requêtes en double, combien de temps elles prennent, etc., etc. Un exemple de quelque chose comme celui-ci est celui sur lequel j'ai travaillé. PHP Profiler mais il y en a beaucoup là-bas. Si vous utilisez un logiciel comme Drupal, Joomla ou Wordpress, vous voudrez vous renseigner au sein de la communauté car il existe probablement des modules disponibles pour eux qui vous permettent d'obtenir ces informations sans avoir besoin d'intégrer manuellement quoi que ce soit.

Steven Surowiec
la source
12
merci beaucoup pour cela, j'ai supprimé les connexions persistantes, puis mis en place le journal des requêtes lentes. J'ai lu le journal et la plupart des requêtes provenaient de deux tables et les tables n'avaient pas été correctement indexées! cela ne fait que 10 minutes environ, mais voici le résultat: la charge du processeur est en moyenne de 0,48 (1 min) 0,95 (5 minutes) 2,42 (15 minutes) merci beaucoup
Juddling
même problème, résolu en indexant les tables qui ralentissent le processus, merci Steven et Juddling
gabrielem
@Juddling Pourriez-vous expliquer comment indexer un tableau s'il vous plaît? Peut-être un lien? Je sais que cela fait un moment, mais je suis vraiment nouveau dans ce domaine. Désolé fr la question noobish
JayVDiyk
La journalisation des requêtes lentes m'a aidé à trouver mon problème particulier d'utilisation élevée du processeur. Dans mon cas, c'était un plugin Wordpress (ultime-tag-cloud-widget) qui faisait une requête monstrueuse avec chaque hit juste pour montrer les balises populaires. C'est un excellent plugin, mais doit être amélioré avec une sorte de mise en cache (j'ai fini par le personnaliser pour résoudre mon problème).
jkincali
Une autre chose qui a aidé à résoudre un problème différent était la modification du paramètre innodb_buffer_pool_size mentionné ci-dessus. En essayant de trouver la cause de l'utilisation élevée du processeur, j'ai lu quelque part que innodb_buffer_pool_size devrait avoir au moins la taille du fichier ibdata1, qui se trouve dans / var / lib / mysql. Il semble qu'InnoDB fonctionne beaucoup plus efficacement lorsqu'il est capable de résider en mémoire. Cela peut être difficile à faire dans certaines situations car ibdata1 peut être énorme! Il a également été suggéré quelque part pour s'assurer que innodb_log_buffer_size correspond à 25% de la taille de innodb_buffer_pool_size.
jkincali
167

Comme il s'agit du meilleur article si vous recherchez une utilisation ou une charge élevée du processeur sur MySQL, j'ajouterai une réponse supplémentaire:

Le 1er juillet 2012, une seconde intercalaire a été ajoutée à l'heure UTC actuelle pour compenser le ralentissement de la rotation de la Terre dû aux marées. Lors de l'exécution de ntp (ou ntpd), cette seconde a été ajoutée à l'horloge de votre ordinateur / serveur. MySQLd ne semble pas aimer cette seconde supplémentaire sur certains systèmes d'exploitation et génère une charge CPU élevée. La solution rapide est (en tant que root):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start
RedPixel
la source
22
Étant donné que le message original date d'il y a environ 3 ans, je doute que ce soit la cause du problème de l'affiche originale. Mais c'était la cause de mon problème et cela m'a sauvé tout à l'heure - alors merci! Plus d'infos: blog.mozilla.org/it/2012/06/30/…
Russell G
5
Même problème et solution pour moi sur Ubuntu 12.04. Les étapes pour résoudre légèrement différentes: service ntp stop && date -s " date" && service ntp start L'utilisation du processeur MySQL a instantanément chuté de 50 à 100% à 0 à 1%
David Laing
2
Cela peut-il être exécuté uniquement pour être sûr? Je veux dire, est-il sûr de l'exécuter même si ce n'est pas la raison?
Muhammad Gelbana
2
1er juillet 2015 - Je viens de rencontrer ce deuxième bogue très important sur un serveur AWS EC2 actuel exécutant Amazon Linux. Utilisez sudo service ntpd stopsur cette configuration.
Matt van Andel
1
+1 pour cette solution. MySQL fonctionnait à 50-60% pendant des mois sans raison, après avoir appliqué cette solution, il est tombé à 0,0-0,3%, ce qui était censé être. Merci beaucoup.
zeeshan
32

Si ce serveur est visible du monde extérieur, cela vaut la peine de vérifier s'il a beaucoup de demandes de connexion du monde extérieur (c'est-à-dire des personnes essayant de s'y introduire)

Rowland Shaw
la source
1
Je ne sais pas pourquoi cela a attiré un vote défavorable anonyme, étant donné que cela a été une cause dans le passé pour certains systèmes.
Rowland Shaw
2
Je pense que le vote défavorable est dû au fait que MySQL est visible par le monde extérieur n'est pas une bonne idée.
MikeKulls
9
@MikeKulls Non, ce n'est pas une bonne idée, car cela servira de cible pour que beaucoup de gens essaient d'entrer, ce qui donnera une charge CPU élevée - d'où ma réponse comme une raison possible.
Rowland Shaw
16
Je déteste quand quelqu'un vient de voter contre et c'est parti!
Muhammad Gelbana
1
+1 parce que c'est une raison absolument légitime pour MySQL d'avoir une utilisation élevée du processeur, et quiconque pour qui c'est la réponse a vraiment besoin de cette information!
Chris Browne