Page 1 sur 2

Thread MySQL

Posté : 05 juin 2006, 10:35
par Ov6rMinD
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

Posté : 05 juin 2006, 10:46
par zeus
modération : ce sujet traite plus de MySql que de PHP
:arrow: sujet déplacé ;)

Posté : 05 juin 2006, 10:49
par Vorkosigan
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

Posté : 05 juin 2006, 11:16
par Ov6rMinD
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

Posté : 05 juin 2006, 11:34
par Vorkosigan
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

Posté : 05 juin 2006, 11:34
par Ov6rMinD
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

Posté : 05 juin 2006, 11:37
par Ov6rMinD
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 !

Posté : 05 juin 2006, 11:39
par Vorkosigan
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

Posté : 05 juin 2006, 11:41
par Ov6rMinD
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 ?

Posté : 05 juin 2006, 11:46
par Vorkosigan
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.

Posté : 05 juin 2006, 11:49
par Ov6rMinD
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.

Posté : 05 juin 2006, 12:24
par Vorkosigan
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.

Posté : 05 juin 2006, 12:29
par Ov6rMinD
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 !

Posté : 05 juin 2006, 12:42
par Vorkosigan
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.

Posté : 05 juin 2006, 12:51
par Ov6rMinD
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 ?