23 juillet 2008

Kill automatique des processus à l'état "sleep"

Quand votre base de données MySQL est lente, une des raisons est qu'elle a trop de processus "dormants" à l'état de "sleep". Cela est visible quand vous lancez la commande "show processlist".

mysql> show processlist;
+---------+--------+-----------------+--------+---------+------+-------+------------------+
| Id      | User   | Host            | db     | Command | Time | State | Info             |
+---------+--------+-----------------+--------+---------+------+-------+------------------+
| 1313203 | ZABBIX | localhost       | zabbix | Sleep   |    3 |       | NULL             |
| 1313205 | ZABBIX | localhost       | zabbix | Sleep   |    1 |       | NULL             |
| 1313206 | ZABBIX | localhost       | zabbix | Sleep   |    2 |       | NULL             |
| 1313207 | ZABBIX | localhost       | zabbix | Sleep   |    2 |       | NULL             |
| 1313209 | ZABBIX | localhost       | zabbix | Sleep   |    5 |       | NULL             |
| 1313210 | ZABBIX | localhost       | zabbix | Sleep   |    4 |       | NULL             |
| 1313212 | ZABBIX | localhost       | zabbix | Sleep   |    3 |       | NULL             |
| 1313214 | ZABBIX | localhost       | zabbix | Sleep   |    9 |       | NULL             |
| 1313227 | ZABBIX | localhost       | zabbix | Sleep   |    8 |       | NULL             |
| 1313228 | ZABBIX | localhost:***** | zabbix | Query   |    0 | NULL  | show processlist |
+---------+--------+-----------------+--------+---------+------+-------+------------------+
10 rows in set (0.00 sec)

Pour pouvoir supprimer ces processus latents, il faut utiliser la commande kill + numéro du processus :

exemple : kill 1313228

Cette opération est à répéter pour chaque processus, vous imaginez donc la perte de temps !

Sur ce blog, j'ai trouvé une manière beaucoup plus simple pour supprimer automatiquement ces processus.

for PID in `mysql -u user -ppass -e "show processlist" | grep Sleep | cut -f1`
do
mysql -u user -ppass -e "kill $PID"
done

N'oubliez pas de remplacer ce qui est en italique (user et pass) par vos propres données.

A vous ensuite d'en faire un script ksh par exemple et de le mettre dans le crontab. Ainsi vous pourrez lancer cette opération toutes les nuits.

Posté par fatihaelh à 11:27 - MySQL - Commentaires [5] - Permalien [#]

Commentaires

    Great

    Milles merci !

    Posté par june, 14 mars 2010
  • Processus sleep

    Bonjour,

    Il arrive que mon serveur sit saturé de processus en sleep. Comment savoir quel script php reste connecté ?

    merci

    Posté par Julien, 08 octobre 2010
  • la commande lsof

    Essaies d'utiliser la commande lsof en mettant les bons paramètres tu pourras savoir quel script php continue à se connecter à la base de données.

    Posté par fatiha, 08 octobre 2010
  • lsof

    Merci de ta réponse,

    j'ai entre temps trouvé ca :
    lsof | grep apache2 | grep socket qui me donne le PID des process apache qui sont connecté
    ensuite deux solutions :
    - on configure server-status
    - on rajoute le PID dans le log apache avec %P

    et on fais le lien, reste plus à attendre que le probléme revienne.

    Si j'ai le temps je mettrai une solution complète sur mon blog.

    Posté par Julien, 08 octobre 2010
  • Alors ?

    Alors est-ce que ton erreur est revenue, as-tu pu tester ?

    Posté par Fatiha, 09 octobre 2010

Poster un commentaire