Thread MySQL

Ov6rMinD
Invité n'ayant pas de compte PHPfrance

05 juin 2006, 10:35

Bonjour,

J'ai relevé le SHOW STATUS de ma base mysql car j'avais l'erreur "Too Many Connexion"....

J'ai, en particulier ces caractéristiques là :
Threads_cached 0
Threads_connected 96
Threads_created 377132
Threads_running 1
Uptime 3702161
Est-ce normal ?

Merci,

JMD

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 juin 2006, 10:46

modération : ce sujet traite plus de MySql que de PHP
:arrow: sujet déplacé ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 140 Messages

05 juin 2006, 10:49

Deja ca n'est pas forcemment le bon forum (il faudrait le deplacer dans une autre categorie).

Ensuite, pour repondre a ta question... ca depend. :wink: Le point qui me gene un peu c'est d'avoir 96 threads connectes et un seul qui marche. En pratique, selon l'utilisation que tu fais de la base MySQL et selon ton style de visiteurs, cela peut s'expliquer.

Enfin pour finir chez moi (principalement un forum phpBB) j'ai :
Threads_cached 0
Threads_connected 3
Threads_created 518649
Threads_running 2
Uptime 780843

Petit nouveau ! | 9 Messages

05 juin 2006, 11:16

OK pour le déplacement, je suis désolé je n'avais pas vu la rubrique...

Ce qui est bisare, c'est que dès que je réactualise mes stats, Threads_connected augmente, mais pas forcément de 1. C'est comme si ça augmentait en boucle, et dès que Threads_connected atteind 100, erreur Too many connections et finalement au bout de quelques mnutes, ça repart avec une valeur de Threads_connected basse...
Actuellement :
Threads_cached 0
Threads_connected 51
Threads_created 377440
Threads_running 1
Webmaster du site http://www.pcreation.fr

Eléphant du PHP | 140 Messages

05 juin 2006, 11:34

Ce qui est bisare, c'est que dès que je réactualise mes stats, Threads_connected augmente, mais pas forcément de 1. C'est comme si ça augmentait en boucle, et dès que Threads_connected atteind 100, erreur Too many connections et finalement au bout de quelques mnutes, ça repart avec une valeur de Threads_connected basse...
Sans savoir comment toi et tes visiteurs utilisez ta base, il est difficile de savoir s'il s'agit d'un probleme ou non. Meme si a priori oui. :wink:

On peut quand meme supposer que :
- tu ouvres des connexions a la base mais que tu ne les refermes pas apres avoir fini de les utiliser => d'ou la hausse
- au bout de plusieurs minutes, tu as un timeout sur les connexions ouvertes qui fait que cela baisse

Petit nouveau ! | 9 Messages

05 juin 2006, 11:34

Ce qui est aussi bisare, c'est la réponse de SHOW PROCESSLIST :
377752 pcreation localhost table1 Sleep 4 NULL
377753 pcreation localhost table2 Query 0 NULL show processlist
Webmaster du site http://www.pcreation.fr

Petit nouveau ! | 9 Messages

05 juin 2006, 11:37

Sans savoir comment toi et tes visiteurs utilisez ta base, il est difficile de savoir s'il s'agit d'un probleme ou non. Meme si a priori oui. :wink:

On peut quand meme supposer que :
- tu ouvres des connexions a la base mais que tu ne les refermes pas apres avoir fini de les utiliser => d'ou la hausse
- au bout de plusieurs minutes, tu as un timeout sur les connexions ouvertes qui fait que cela baisse
Mais alors j'aurais le même problème en local, non ? Car ce n'est pas le cas !
Webmaster du site http://www.pcreation.fr

Eléphant du PHP | 140 Messages

05 juin 2006, 11:39

Ce qui est aussi bisare, c'est la réponse de SHOW PROCESSLIST :
377752 pcreation localhost table1 Sleep 4 NULL
377753 pcreation localhost table2 Query 0 NULL show processlist
Non, ce n'est pas specialement bizarre :
- tu as un process en attente de requete
- un qui vient d'executer ta requete

Petit nouveau ! | 9 Messages

05 juin 2006, 11:41

Non, ce n'est pas specialement bizarre :
- tu as un process en attente de requete
- un qui vient d'executer ta requete
Mais je ne devrais pas en avoir plus si j'ai un Threads_connected à plus de 60 ?
Webmaster du site http://www.pcreation.fr

Eléphant du PHP | 140 Messages

05 juin 2006, 11:46

Non, ce n'est pas specialement bizarre :
- tu as un process en attente de requete
- un qui vient d'executer ta requete
Mais je ne devrais pas en avoir plus si j'ai un Threads_connected à plus de 60 ?
Non, tu fais une confusion entre threads/connexions et processes.

Petit nouveau ! | 9 Messages

05 juin 2006, 11:49

Peux-tu me faire un léger exposé ? ^^

Comment éviter les multiples Threads ?
mysql_close() ne s'applique qu'aux connexions, c'est ça ?
Et qu'est-ce que les process ?

Merci ^^

JMD
EDIT : Encore une question.... je viens de mettre un htaccess sur le serveur pour que seule la page de monitoring soit accessible, les autres URL sont renvoyées sur un autre site. Je ne devrai avoir qu'un Thread, non ? Ce n'est pas le cas.... cela bouge pas mal.
Webmaster du site http://www.pcreation.fr

Eléphant du PHP | 140 Messages

05 juin 2006, 12:24

Peux-tu me faire un léger exposé ? ^^
Comment éviter les multiples Threads ?
mysql_close() ne s'applique qu'aux connexions, c'est ça ?
Et qu'est-ce que les process ?
A vrai dire, le mieux c'est quand meme de lire la doc MySQL.

Neanmoins voici un bref apercu de la chose....
Par defaut, MySQL n'a qu'un seul process qui tourne reserve a l'admin. Si un client se connecte et n'a pas les droits d'admins, une deuxieme connexion est creee.
A chaque fois que dans ton code PHP tu ouvres une connexion vers MySQL, un thread est créé sur ce 2eme process. Donc si tu as 50 clients qui essaient d'afficher une page a un moment donné, tu auras 50 threads ouverts.
Si tu ne fermes pas tes connexions dans ton code (entres autres), tes threads et tes connexions resteront actifs...
je viens de mettre un htaccess sur le serveur pour que seule la page de monitoring soit accessible, les autres URL sont renvoyées sur un autre site. Je ne devrai avoir qu'un Thread, non ? Ce n'est pas le cas.... cela bouge pas mal.
Non, pas forcemment. Si 10 personnes sont connectes a la page de monitoring tu auras 10 threads...
Et si tu ne fermes pas tes connexions dans ton code, tu pourras en avoir des dizaines...

Enfin plutot que d'essayer de comprendre, tu devrais expliquer ce que tu fais... et SURTOUT verifier que tu fermes bien tes connexions dans ton code PHP.

Petit nouveau ! | 9 Messages

05 juin 2006, 12:29

Merci,
Actuellement, je suis en train de réécrire mon code (très long) pour fermer tous les accès à la base de données.

Mais je ne comprend toujours pas comment cela se fait que :
Threads_connected 53
alors que je suis le seul à connaître la page de monitoring et que AUCUNE autre page du site n'est accessible. Et bien sûr le taux de Threads_connected augmente encore... et la connexion est fermée à la fin de la page de monitoring...
Et en localhost, tout est OK ! Threads_connected = 1 !!! Quelque soit mes actions !
Webmaster du site http://www.pcreation.fr

Eléphant du PHP | 140 Messages

05 juin 2006, 12:42

Mais je ne comprend toujours pas comment cela se fait que :
Threads_connected 53
alors que je suis le seul à connaître la page de monitoring et que AUCUNE autre page du site n'est accessible. Et bien sûr le taux de Threads_connected augmente encore... et la connexion est fermée à la fin de la page de monitoring...
Et en localhost, tout est OK ! Threads_connected = 1 !!! Quelque soit mes actions !
C'est tout simplement parce que dans ta page de monitoring tu ouvres des connexions que tu ne fermes pas... et a chaque "refresh", tu ouvres de nouvelles connexions. Ca se cumule.
En localhost, tu dois certainement etre connecte en Admin, j'imagine, ou bien tes timeouts sont plus courts.

Petit nouveau ! | 9 Messages

05 juin 2006, 12:51

Script pêché sur le net :
<html><head><title>Moniteur MYSQL</title>
<style>table{font-family:verdana;font-size:8pt}</style>
</head><body>
<center><table border="0" cellspacing="0" cellpadding="0"><tr><td valign="top">
<table width="90%" border="1" cellspacing="0" cellpadding="0">
<?php
$link  = mysql_connect('localhost', 'pcreation', '3ph529ec');
$result = mysql_query('SHOW STATUS', $link);
$nb = 0;
while ($row = mysql_fetch_assoc($result)) {
  $nb = $nb+1;
  if (($nb == "29") || ($nb == "57") || ($nb == "85")) {
	echo "</table></td><td valign=top><table width=\"90%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">";
	echo '<tr><td>&nbsp;' . $row['Variable_name'] . '</td><td><b>&nbsp;' . $row['Value'] . "</td></tr>";
  } else {
	echo '<tr><td>&nbsp;' . $row['Variable_name'] . '</td><td><b>&nbsp;' . $row['Value'] . "</td></tr>";
  }
}
mysql_close($link);
?>
</table></td></tr></table></body></html> 
La connexion est fermée, non ?
Webmaster du site http://www.pcreation.fr