Trop de processus MySQL

12

J'essaie d'aider un ami avec son serveur après qu'il m'ait dit que MySQL utilisait trop de mémoire ... Il s'avère qu'il n'utilise pas seulement beaucoup de mémoire, mais qu'il y a beaucoup trop de processus mysql en cours d'exécution!

Voici le résultat de ps auxww|grep mysql: http://pastebin.com/kYrHLXVW

Donc, fondamentalement, il y a 13 processus MySQL, et il n'y a qu'un seul client connecté selon mysqladmin ...

Après un certain temps, chacun de ces processus consomme jusqu'à 50 Mo de mémoire, il finit par consommer BEAUCOUP de mémoire ...

J'utilise le modèle de configuration my-medium.cnf directement depuis / usr / share / mysql ... J'ai redémarré le serveur mysql mais, dès qu'il démarre, les 13 processus sont de retour ... Je n'ai aucune idée de ce que le le problème pourrait être ... toutes les idées / suggestions seraient vraiment appréciées!

user24994
la source

Réponses:

16
mysql     9804  0.0  0.6 58556 22960 pts/0   S    12:43   0:00  \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9807  0.0  0.6 58556 22960 pts/0   S    12:43   0:00      \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9808  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9809  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9810  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
[ ... repeated output truncated ... ]

Ils n'utilisent pas 13 * 50 Mo de RAM - Ils utilisent probablement quelque chose comme 70 Mo au total . N'oubliez pas que Linux partagera des pages de mémoire non modifiées entre les processus, donc si votre serveur est fraîchement démarré, la majeure partie de cette mémoire sera partagée. En fait, puisque mysql est threadé, il y aura probablement encore moins de mémoire allouée par thread. Si vous êtes préoccupé par l'utilisation de la mémoire de chaque processus mysql, regardez /etc/mysql/my.cnfet regardez les variables dans la section mysqld:

  • key_buffers
  • thread_stack
  • thread_cache_size
  • max_connections
  • query_cache_limit
  • query_cache_size

Soyez averti cependant, que ce sont des variables très puissantes à régler, et vous pouvez facilement tuer vos performances mysql en les réglant trop bas, ou gaspiller de la mémoire qui pourrait être utilisée ailleurs en les réglant trop haut.

Un point de départ facile pour déterminer la meilleure façon de régler votre instance mysql est d'exécuter votre application pendant un petit moment, puis d'exécuter le script mysqltune à partir d' ici , qui analysera vos compteurs de performances, puis produira une recommandation sur ce que vous devez modifier dans la configuration de votre serveur.

Jason
la source
1
Je ne savais pas mysqltune, merci très utile. En outre, on peut utiliser htoppour colorer nos threads et voir la mémoire réelle utilisée par processus.
mveroone
3

Linux affiche les threads comme des processus séparés. MySQL démarre un thread par connexion. Courir psavec f. Par exemple, ps auxfwaffichera la relation entre les threads.

Combien de connexions existe-t-il avec MySQL? Exécutez show full processlist;dans le client MySQL. D'après ce que vous montrez, je ne suis même pas sûr qu'il y ait quelque chose de mal.

Warner
la source
Voici le résultat: pastebin.com/raw.php?i=XNCsG6KS Le serveur vient d'être démarré Je ne sais pas si cela aide ... Par scripts init, voulez-vous dire le contenu de /etc/init.d/mysql?
user24994
Cela me semble parfaitement normal.
Warner
Selon show full processlistil y a 2 connexions à la base de données. L'un d'eux étant localhost en cours d'exécution show full processlist, l'autre est aussi moi, via phpmyadmin. Il ne devrait plus y avoir de connexion car le site n'est pas encore en ligne ...
user24994
Le nombre de connexions dépendra des performances de votre application et ne sera pas nécessairement directement lié à la quantité d'utilisateurs. MySQL utilise de la mémoire basée sur le paramètre cnf. Qu'est-ce qui vous fait penser que quelque chose ne va pas?
Warner
Désolé, je suppose que ce n'était pas vraiment clair dans ma question haha, il est tout à fait possible qu'il n'y ait rien de mal à se passer! Je viens de remarquer que mysql utilisait beaucoup de mémoire (environ 13 * 50 Mo, donc 650 Mo de RAM) et qu'il n'y a pas encore de trafic vers le site ... Juste moi déconner en phpmyadmin. Donc je suppose que ma question était plus "Y a-t-il quelque chose qui ne va pas?" au lieu de "Qu'est-ce qui ne va pas" :)
user24994
1

Vous voudrez peut-être essayer MySQLTuner que j'ai trouvé très utile, il vous suggérera laquelle des variables de configuration vous devriez essayer d'ajuster.

icc97
la source
Pour les nouveaux lecteurs, le script MySQLTuner est placé ici: mysqltuner.pl
Jesper Grann Laursen