2009-08-15 6 views
157

Récemment, le processeur de mon serveur a été très élevé.Utilisation élevée du processeur MySQL

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 connu qu'une légère augmentation de la circulation. Après avoir exécuté une commande du haut, j'ai vu que MySQL utilisait 160% de CPU!

Récemment, j'ai optimisé des tables et j'ai basculé vers des connexions persistantes. Cela pourrait-il obliger MySQL à utiliser de grandes quantités de CPU?

+4

Les connexions persistantes ne sont pas toujours la bonne chose à utiliser. – jason

+0

Je vais les enlever maintenant et regarder pour une différence parce que je ne me souviens jamais du cpu étant au-dessus de 2 il ya un mois! – Juddling

+2

Les serveurs ont tendance à avoir plus d'un noyau. Le pourcentage d'utilisation du processeur est calculé par rapport à un cœur, autrement dit, un processus utilisant jusqu'à deux cœurs aura une utilisation du processeur de 200%. Ici, MySQL utilise 100% d'un core et 60% d'un autre core. Cela ne signifie pas que tous les processeurs sont épuisés, il a probablement au moins deux processeurs libres. – xaav

Répondre

211

D'abord, je dirais que vous voudrez probablement pour 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 que personne ne peut se connecter à partir d'un serveur distant. C'est aussi une chose de sécurité majeure à vérifier. Troisièmement, je dirais que vous voulez activer le MySQL Slow Query Log pour garder un œil sur toutes les requêtes qui prennent beaucoup de temps, et utilisez-le pour vous assurer que vous n'avez pas de requêtes bloquant les tables de clés pour trop longue.

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

SHOW PROCESSLIST; 

Cela vous montrera toutes les questions qui sont en cours d'exécution ou dans la file d'attente pour exécuter, ce que le La requête est 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 voulez aussi garder un oeil sur des choses comme la taille de vos tampons, table cache, query cache et innodb_buffer_pool_size (si vous utilisez des tables InnoDB) que toutes ces allocations de mémoire peut avoir une incidence sur les performances des requêtes qui peuvent causer MySQL à manger CPU.

Vous aurez également probablement envie de donner une lecture de ce qui suit, car ils contiennent de bonnes informations.

Il est aussi une très bonne idée d'utiliser un profileur. Quelque chose que vous pouvez activer quand vous voulez cela vous montrera quelles requêtes votre application exécute, s'il y a des requêtes en double, combien de temps ils prennent, etc., etc. Un exemple de quelque chose comme ceci est celui que j'ai travaillé appelé PHP Profiler mais il y en a beaucoup là-bas. Si vous utilisez un logiciel comme Drupal, Joomla ou Wordpress, vous aurez besoin de demander au sein de la communauté car il y a probablement des modules disponibles pour eux qui vous permettent d'obtenir cette information sans avoir besoin d'intégrer quoi que ce soit manuellement.

+10

merci beaucoup pour cela, j'ai supprimé les connexions persistantes et ensuite mis en place le journal de requête lente. J'ai lu le journal et la plupart des requêtes provenaient de deux tables et les tables n'avaient pas été indexées correctement! il fait seulement environ 10 minutes, mais voici le résultat: moyennes de charge CPU 0,48 (1 min) 0,95 (5 minutes) 2,42 (15 minutes) merci beaucoup – Juddling

+0

même problème, résolu par l'indexation des tables qui ralentissent le processus, merci Steven et Juddling – gabrielem

+0

@Juddling Pourriez-vous élaborer sur la façon d'indexer une table s'il vous plaît? Peut-être un lien? Je sais que cela fait longtemps, mais je suis vraiment nouveau dans ce domaine. Désolé pour la question noobish – JayVDiyk

21

Si ce serveur est visible au monde extérieur, il vaut la peine de vérifier si elle est d'avoir beaucoup de demandes de connecter du monde extérieur (personnes essayant de briser en elle)

+0

Je ne sais pas pourquoi cela a attiré un downvote anonyme, étant donné que cela a été une cause dans le passé pour certains systèmes. –

+0

Je pense que le vote baissier est parce que MySQL visible par le monde extérieur n'est pas une bonne idée. – MikeKulls

+6

@MikeKulls Non, ce n'est pas une bonne idée, car cela servira de cible à beaucoup de gens pour essayer d'entrer, ce qui donnera une charge CPU élevée - d'où ma réponse comme une raison possible. –

157

Comme il est le poste le plus élevé si vous Google pour MySQL haute utilisation ou la charge CPU, je vais ajouter une réponse supplémentaire:

Le 1er Juillet 2012, un deuxième saut a été ajouté au cours UTC- temps pour compenser le ralentissement de la rotation de la terre dû aux marées.Lorsque vous exécutez 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. Le correctif rapide est (en tant que root):

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

Depuis 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 m'a sauvé tout à l'heure - alors merci! Plus d'infos: http://blog.mozilla.org/it/2012/06/30/mysql-and-the-leap-second-high-cpu-and-the-fix/ –

+5

Même problème et solution pour moi sur Ubuntu 12.04. Étapes à résoudre légèrement différent: service ntp stop && date -s "' date' "&& service ntp démarrer L'utilisation du processeur MySQL a instantanément chuté de 50 - 100% à 0 - 1% –

+0

yup qui l'a fait sur Amazon EC2 linux AMI De même, remplacez «service ntpd stop/start» par le truc init.d. –